【发布时间】:2013-11-12 17:14:18
【问题描述】:
在 cgridview 中有一个空白字段来过滤每列上方的数据我如何根据多重比较条件过滤数据例如我可以在 ID 列的此字段中放置 >5 以过滤数据为仅来自 id 的记录6 及以上。 我想输入 >5 和
【问题讨论】:
在 cgridview 中有一个空白字段来过滤每列上方的数据我如何根据多重比较条件过滤数据例如我可以在 ID 列的此字段中放置 >5 以过滤数据为仅来自 id 的记录6 及以上。 我想输入 >5 和
【问题讨论】:
您创建YourModel 的$filter 实例并实现自定义search() 方法,如显示的here:
控制器:
public function actionIndex() {
$filter = new YourModel('search');
$filter->unsetAttributes();
if (isset($_GET['YourModel']))
$filter->attributes = $_GET['YourModel'];
$this->render('yourview', array(
'filter' => $filter,
));
}
查看:
<?php $this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => $filter->search(),
'filter' => $filter
...
));
因此,$filter 模型的属性包含用户在CGridView 的过滤器输入字段中输入的值,其search() 方法可以以任何方式解析和使用这些值来创建所需的CDbCriteria,然后返回过滤CActiveDataProvider。
我没有对其进行测试,但要过滤您模型的某些属性field,可以编写如下内容:
public function search()
{
$criteria = new CDbCriteria();
$matches = array();
if (preg_match('/^(<|>)(.+)$/', $this->field, $matches))
{
$criteria->addCondition('field ' . $matches[1] . ' :field');
$criteria->params[':field'] = $matches[2];
}
else
{
$criteria->addCondition('field = :field');
$criteria->params[':field'] = $this->field;
}
// TODO: add conditions for other fields
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
));
}
如果您想在一个过滤器字段中同时包含 < 和 > 条件,则由您决定使用哪种格式以及如何解析它以准备搜索条件。
【讨论】:
就我而言,我使用以下代码:
$matches=array();
if(preg_match('/(.+)(\s)(.+)/',$this->field,$matches)) {
$criteria->addCondition("field ".$matches[1]." and field ".$matches[3]);
} else {
$criteria->compare('field',$this->field);
}
在 cgridview 的过滤器输入中,我可以使用“50”(在这种情况下空格字符很重要)
【讨论】: