
Делаем свою сортировку.
/models/EventSearch.php
public function search($params) { $query = Event::find(); // add conditions that should always apply here $dataProvider = new ActiveDataProvider([ 'query' => $query, 'pagination' => [ 'pageSize' => 20, ], ]); $dataProvider->setSort([ 'attributes' => [ //'when_date', 'whendateandtime'=>[ 'asc'=>['when_date'=>SORT_ASC, 'when_time'=>SORT_ASC], 'desc'=>['when_date'=>SORT_DESC, 'when_time'=>SORT_DESC], 'label'=>'Дата', //'default'=>SORT_DESC ], 'where', 'who', ], 'defaultOrder' => ['whendateandtime' => SORT_ASC] ]); ...
Здесь мы перечисляем в setSort только те атрибуты (читай колонки таблицы GridView), которые хотим сделать сортируемыми. Здесь есть одна интересность - атрибут 'whendateandtime'. Этого атрибута явно нет в таблице нашей базы данных. Он составной. У меня есть там поля when_date и when_time. То есть дата и время хранится в отдельных полях. Но в представлении я их формирую в единое поле "ДатаВремя" и хочу, чтобы сортировка работала по нему.
Теперь надо не забыть в модели Event прописать как составляется это поле:
public function getWhenDateandtime() { return $this->when_date . ' ' . $this->when_time; }
Ну и покажу кусок виджета, где это поле работает с сортировкой и фильтрацией:
<?= GridView::widget([ 'columns' => [ //['class' => 'yii\grid\SerialColumn'], [ 'attribute' => 'whendateandtime', 'filter'=>DatePicker::widget([ 'model' => $searchModel, 'attribute' => 'when_date', 'language' => 'ru', 'clientOptions' => [ 'autoclose' => true, 'format' => 'yyyy-mm-dd' ] ]), 'label' => 'Когда', 'headerOptions' => ['width' => '200'], 'format' => 'raw', 'value' => function($model){ if(($model->when_end) == NULL){ return Yii::$app->formatter->asDate($model->when_date, 'd MMMM yyyy (E)')." ".Yii::$app->formatter->asDate($model->when_time, 'kk:mm');; } else { return Yii::$app->formatter->asDate($model->when_date, 'd MMM yyyy')." — ".Yii::$app->formatter->asDate($model->when_end, 'd MMM yyyy'); } }, ], ...
14 июля 2018, Программирование, веб-кодинг / Метки: GridView