Выпадающий список в качестве фильтра в CGridView

Скорее всего данная заметка не несет особой смысловой нагрузки, но столкнувшись с проблемой вставки в качестве фильтра в 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’),
comments powered by HyperComments
При копировании материалов обратная ссылка на play-stop.ru желательна обязательна!