用gii生成Model和CRUD之后,基本的增删查改和列表页都有了 但在很多时候,默认生成的列表所展示的 **数据列** 并不一定是我们想展示的 ### 修改所展示的数据列 打开视图层目录,找到刚生成出来的`index.php`,阅读其代码 <del>稍有常识的人都能看出,</del> 控制数据列显示的就是`GridView::widget`方法的参数数组中的`columns`键 它大概长这样: ```php 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'name', 'status', // 其他字段... ['class' => 'yii\grid\ActionColumn'], ], ``` 我们只要将其他字段解除屏蔽、屏蔽掉自己不想显示的字段就行了 ### 显示关联字段 举个例子,我有个**文章表Article**,表里有个**作者id author_id**字段 这个字段跟**作者表Author**的主键**id**相关联 我希望在文章列表中显示作者的名称(name),要怎么做呢? 首先,给**Article**模型添加如下方法 ```php public function getAuthor() { return $this->hasOne(Author::className(), ['id'=>'author_id']); } ``` > 如果你不知道这有什么用,请阅读 [Yii2手册](http://www.yiichina.com/doc/guide/2.0/db-active-record) 内的 **查询关联的数据** 一节 然后,给`columns`数组添加一个成员`author.name`就行啦!就是这么方便! ### 自定义数据列内容 但是很多时候,光是控制显示哪些字段还是不够的 还是上面的例子,我有个**文章表Article**,表里有个**状态Status**字段,值0表示隐藏、1表示显示 但我总不能在列表里直接显示0和1啊,筛选搜索时也不能要求用户输入0和1啊,体验多不好 这时,我们就需要自定义数据列内容了 #### 定义常量 首先打开文章模型层,添加两个常量 ```php class Article extends \yii\db\ActiveRecord { const STATUS_HIDE = 0; // 隐藏 const STATUS_SHOW = 1; // 显示 ... ``` 这一步不是必须的,但这是一个良好的编程习惯 #### 修改数据列 打开视图层`index.php`,将`columns`数组里的`status`成员改为数组 ```php [ '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-id`、`abc` 这样的非标准属性会被删除。因此建议使用 `row` 保存,刷新页面,你就会惊喜地发现 **状态** 列不再是单调的0和1啦!过滤器也变成可选下拉框了