yii CGridView数据提供者和过滤器

时间:2013-10-01 09:20:16

标签: 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',
    ),
),

));

以上代码不起作用,我需要在以前制作的数据提供程序上添加过滤器。

顺便说一句$attr有一个有效的数据,但不会过滤网格。

2 个答案:

答案 0 :(得分:3)

$model不会影响$myDataProvider,因为未使用此模型获取数据提供者。

$model->search()返回CActiveDataProvider,其中包含CDbCriteria个实例。可以使用mergeWith()组合不同的CDbCriteria。因此,如果您希望使用$model

中的值过滤数据
...
$model->setAttributes($attr);

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

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

答案 1 :(得分: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,
    ));
}