Скорее всего данная заметка не несет особой смысловой нагрузки, но столкнувшись с проблемой вставки в качестве фильтра в 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’),