1

在 cgridview 中有一个空白字段来过滤每一列上方的数据我如何过滤数据取决于多重比较条件例如我可以在 ID 列的该字段中放置 >5 以过滤数据仅来自 id 6 及以上的记录. 我想输入 >5 和 <10 之类的内容,我该怎么做

4

2 回答 2

0

您创建$filter实例YourModel并实现自定义search()方法,如下所示

控制器:

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模型的属性包含用户在过滤器输入字段中输入的值,CGridViewsearch()方法可以以任何方式解析和使用这些值来创建所需的 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,
    ));
}

如果您想在一个过滤器字段中同时包含<>条件,则由您决定使用哪种格式以及如何解析它以准备搜索条件。

于 2013-11-13T01:03:11.887 回答
0

就我而言,我使用以下代码:

    $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 的过滤器输入中,我可以使用“<100 >50”(在这种情况下空格字符很重要)

于 2014-04-04T19:00:30.273 回答