3

私は yii にかなり慣れていないので、次の問題にぶつかりました。次の構造を持つ 2 つの関連テーブルClientTicketProductがあります。

クライアントチケット

  • ID
  • チケット名
  • クライアントID
  • 製品番号

製品

  • ID
  • タイプ
  • モデル
  • ブランド

2 つのテーブルは、ClientTicket.product_id を Product.id にバインドする外部キーによって関連付けられています。

問題

ClientTicket の管理ビューで、2 つの製品列 (ブランド、モデル) を含め、それぞれの検索ボックスを表示することができましたが、フィルタリングが期待どおりに機能していません。例: 2 つの検索ボックス (ブランド、モデル) のいずれかで検索すると、入力したのと同じ値がもう一方のボックスに自動的に入力されます (したがって、検索結果はありません)。

ClientTicket モデル:

    public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'product' => array(self::BELONGS_TO, 'Product', 'product_id'),
        ........
    );
}

    public function search()
{
    // Warning: Please modify the following code to remove attributes that
    // should not be searched.

    $criteria=new CDbCriteria;

    ...
    $criteria->compare('product.model',$this->product_id, true);
    $criteria->compare('product.brand',$this->product_id, true);
    ...

    $criteria->with=array(..., 'product',);
    $criteria->together= true;

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'pagination' => array('pageSize' => 10),
    ));
}

ClientTicket 管理ビュー ファイル:

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'client-ticket-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
    'ticket_number',
    'ticket_date',
    array('name'=>'agent_id',
        'header'=> 'Agent',
        'value'=> '$data->ticket_agent->name',
        'filter'=>CHtml::listData(Agent::model()->findAll(), 'name', 'name'),
        ),
    ...
    array('name'=>'product_id',
        'header'=> 'Product',
        'value'=> '$data->product->model',
        ),
    array('name'=>'product_id',
        'header'=> 'Brand',
        'value'=>'$data->product->brand'
        ),
4

2 に答える 2

0

他のユーザーの参考のために、これを機能させる方法を次に示します。繰り返しますが、迅速な対応に感謝します。:)

ClientTicket モデルの内部:

  • $brand という名前の新しいパブリック変数を宣言しました
  • rules()関数内の'safe' 'on'=>'search'配列に'brand'を追加
  • 次のようにsearch()関数内に新しい基準を追加しました:
    $criteria->compare('product.brand',$this->brand, true);

ClientTicket 管理ビュー ファイル:

これから製品ブランドの列を変更しました。

array('name'=>'product_id',
    'header'=> 'Brand',
    'value'=>'$data->product->brand'
    ),

これに:

 array('name'=>'product.brand',
    'header'=> 'Brand',
    'filter'=>CHtml::activeTextField($model,'brand'),
    ),
于 2013-10-23T20:29:24.390 に答える