本部分內容包括:視圖,模板,視圖協助類等。
6.0視圖介紹
在Zendframework的MVC編程模型中,視圖(View)是在控制器的控制和指揮下,用來對程式邏輯進行呈現(Render)的。呈現的結果,就是我們在瀏覽器裡看到的文字、圖片、表單等各種網頁元素及其字型、顏色、樣式等各種效果。
Zend_View Class就是負責視圖工作的類,它有效地完成了視圖與程式邏輯的分離。它提供了視圖協助、輸出過濾和變數轉義等功能。
Zend_View還是一個模板系統,我們可以用PHP作為我們的範本語言。當然ZF還可以在View指令碼裡使用其他第三方的模板系統,比如PHPLib和Smarty等。
使用Zend_View時主要分兩步,首先聲明一個Zend_View執行個體,把變數等賦給它,然後使用控制指令碼,根據視圖指令碼呈現出結果。
例如:
控制指令碼(在控制器檔案的action裡,例如IndexController.php中的函數dispdataAction()):
……
Function dispdataAction()
{
……
$data = 'to view'; //資料變數
Zend_Loader::loadClass('Zend_View');
$view = new Zend_View(); //執行個體化
$view->books = $data; //賦值
echo $view->render('view.php');
}
視圖指令碼轉義輸出語句(在視圖指令檔裡,本例是view.php):
<?
php echo $this->escape($this->data
?>
6.1引導檔案中setParam('noViewRenderer', <bool>)語句的再解釋
Index檔案中$fc->setParam('noViewRenderer', <bool>);語句和視圖的某性特性有很大關係,比如視圖存放的路徑等一些預設屬性都受該開關屬性的影響。
false 是noViewRenderer的預設值。也就是說,如果沒有該語句,則認為noViewRenderer參數被設定為false。
noViewRenderer參數被設定為false:意味著控制器使用ZF預設的視圖特性,比如視圖檔案預設必須存放於views/script/<action>/檔案夾下,視圖檔案必須存在,而且其名字必須為<action>.phtml。.phtml是ZF使用的PHP指令檔,和普通PHP檔案沒有本質區別。同時,視圖對象預設被執行個體化為$view變數,在控制指令碼中使用$view的形式為:$this->view->…。
noViewRenderer參數被設定為true:意味著控制器不使用ZF預設的視圖特性,而是通過顯式的執行個體化Zend_view對象,通過我們自己的代碼來設定視圖對象的屬性和方法。本部分“視圖介紹”中就是顯式聲明和使用視圖對象的例子。為了程式的靈活性和可控行,我們自然建議把noViewRenderer 設定為 true,這也是比較通常的做法。
6.2視圖對象的Options
視圖對象的Options選項進一步規定了視圖指令碼呈現過程中的一些細節。這些選項可以通過在聲明視圖對象時指定,在建構函式裡設定,也可以通過set……()方法來指定。
—basePath基本路徑
設定方法:setBasePath(), addBasePath()
例如目錄結構:
base/path/
helpers/
filters/
scripts/
用$view->setBasePath(”base/ path/”);語句設定基本路徑後,在沒有$view->setScriptPath('……');語句直接指定指令碼路徑時,就會自動在base/path/scripts/下搜尋視圖指令檔,如果使用了視圖助手和過濾器,就會分別自動在helpers/和 filters/檔案夾下搜尋。
—encoding字元編碼
用來在使用htmlentities()、htmlspecialchars()或其他動作時,指定字元編碼。
設定方法:setEncoding()
預設編碼是ISO-8859-1 (latin1)。
—escape回呼函數
用於在視圖呈現時調用該函數。後邊有樣本。
設定方法:setEscape()
—filter過濾器
用於在視圖呈現後調用過濾方法。
設定方法:setFilter(), addFilter(),
—strictVars
當視圖視圖發送一個未初始化的變數時,用該選項指定ZF收購給出一個提示或警告資訊:
Notice: Key "xxx" does not exist ……
設定方法:strictVars(true)
6.3視圖對象的一些屬性存取方法
—getVars() 得到所有賦予的變數
—clearVars()清除所有賦予的變數
—getScriptPath($script) 得到給定指令碼的路徑
—getScriptPaths()得到所有指令碼的路徑
—getHelperPath($helper)得到某個指定助手類的路徑
—getHelperPaths()得到所有助手的路徑
—getFilterPath($filter) 得到某個指定過濾器類的路徑
—getFilterPaths()得到所有過濾器的路徑
6.4視圖的路徑:
6.4.1視圖指令碼的搜尋路徑
如果引導檔案中$fc->setParam('noViewRenderer', false);
則預設指定視圖檔案views/scripts/[controller_name]/[action].phtml
在實際的程式碼中,為了獲得可定製的靈活性,都在控制器中實際指定了視圖檔案的路徑:
指定路徑例句:$view->setScriptPath('…/views');或
$view->addScriptPath('…/views');
這個時候,引導檔案必須有$fc->setParam('noViewRenderer', true);語句,即設定noViewRenderer為true。
6.4.2視圖指令碼的搜尋的優先順序
$view = new Zend_View();
$view->addtScriptPath('…/views1');
$view->addScriptPath('…/views2');
$view->addScriptPath('…/views3');
Zend的手冊是這樣說的:“如果沒有指定任何搜素路徑,則在控制器檔案下搜尋視圖檔案。”但是通過實際環境測試,發現這時會報告錯誤:
“no view script directory set; unable to determine location for view script”
看起來最少需要指定一個搜尋路徑。
如果指定了多條搜素路徑,則最後的搜尋路徑優先。也就是說,如果所有的搜尋路徑下有相同的視圖檔案,則最後路徑下的起作用,它覆蓋了前邊路徑下的視圖檔案。
6.5視圖控制指令碼及其變數傳遞
ZF的控制器是執行個體化和設定Zend_View的地方。在這裡,我們給視圖賦值並告訴它用指定的視圖指令碼去呈現它們。
6.5.1給視圖對象賦值
樣本:
$view->Variable=”……”;的形式
function assign1Action()
{
$view = new Zend_View();
$view->setScriptPath('views');
$view->strictVars(true);
$view->a = "Hay";
$view->b = "Bee";
$view->c = "Sea";
$view->d;
echo $view->render('tp_abc.php');
}
樣本:
$view-> assign(' Variable ', "……");的形式
function assign2Action()
{
$view = new Zend_View();
$view->setScriptPath('views');
$view->assign('a', "Hay");
$view->assign('b', "Bee");
$view->assign('c', "Sea");
echo $view->render('tp_abc.php');
}
樣本:數組
function assign3Action()
{
$view = new Zend_View();
$view->setScriptPath('views');
$array = array(
'a' => "Hay",
'b' => "Bee",
'c' => "Sea",
);
$view->assign($array);
echo $view->render('tp_abc.php');
}
樣本:對象
function assign4Action()
{
$view = new Zend_View();
$view->setScriptPath('views');
$obj = new StdClass;
$obj->a = "Hay";
$obj->b = "Bee";
$obj->c = "Sea";
$view->assign((array) $obj);
echo $view->render('tp_abc.php');
}
樣本:
使用回呼函數。
function myhtmlentityAction()
{
$view = new Zend_View();
$view->setScriptPath('views');
//自訂類,在/models檔案夾下的myclass.php檔案中定義
$mycls = new myClass();
//調用$mycls類的myHtmlEntity方法
$view->setEscape(array($mycls, 'myHtmlEntity'));
$obj = new StdClass;
$obj->a = "the words hay bee sea ";
$obj->b = "this is bee";
$obj->c = " this is sea";
$view->assign((array) $obj);
echo $view->render('tp_abc.php');
}
tp_abc.php視圖指令碼模板檔案內容:
<?php
echo 'a = ' . $this->escape($this->a).'<br>';
echo 'b = ' . $this->escape($this->b).'<br>';
echo 'c = ' . $this->escape($this->c).'<br>';
?>
myclass.php檔案內容:
<?php
class myClass
{
public function __construct($options = null)
{
}
function myHtmlEntity($val)
{//把所有單詞首字母變為大寫
return ucwords($val);
}
}
?>
輸出結果:
a = The Words Hay Bee Sea
b = This Is Bee
c = This Is Sea