Программирование, веб-кодинг

Yii2: Сортировка в GridView. Сортировка по составному полю

Yii2: Сортировка в GridView. Сортировка по составному полю

Делаем свою сортировку.

/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');
                        }
                    },
                ],
...