У меня есть пользовательский столбец в 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'], ],
Для более сложного поиска / сортировки здесь очень хорошая документация, связанная с учебником