过滤Admin中的关系模型字段 - CGridView

时间:2016-05-20 07:23:39

标签: php yii

我很难让过滤在CGridView中用于其他模型的关系字段。

URL参考:Yii 1.1:在CGridView中按相关模型搜索和排序

我遵循代码,似乎是从其他模型返回我的输入。一切看起来都不错,但遗憾的是,过滤器无法正常工作。

在“搜索”中,它将显示快速加载图标,但无法相应地进行过滤。在进一步检查后,我注意到输入错误。我正在使用Google Inspect Element并注意到以下内容:

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

我正在使用与Biodata相关的用户模型。不应该是Biodata [full_name]?如果是这样,我应该在哪里查看代码?

谢谢。 :D

1 个答案:

答案 0 :(得分:0)

CGridView窗口小部件中的过滤和排序可以通过几个步骤完成:

<强> 1。将虚拟字段添加到User模型。它将用于在CGridView中创建列;它还需要适当的过滤和排序:

class User extends CActiveRecord
{
    public $bioFullName;

    //...
}

<强> 2。修改search()模型中的User函数。您需要在此函数中添加数组参数,并在此方法连接中将$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
    ),
));

?>