2013-10-01 37 views
4

我知道我們可以顯示一個模型的gridview,它是搜索方法和過濾結果,但我們可以使用另一個數據提供者和另一個模型這樣做一個gridview並篩選其結果?過濾器是否需要成爲數據提供者的一部分?yii CGridView數據提供者和過濾器

$attr = Yii::app()->request->getParam($name); 

$model = new User('search'); 
$model->unsetAttributes(); 
$model->setAttributes($attr); 

$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => $myDataProvider, 
'filter' => $model, 
'columns' => array(
    array(
     'name' => 'username', 
     'type' => 'raw', 
     'value' => 'CHtml::encode($data->username)' 
    ), 
    array(
     'name' => 'email', 
     'type' => 'raw', 
    ), 
), 

));

上述代碼不起作用,我需要在以前製作的數據提供程序上添加一個過濾器。

btw $attr有一個有效的數據,但網格不被過濾。

回答

3

$model不影響$myDataProvider,因爲未使用此模型獲取數據提供者。

$model->search()返回包含CDbCriteria實例的CActiveDataProvider。不同的CDbCriteria可以使用mergeWith()進行組合。所以,如果你想將數據使用來自$model

... 
$model->setAttributes($attr); 

$newDataProvider=$model->search(); 
$myDataProvider->criteria->mergeWith($newDataProvider->criteria); 

$this->widget('zii.widgets.grid.CGridView', array(
... 
+0

如果其中一個標準有一個「連接」屬性,另一個屬性是「有」屬性,你會遇到麻煩,對吧? – tinybyte

1

過濾器不需要是數據提供者的一部分,但數據提供者需要考慮模型,如果你想使用它進行過濾。

這是在默認情況下實現的方法是在你的模型,該模型將數據提供者的條件基礎上的模型值,像這樣創建使用search方法對數據提供:

'dataProvider' => $model->search() 

沒有什麼預防您創建不同的數據提供者,例如:

'dataProvider' => $model->createAnotherDataProvider() 

而用戶模式:

public function createAnotherDataProvider() { 
{ 
    // create your second data provider here 
    // with filtering based on model's attributes, e.g.: 

    $criteria = new CDbCriteria; 
    $criteria->compare('someAttribute', $this->someAttribute); 

    return new CActiveDataProvider('User', array(
     'criteria' => $criteria, 
    )); 
} 
+0

使用新的$標準其中的值進行過濾?(它不是在這種方法中使用!) – tinybyte

+0

啊,是我不好,我編輯的回答 –