2013年8月18日 星期日

用 Eclipse 開發 Yii Web Application (五)

雖然 CListView 顯示了我們對應資料庫的資料, 但我不怎麼喜歡他的版面配置,因此我們來改造一下我們 Courses 中 view 裡面的 index.php。
我們將 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

沒有留言:

張貼留言