【问题标题】:yii CGridView dataprovider and filteryii CGridView 数据提供者和过滤器
【发布时间】:2013-10-07 09:21:13
【问题描述】:

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

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

【问题讨论】:

    标签: yii cgridview


    【解决方案1】:

    $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(
    ...
    

    【讨论】:

    • 如果其中一个条件有一个“join”属性,另一个有一个“with”属性,那你就有麻烦了,对吧?
    【解决方案2】:

    Filter 不需要是 dataprovider 的一部分,但是 data provider 需要考虑模型,如果你想使用它进行过滤。

    默认的做法是在模型上使用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,
        ));
    }
    

    【讨论】:

    • 新的$criteria在哪里使用?(这个方法中没有用到!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多