Yii2-GridView自定义数据列
2016-11-03
本文同时收录于 超能小紫的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' => 'raw', // 此列内容输出时不会被转义
'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-id
、abc
这样的非标准属性会被删除。因此建议使用raw
保存,刷新页面,你就会惊喜地发现 状态 列不再是单调的0和1啦!过滤器也变成可选下拉框了
最后代码的'format'值应该是'raw'。。被坑了
打错了,哈哈哈,我改一下
不错 谢谢博主啊