用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啦!过滤器也变成可选下拉框了