視圖
====

視圖主要是一個包含用戶介面元素的 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......
<?php echo $content; ?>
......footer here......
~~~

其中的 `$content` 則儲存了內容視圖的呈現結果。

當使用 [render()|CController::render] 時，應用程式是看不到布局的。視圖腳本 `protected/views/layouts/main.php` 是預設的佈局檔案，這可以通過改變 [CWebApplication::layout] 或  [CWebApplication::layout] 自行定義。要呈現一個不帶佈局的視圖，則需調用 [renderPartial()|CController::renderPartial] 。

小工具
------

小工具是 [CWidget] 或其子類別的實體，主要是用於表現資料的元件。小工具通常內嵌於一個視圖來產生一些複雜而獨立的用戶界面，例如：一個日曆小工具可用於呈現一個複雜的日曆界面。小工具使用戶界面重用性更高。

我們可以按如下視圖腳本來使用一個小工具:

~~~
[php]
<?php $this->beginWidget('path.to.WidgetClass'); ?>
...可能會由小工具獲取的內容主體...
<?php $this->endWidget(); ?>
~~~

或者

~~~
[php]
<?php $this->widget('path.to.WidgetClass'); ?>
~~~

後者用於不需要任何主體內容的元件.

小工具可通過配置來設定它的關，這是通過調用 [CBaseController::beginWidget] 或 [CBaseController::widget] 設置其初始化的屬性值來完成。例如：當使用 [CMaskedTextField] 小工具時，我們想指定被使用的遮罩，我們通過傳遞一個帶有這些屬性初始化值的陣列來實現。這裡的陣列的鍵是屬性的名稱，而陣列的值則是小工具屬性所對應的值。正如以下所示 :
~~~
[php]
<?php
$this->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` 下建立同名視圖檔案進行自定。

<div class="revision">$Id$</div>