我很难让过滤在CGridView中用于其他模型的关系字段。
URL参考:Yii 1.1:在CGridView中按相关模型搜索和排序
我遵循代码,似乎是从其他模型返回我的输入。一切看起来都不错,但遗憾的是,过滤器无法正常工作。
在“搜索”中,它将显示快速加载图标,但无法相应地进行过滤。在进一步检查后,我注意到输入错误。我正在使用Google Inspect Element并注意到以下内容:
<input name="User[full_name]" type="text">
我正在使用与Biodata相关的用户模型。不应该是Biodata [full_name]?如果是这样,我应该在哪里查看代码?
谢谢。 :D
答案 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
),
));
?>