Как сделать сортировку в 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.