в cgridview есть пустое поле для фильтрации данных над каждым столбцом, как я могу фильтровать данные в зависимости от критериев множественного сравнения, например, я могу поместить> 5 в это поле в столбце идентификатора, чтобы отфильтровать данные, чтобы они были только записями с идентификатором 6 и выше . Я хочу поставить что-то вроде> 5 и ‹ 10, как я могу это сделать
множественное сравнение в cgridview в yii
Ответы (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,
));
}
Если вы хотите иметь оба условия <
и >
в одном поле фильтра, вам решать, какой формат использовать и как его анализировать для подготовки критериев поиска.
В моем случае я использую этот код:
$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» (в этом случае важен символ пробела)