2016-05-20 4 views
0

別のモデルのリレーショナルフィールドに対してCGridViewでフィルタリングを機能させるのが難しいです。管理者 - CGridViewのリレーショナルモデルフィールドのフィルタリング

URL参照:Yiiの1.1:検索とCGridView

に関連するモデルによってソートが、私はコードを追跡し、それは私に他のモデルからの入力を返却しているようです。すべてがうまく見えますが、残念ながら、フィルタは機能していません。

検索では、クイックロードアイコンが表示されますが、それに応じてフィルタリングできませんでした。さらに確認すると、入力が間違っていることがわかりました。私はGoogle Inspect Elementを使用しており、次のことに気づいています:

<input name="User[full_name]" type="text"> 

私はBiodataに関連するユーザーモデルを使用しています。 Biodata [full_name]ではありませんか?これがあれば、コードをどこで調べるべきですか?

ありがとうございます。 :D

+1

あなた 'CGridView'コードを表示します。 – Justinas

+0

私はあなたの 'User'テーブルに' biodata_id'なんかがあると思いますか? – aslawin

答えて

0

フィルタリングとCGridViewウィジェットでソートはいくつかの手順で行うことができます

1.あなたのUserモデルに仮想フィールドを追加します。 CGridViewで列を作成するために使用されます。それはまた、適切なフィルタリングのために必要とソート:

class User extends CActiveRecord 
{ 
    public $bioFullName; 

    //... 
} 

2.あなたのUserモデルでsearch()機能を変更します。配列パラメータをこの関数に追加し、このメソッドのオブジェクトを$criteriaオブジェクトに関連モデルとの接続に追加する必要があります。関連する属性のソートを追加するには、返されたCActiveDataProviderも変更する必要があります。以下の何が起こるかを参照してください:

public function search($params = array()) // <-- new parameter that handling params for searching 
{ 
    $criteria = new CDbCriteria($param); 

    $criteria->with = array('biodata'); //add relation with Biodata to $criteria object 

    // ... existing $criteria conditions 

    $criteria->addSearchCondition('biodata.full_name', $this->bioFullName, true, 'AND'); // add comparison of biodata.full_name 

    return new CActiveDataProvider($this, array(
     'criteria'=>$criteria, 
     // ... 
     'sort'=>array(
      'attributes'=>array(
       'bioFullName'=>array(// <-- sorting of related field 
        'asc'=>'biodata.full_name ASC', 
        'desc'=>'biodata.full_name DESC', 
       ), 
       '*', 
      ), 
     ), 
    )); 
} 

3.関連列を表示するために、あなたのビューでCGridViewウィジェットを調整します。ウィジェット構成のcolumnsで配列モデル(bioFullName)から仮想フィールドのような名前の列を追加します。

<?php 

$this->widget('zii.widgets.grid.CGridView', array(
    // ... other widget configuration options 
    'columns'=>array(
     // ... other columns 
     'bioFullName'=>array(
      'name'=>'bioFullName', // <-- name of virtual model field 
      'value'=>'$data->biodata->full_name', // <-- getting field value from relation 
      'header'=>'Full name', // <-- CGridView column header 
     ), 

     // ... other columns 
    ), 
)); 

?> 
+0

こんにちはaslawin、私は無駄にあなたのソリューションを試してみました。まだフィルタリングされていません。 :( – Enthu

関連する問題