我們將 CListView 換成 CGridView
內容很簡單:
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
));
參數很簡單, 只要告訴 CGridView 之前 CActiveDataProvider 產生物件的變數名稱即可。
打開瀏覽器看看變成什麼樣。
哇! 很有質感。CGridView 還有一些參數可以讓我們設定成為我們更希望展現的樣子,
'columns' 的參數可以自行定義哪些欄位要如何顯示, 也可以用CButtonColumn來自動幫我們
產生 view, update 及 delete 的按鈕。
我們把 index.php 裡面 CGridView 改成下面
<?php $this->widget('zii.widgets.grid.CGridView', array( 'dataProvider'=>$dataProvider, 'columns'=> array( 'course_no', 'course_name', 'description', 'teacherNo.teacher_name', 'credit', array('class'=>'CButtonColumn') ) )); ?>
其中 teacherNo.teacher_name 這行我們等下說明一下, 我們先看看畫面變成什麼樣子
跟之前不一樣的地方有兩處, 第一個是原本courses中的授課教師編號(teacher_no),
比較難對應到實際教師, 所以把它變成Teacher_name, 另一個就是在每一列後面增加了
view, update 及 delete 按鈕。
說明 teacherNo.teacher_name 之前我們先看一下, model/Courses.php 中的
function relations:
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(
'classes' => array(self::HAS_MANY, 'Classes', 'course_no'),
'teacherNo' => array(self::BELONGS_TO, 'Teachers', 'teacher_no'),
);
}
原來在 teacherNo 定義在 model Courses.php 中的 relations 中, 這行的意義是
我們定義一個關聯名稱為 teacherNo, 讓 courses 這個 table 屬於(Belongs_to) teachers
這個表格, 並且用欄位 teacher_no 來關連彼此。 想更瞭解 relations 可以參考以下兩個網頁
參考一 參考二。
而在 Courses.php 中的 relations 並不是我們寫的, 而是我們之前用Gii Model Generator
產生出來的。 但 Gii 為什麼這樣聰明, 其實是我們在建立資料庫時先針對 table 之間的關聯先定義了。
我們可以利用phpMyAdmin來幫助我們完成從 courses 的結構中可以點選 '關聯檢視' 來設定。
如果欄位名稱被自己或另外的table定義為主鍵(primary key), 這裡就會有下拉選單可以設定
我們把 teacher_no 跟 table teachers 裡的 teacher_no 做關聯。
後面的 ON DELETE CASCADE ON UPDATE CASCADE 的意思是如果遇到刪除或更新此欄位內容時
關聯的 table 相同欄位值得也必須跟著一起更新或刪除。
回到剛才的 teacherNo.teacher_name 意思就是利用 teacherNo 關連去存取 teachers
這個 table 的欄位 teacher_name。
我們順便把 Teachers.php 中的 attributeLabels 改成中文, 再看看結果。
參考資料 Yii API CGridView
沒有留言:
張貼留言