如何在Yii 2中的GridView小部件中对自定义列进行排序?

时间:2015-06-20 16:57:45

标签: php yii yii2

我在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'],
    ],
]); ?>

3 个答案:

答案 0 :(得分:2)

您丢失了排序链接,因为您在列配置中明确设置了'header'=>'Sex',将其删除并显示排序链接。

答案 1 :(得分:0)

我假设您正在使用ActiveDataProvider

即使使用自定义函数显示属性,也会对存储在数据库中的实际属性进行排序。

尝试使用gii生成一组CRUD页面。如果您做的一切正确,index.php中的views文件将包含一系列列。然后您可以像这样配置列:

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

显然,该函数需要做任何你需要的转换。但是排序将在存储在DB中的实际数据上完成。

答案 2 :(得分:0)

为了搜索性爱,您可以轻松设置过滤器。像

   [
    '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'],
   ],

对于更复杂的搜索/排序,这里有与link to tutorial

相关的非常好的文档