在 Yii 自動生成的代碼裡,我們總能在 admin 的界面看到 CGridView 的身影。這是一個很好用的展示數據的表格控件,用的好可以明顯地加快開發進度。下面就讓我們來探索一下 CGridView 的基本使用吧:
Yii 用戶登陸機制 http://www.linuxidc.com/Linux/2015-01/111602.htm
Yii中引入js和css文件 http://www.linuxidc.com/Linux/2015-01/111603.htm
Yii 不完全解決方案 http://www.linuxidc.com/Linux/2015-01/111606.htm
簡單起見,我們的代碼就用 Yii demo 中的 blog 例子來做修改。首先,這是修改後的部分 MySQL 語句:
drop table if exists `tbl_user`;
CREATE TABLE tbl_user
(
`user_id` INTEGER NOT NULL AUTO_INCREMENT comment '主鍵',
`username` VARCHAR(128) NOT NULL comment '用戶名',
`nickname` VARCHAR(128) NOT NULL comment '昵稱',
`password` VARCHAR(128) NOT NULL comment '密碼',
`email` VARCHAR(128) NOT NULL comment '郵箱',
`is_delete` tinyint not null default 0 comment '刪除標志',
unique key(`username`),
primary key (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment='用戶表';
drop table if exists `tbl_post`;
CREATE TABLE tbl_post
(
`post_id` INTEGER NOT NULL AUTO_INCREMENT comment '主鍵',
`title` VARCHAR(128) NOT NULL comment '標題',
`content` TEXT NOT NULL comment '文章內容',
`tags` TEXT comment '標簽',
`status` INTEGER NOT NULL comment '狀態,0 = 草稿,1 = 審核通過,-1 = 審核不通過,2 = 發布',
`create_time` INTEGER comment '創建時間',
`update_time` INTEGER comment '更新時間',
`author_id` INTEGER NOT NULL comment '作者',
`is_delete` tinyint not null default 0 comment '刪除標志',
CONSTRAINT `post_ibfk_1` FOREIGN KEY (author_id)
REFERENCES tbl_user (`user_id`) ON DELETE CASCADE ON UPDATE RESTRICT,
primary key (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment='日志表';
兩個表一個存儲作者信息一個存儲日志,其中日志有一個外鍵關聯到 user。兩個表裡面的 is_delete 字段是標志該條記錄是否被刪除,0 為未刪除,1 為已刪除。讓我們看一下用 gii 生成的 Post 類的 relation 方法:
/**
* @return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'comments' => array(self::HAS_MANY, 'Comment', 'post_id'),
'author' => array(self::BELONGS_TO, 'User', 'author_id'),
);
}
其中的 author 外鍵作為 BELONGS_TO 關系存在,符合我們的預期。
說了這麼多,看看自動生成的 Post 中 admin.php 裡 CGridView 的代碼吧:
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'post-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'post_id',
'title',
'content',
'tags',
'status',
'create_time',
'update_time',
'author_id',
'is_delete',
array(
'class'=>'CButtonColumn',
),
),
)); ?>
看!雖然我們什麼都沒寫,但這就是這個控件的最基礎使用了。dataProvider 是由 model 裡面的 search 函數提供的數據,filter...暫時看不出這裡的作用,columns 控制展示的每一列,其中最後一項的 CButtonColumn 向我們展示了三個按鈕,分別是 查看 更新 和 刪除。
接下來我們一點點地改造.
用 CGridView 展示我們真正要的數據形式:
很多時候,數據庫裡的東西不適合直接展示給用戶看,需要我們進行一定的處理之後才適合閱讀。但在這裡不經修改的話 CGridView 只會把數據庫的值原封不動地呈現,所以,我們應該在相應的字段進行修改。比如 is_delete 字段,數據庫裡存放的是 0 和 1,但是在這裡閱讀就不太好了,我們應該改成 1 展示 '是' ,0展示 '否'。看看下面的代碼,我們用了一個 array,兩個鍵分別是 name 和 value,name 對應的要填寫該 model 擁有的字段,而 value 是你想展示的數據,這裡可以寫成一個 php 語句,作為可以執行的代碼。看到這裡,是不是覺得對這個 value 我們可以做很多東西?有的同學可能要問,如果我想執行的代碼很長,難道都寫在 value 裡面?。。。我說同學,你不會在其他地方寫成一個函數然後在這裡調用它嗎??
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'post-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'post_id',
'title',
'content',
'tags',
'status',
'create_time',
'update_time',
'author_id',
'is_delete',
array(
'name'=>'is_delete',
'value'=>'is_delete?"是":"否"' //value 是可以執行 php 語句的哦
)
array(
'class'=>'CButtonColumn',
),
),
)); ?>
除此之外,還有一些常用的選項,都可以在 array 裡面填寫,下面是比較常見的使用方式(其他部分代碼省略):
array(
'name'=>'is_delete',
'value'=>'is_delete?"是":"否"' //value 是可以執行 php 語句的哦
'filter' => array(0=>'否',1=>'是'), //自己定義搜索過濾的方式,這裡為 是 和 否 的下拉菜單
'htmlOptions'=>array('class'=>'delete'), //可以定義 html 選項,這裡是定義了帶一個 delete 的類
),
上面我們用 name 的話那是 model 裡原來就有的字段,如果我們想展示自己定義的新內容呢,用 header :
array(
'header'=>'備注',
'value'=> 'display your data'
),
PS:在這裡只談我常用的部分,詳細請看文檔:CGridView
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-01/111607p2.htm