視圖 ==== 視圖主要是一個包含用戶介面元素的 PHP 腳本.他可以包含 PHP 語句,但是我們建議這些語句不要去改變資料模型,且最好能夠保持其單純性 (單純作為視圖)。為了實現邏輯和界面分離,大段的邏輯應該被放置於控制器或模型中,而不是視圖中。 視圖有一個名字,當呈現 (render) 時,名字會被用於識別視圖腳本檔案。視圖的名稱與其視圖腳本名稱是一樣的,例如:視圖 `edit` 的名稱出自一個名為 `edit.php` 的腳本檔案。要呈現時,需通過傳遞視圖的名稱來調用 [CController::render()]。這個方法將在 `protected/views/ControllerID` 目錄下尋找對應的視圖檔案。 在視圖腳本內部,我們可以通過 `$this` 來存取控制器實體.我們可以在視圖裡以 `$this->propertyName` 的方式 `拉取` 控制器的任何屬性. 我們也可以用以下 `推送` 的方式傳遞資料到視圖裡: ~~~ [php] $this->render('edit', array( 'var1'=>$value1, 'var2'=>$value2, )); ~~~ 在以上的方式中, [render()|CController::render] 方法將提取數組的第二個參數到變量裡。其產生的結果,是在視圖腳本裡,我們可以直接存取變數 `$var1` 和 `$var2`。 佈局 ------ 佈局是一種用來修飾視圖的特殊的視圖檔案,它通常包含了用戶界面中通用的一部分視圖。例如:佈局可以包含 header 和 footer 的部分,然後把內容嵌入其間。 ~~~ [php] ......header here...... ......footer here...... ~~~ 其中的 `$content` 則儲存了內容視圖的呈現結果。 當使用 [render()|CController::render] 時,應用程式是看不到布局的。視圖腳本 `protected/views/layouts/main.php` 是預設的佈局檔案,這可以通過改變 [CWebApplication::layout] 或 [CWebApplication::layout] 自行定義。要呈現一個不帶佈局的視圖,則需調用 [renderPartial()|CController::renderPartial] 。 小工具 ------ 小工具是 [CWidget] 或其子類別的實體,主要是用於表現資料的元件。小工具通常內嵌於一個視圖來產生一些複雜而獨立的用戶界面,例如:一個日曆小工具可用於呈現一個複雜的日曆界面。小工具使用戶界面重用性更高。 我們可以按如下視圖腳本來使用一個小工具: ~~~ [php] beginWidget('path.to.WidgetClass'); ?> ...可能會由小工具獲取的內容主體... endWidget(); ?> ~~~ 或者 ~~~ [php] widget('path.to.WidgetClass'); ?> ~~~ 後者用於不需要任何主體內容的元件. 小工具可通過配置來設定它的關,這是通過調用 [CBaseController::beginWidget] 或 [CBaseController::widget] 設置其初始化的屬性值來完成。例如:當使用 [CMaskedTextField] 小工具時,我們想指定被使用的遮罩,我們通過傳遞一個帶有這些屬性初始化值的陣列來實現。這裡的陣列的鍵是屬性的名稱,而陣列的值則是小工具屬性所對應的值。正如以下所示 : ~~~ [php] widget('CMaskedTextField',array( 'mask'=>'99/99/9999' )); ?> ~~~ 繼承 [CWidget] 並覆蓋其 [init()|CWidget::init] 和 [run()|CWidget::run] 方法,可以定義一個新的小工具: ~~~ [php] class MyWidget extends CWidget { public function init() { // 此方法會被 CController::beginWidget() 調用 } public function run() { // 此方法會被 CController::endWidget() 調用 } } ~~~ 小工具可以像一個控制器一樣擁有它自己的視圖。預設情況下,小工具的視圖檔案位於包含了小工具類別檔案目錄的 `views` 子目錄之下。這些視圖可以通過調用 [CWidget::render()] 來呈現,這一點和控制器很相似.唯一不同的是,小工具的視圖沒有佈局支援。另外,小工具視圖中的 `$this` 指向小工具實體而不是控制器實體。 系統視圖 ----------- 系統視圖的呈現通常用於展示 Yii 的錯誤和日誌訊息。例如,當用戶請求一個不存在的控制器或動作時,Yii 會拋出一個異常來解釋這個錯誤。這時, Yii 就會使用一個特殊的系統視圖來顯示此錯誤。 系統視圖的命名遵從了一些規則,比如像 `errorXXX` 這樣的名稱就是用於呈現展示錯誤號 `XXX` 的 [CHttpException] 的視圖。例如,如果 [CHttpException] 拋出一個 404 錯誤,那麼 `error404` 就會被顯示。 在 `framework/views` 下, Yii 提供了一系列預設的系統視圖,他們可以通過在 `protected/views/system` 下建立同名視圖檔案進行自定。
$Id$