Скорее всего данная заметка не несет особой смысловой нагрузки, но столкнувшись с проблемой вставки в качестве фильтра в CGridView выпадающего списка на ее решение потребовалось довольно не мало времени, а оказалось все до безумия просто.
Имеем представление в который вставлен виджет:
$this->widget('zii.widgets.grid.CGridView', array(
'filter' => $model,
'dataProvider' => $model->search(),
'enablePagination' => true,
'ajaxUpdate' => false,
'hideHeader' => false,
'columns'=>$columns
),
));
и массив $columns с столбцами, которые выводим и хотим видеть в качестве фильтров
$columns = array('id','name',array(
'name'=>'list',
'value'=>function($data){return $data->list;}
'filter'=>Yii::app()->params['list']
)
Чудесное здесь в том что для организации фильтра в качестве выпадающего списка достаточно в filter передать двумерный массив в виде ключ => значение, где по ключу будет происходить сортировка, а значение вы будете видеть в качестве значений выпадающего списка, при этом пустое (начальное) значение вставится автоматически, то есть в
Yii::app()->params['list']
(конфиге приложения) у меня что-то вроде:
'params'=>array(
'paymentSystem'=>array(
'1'=>'Значение 1',
'2'=>'Значение 2'
),
),
Кстати есть еще один интересный момент в массиве $columns, а связан он с value, в качестве значения которой можно использовать анонимную функцию, в которую можно передать весь объект $data и использовать его по мере генерации таблицы.
Методы которые я пробовал для генерации Yii CGridView фильтра и которые тоже работают, но не так эффективно:
- Вставить в filter html
- Создать и вызвать свою функцию в модели, вида ‘filter’=>$model->test()
- Использовать связанный запрос вида ‘filter’=>CHtml::listData(List::model()->with(‘list’)->findAll(), ‘id’, ‘list.value’),