4

我知道我们可以显示一个带有模型的网格视图及其搜索方法并过滤结果,但是我们可以用另一个数据提供者和另一个这样的模型制作一个网格视图并过滤它的结果吗?过滤器是否需要成为数据提供者的一部分?

$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,有一个有效的数据,但网格没有被过滤。

4

2 回答 2

3

$model不影响$myDataProvider,因为数据提供者不是使用此模型获得的。

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

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

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

$this->widget('zii.widgets.grid.CGridView', array(
...
于 2013-10-01T11:48:29.750 回答
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,
    ));
}
于 2013-10-01T11:32:02.810 回答