2007年5月15日 星期二

CakePHP使用手冊-Scaffold(鷹架)

轉貼自 http://www.ezluk.org/

第一節



Cake的Scaffold非常酷



真酷,我一定要把它用在我的產品內!
大家剛看到都會這麼想,連我們到現在都還覺得它的確很酷,
但請認清一件事Scaffold…嗯…它畢竟只是Scaffold。
它是一堆可以讓你在專案開發初期快速建構雛形的工具。
但,它的可塑性不足。所以,當您發覺很想開發自己的邏輯和畫面時,就是放下Scaffold,開始寫一些程式碼的時候了。


Scaffold在應用程式開發初期非常好用。
一開始的資料庫連schemas都還沒確定,甚至可能整個被推翻,這對整個設計流程來說是很正常的事。
但這麼做的問題在:網頁程式開發者總討厭開發一些未來不使用的表單。
為了減低開發者在這方面的負擔,Cake就加入了Scaffold。
Scaffold會分析資料庫內的資料表,建立標準的新增、刪除和編輯鈕,標準的編輯表單和標準的檢視版面。
想在應用程式中使用Scaffold,只要在controller中加入$scaffold變數


<?php

class CategoriesController extends AppController

{

    var $scaffold;

}

?>

有一個關於Scaffold的重點要提醒:
它會把所有以 _id 為結尾命名的欄位視為一組外部鍵,在底線前的字就是外部鍵關聯的資料表名稱。
舉個例子來說,如果有一個資料表含有一個欄位叫parent_id ,則這個欄位就代表是連到parent資料表的外部鍵。
若不是,那這時候就得將他換個名字,例如parentid。
再來,當資料表有一個外部鍵(例如title資料表有個欄位叫category_id),且己經把model的關聯做好(參考6.4關聯),
那麼顯示/編輯/新增的view會自動從外部鍵所指的資料表(此例為category)取出資料,放到選擇欄位的選項內。


<?php

class Title extends AppModel

{

   var $name = 'Title';

   var $belongsTo = array('Category'=>

                   
       array('className'  => 'Category',

                   
             'foreignKey' => 'category_id')

   );

}

?>





 


若要設定外部資料表所顯示的欄位,請指定外部資表內的$displayField變數。
下面的程式碼是指定要顯示Category裡的title欄位:


<?php

class Category extends AppModel

{

    var $name = 'Category';



    var $displayField = 'title';

}

?>


第二節



自訂Scaffold的外觀


如果你想讓Scaffold看起來有點不一樣,可以自己建立。
我們並不建議在產品應用程式中用到這項技術,但在開發初期十分好用。


要改變Scaffold的view,必須自己設計幾個東西:



為單一controller自訂Scaffold view


PostsController的自訂Scaffoldview 看起來如下:

/app/views/posts/scaffold/index.scaffold.thtml
/app/views/posts/scaffold/show.scaffold.thtml
/app/views/posts/scaffold/edit.scaffold.thtml
/app/views/posts/scaffold/new.scaffold.thtml



自訂整個應用程式的Scaffold view


如果要改變所有controller的Scaffold view,自訂的內容如下:


/app/views/scaffold/index.scaffold.thtml
/app/views/scaffold/show.scaffold.thtml
/app/views/scaffold/edit.scaffold.thtml
/app/views/scaffold/new.scaffold.thtml


如果發覺必須改變controller的邏輯,就放棄Scaffold,開始寫自己的程式吧。


在Cake的程式產生器Bake中有一個特色對十分有用。Bake可以產生Scaffold的程式碼,你可以依需求去修改它。


沒有留言:

網誌存檔

關於我自己

Aspire freedom , Hope to do Soming make self complete ~