Yii2-GridView自定义数据列

本文同时收录于 超能小紫的Yii2学习笔记

用gii生成Model和CRUD之后,基本的增删查改和列表页都有了
但在很多时候,默认生成的列表所展示的 数据列 并不一定是我们想展示的

修改所展示的数据列

打开视图层目录,找到刚生成出来的index.php,阅读其代码
稍有常识的人都能看出, 控制数据列显示的就是GridView::widget方法的参数数组中的columns
它大概长这样:

'columns' => [
    ['class' => 'yii\grid\SerialColumn'],

    'id',
    'name',
    'status',
    // 其他字段...

    ['class' => 'yii\grid\ActionColumn'],
],

我们只要将其他字段解除屏蔽、屏蔽掉自己不想显示的字段就行了

显示关联字段

举个例子,我有个文章表Article,表里有个作者id author_id字段
这个字段跟作者表Author的主键id相关联
我希望在文章列表中显示作者的名称(name),要怎么做呢?

首先,给Article模型添加如下方法

public function getAuthor()
{
    return $this->hasOne(Author::className(), ['id'=>'author_id']);
}

如果你不知道这有什么用,请阅读 Yii2手册 内的 查询关联的数据 一节

然后,给columns数组添加一个成员author.name就行啦!就是这么方便!

自定义数据列内容

但是很多时候,光是控制显示哪些字段还是不够的
还是上面的例子,我有个文章表Article,表里有个状态Status字段,值0表示隐藏、1表示显示
但我总不能在列表里直接显示0和1啊,筛选搜索时也不能要求用户输入0和1啊,体验多不好
这时,我们就需要自定义数据列内容了

定义常量

首先打开文章模型层,添加两个常量

class Article extends \yii\db\ActiveRecord
{
    const STATUS_HIDE = 0; // 隐藏
    const STATUS_SHOW = 1; // 显示
    ...

这一步不是必须的,但这是一个良好的编程习惯

修改数据列

打开视图层index.php,将columns数组里的status成员改为数组

[
    'format' => 'row', // 此列内容输出时不会被转义
    'filter' => [ // 过滤器,也就是搜索框。该值为数组时会显示一个下拉框(dropdown list)
        Article::STATUS_HIDE => '隐藏',
        Article::STATUS_SHOW => '显示',
    ],
    'attribute' => 'status', // 字段名
    'value' => function ($model, $key, $index, $column){ // 该列内容
        if($model->status == Article::STATUS_HIDE) return '<span class="label label-danger">隐藏</span>';
        if($model->status == Article::STATUS_SHOW) return '<span class="label label-success">显示</span>';
    },
],

注意,format 如果使用 html,则会严格检测各属性是否合法
例如 data-idabc 这样的非标准属性会被删除。因此建议使用 row

保存,刷新页面,你就会惊喜地发现 状态 列不再是单调的0和1啦!过滤器也变成可选下拉框了

1 条评论

昵称
  1. 做整容手术要多少钱

    不错 谢谢博主啊