用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啦!過濾器也變成可選下拉框了