Как сортировать пользовательские столбцы в виджетах GridView в Yii 2?

У меня есть пользовательский столбец в GridView. На самом деле это атрибут модели, но мне нужно было настроить его для представления данных более удобным способом. Как добавить способ сортировки этого столбца?

<?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterPosition'=> GridView::FILTER_POS_HEADER, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'username', 'about:ntext', 'birthdate', ['attribute'=>'sex', 'header'=>'Sex', 'content'=> function($model){ return $model->sex==0?'female':'male'; }, 'label'=>'Sex', 'enableSorting'=>TRUE ], 'email:email', ['class' => 'yii\grid\ActionColumn'], ], ]); ?> 

Вы потеряли ссылку на сортировку, потому что вы явно задали 'header'=>'Sex' в своей конфигурации столбца, удаляете ее и сортируете ссылку.

Предположим, вы используете ActiveDataProvider .

Даже когда вы используете настраиваемую функцию для отображения атрибута, сортировка выполняется по фактическому атрибуту, который хранится в БД.

Попробуйте создать набор страниц CRUD с помощью gii . Если вы все сделали правильно, ваш файл index.php в views будет содержать массив столбцов. Затем вы можете настроить столбец следующим образом:

  [ 'attribute' => 'myAttribute', 'value' => function ($data) { return 'example'.' '.$data->myAttribute; } ], 

Очевидно, что функция должна делать любые преобразования, которые вам нужны. Но сортировка будет производиться по фактическим данным, хранящимся в БД.

Для поиска секса легко установить фильтр. подобно

  [ 'attribute'=> 'sex', # if you didn't set attribute in model or want different text use label 'label' => 'Sex of person', # if you create it threw ModelSearch and there is attribute/field in one table gii will add automatically andFilterWhere method. 'filter' => ['0' => 'Female', '1' => 'Male'], ], 

Для более сложного поиска / сортировки здесь очень хорошая документация, связанная с учебником