множественное сравнение в cgridview в yii

в cgridview есть пустое поле для фильтрации данных над каждым столбцом, как я могу фильтровать данные в зависимости от критериев множественного сравнения, например, я могу поместить> 5 в это поле в столбце идентификатора, чтобы отфильтровать данные, чтобы они были только записями с идентификатором 6 и выше . Я хочу поставить что-то вроде> 5 и ‹ 10, как я могу это сделать


person Jan Mohd    schedule 12.11.2013    source источник


Ответы (2)


Вы создаете $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 содержат значения, которые пользователь помещает в поля ввода фильтра 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,
    ));
}

Если вы хотите иметь оба условия < и > в одном поле фильтра, вам решать, какой формат использовать и как его анализировать для подготовки критериев поиска.

person ezze    schedule 13.11.2013

В моем случае я использую этот код:

    $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» (в этом случае важен символ пробела)

person Vilk    schedule 04.04.2014