Как сделать сортировку в Grid на фреймворке Yii? Как запретить сортировку по тем или иным колонкам? Как настроить сортировку таблицы по какому либо полю по умолчанию (или по дефолту)? С этими вопросами сталкиваются как новички так и опытные программисты, вобщем все кому приходилось работать с фреймворком Yii. На все выше перечисленные вопросы вы найдете ответ в этом посте.
На самом деле все делается очень просто, как вы знаете в CGridView передается CActiveDataProvider который определяется прям во вьюхе, либо в модели. В любом случае нам лишь нужно передать необходимый параметр sort.
В своем примере я покажу это на примере таблицы Banners. В методе search зададим список колонок по которым разрешена сортировка, для этого тоже имеется несколько способов:
1. Указать массив названий колонок по которым разрешена сортировка:
$dataProvider = new CActiveDataProvider('Banners', array(
'sort'=>array('attributes'=>array('id','name')), // названия колонок по которым разрешена сортировка
));
2. С помощью класса CSort, с помощью которого мы так же можем указать сортировку в связанных таблицах (в моем случае page.title). Так же обратите внимание что с помощью ключа defaultOrder можно задать параметры сортировки по умолчанию.
$sort = new CSort();
$sort->attributes = array(
'defaultOrder'=>'t.date DESC',
'id'=>array(
'asc'=>'t.id',
'desc'=>'t.id DESC',
),
'name'=>array(
'asc'=>'t.name',
'desc'=>'t.name DESC',
),
'pageTitle'=>array(
'asc'=>'page.title',
'desc'=>'page.title desc',
),
);
return new CActiveDataProvider('Banners', array(
'criteria'=>$criteria,
'sort'=>$sort
));
В CGridView нам остается лишь передать объект класса CActiveDataProvider, и все отлично заработает.
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'articles-grid',
'dataProvider' => $model->search(),
'columns' => $columns,
));
Вот таким не хитрым способом настраивается сортировка в CGridView в замечательном фреймворке Yii.