視圖助手提供了較多的助手,如果想了解這些助手類的使用方法,可以通過找到相應的類,看源代碼,來學習使用方法。通過助手的參數名稱就可以了解到助手需要傳入的值,這里就不再細說了,下面大體按照助手分類來羅列一下常見的視圖助手。
zend提供的常見生成form元素的方法以及使用舉例:
fieldset($name, $content, $attribs):
生成一個 XHTML fieldset. 如果$attribs
包含一個 'legend' 鍵,它的值將用于 fieldset legend。 Fieldset 將環繞在$content
周圍提供給助手。
form($name, $attribs, $content):
生成一個 XHTML 表單。所有$attribs
轉義和解析成表單標簽的 XHTML 屬性。如果 $content
不以布爾 false 出現,那么內容就是在表單標簽內被解析,如果$content
是布爾 false (缺省),只有開頭的表單標簽被生成。
formButton($name, $value, $attribs):
生成 <button /> 元素;
formCheckbox($name, $value, $attribs,$options):
生成 <input type="checkbox" /> 元素。
缺省地,當沒有提供 $value 并且沒有 $options,'0' 被假定為未選的值,'1'為選中的值。 如果傳遞 $value,但沒有 $options,選中的值就被假定為傳遞的值。
$options 應當是數組。如果數組被索引,第一個值就是選中的值,第二個是未選的值, 所有其它值被忽略。 你也可傳遞一個帶有鍵為 'checked' 和 'unChecked' 的聯合數組。
如果傳遞了 $options,如果 $value 匹配選中的值,元素將標記為選中。你也通過傳遞 一個布爾值給屬性 'checked' 來標記元素為選中或未選。
上述內容可能最好匯總成一些例子:
<?php// '1' and '0' as checked/unchecked options; not checkedecho $this->formCheckbox('foo');// '1' and '0' as checked/unchecked options; checkedecho $this->formCheckbox('foo', null, array('checked' => true));// 'bar' and '0' as checked/unchecked options; not checkedecho $this->formCheckbox('foo', 'bar');// 'bar' and '0' as checked/unchecked options; checkedecho $this->formCheckbox('foo', 'bar', array('checked' => true));// 'bar' and 'baz' as checked/unchecked options; uncheckedecho $this->formCheckbox('foo', null, null, array('bar', 'baz');// 'bar' and 'baz' as checked/unchecked options; uncheckedecho $this->formCheckbox('foo', null, null, array( 'checked' => 'bar', 'unChecked' => 'baz'));// 'bar' and 'baz' as checked/unchecked options; checkedecho $this->formCheckbox('foo', 'bar', null, array('bar', 'baz');echo $this->formCheckbox('foo', null, array('checked' => true), array('bar', 'baz');// 'bar' and 'baz' as checked/unchecked options; uncheckedecho $this->formCheckbox('foo', 'baz', null, array('bar', 'baz');echo $this->formCheckbox('foo', null, array('checked' => false), array('bar', 'baz');
對所有情況,標記預先準備一個帶有未選的值的隱藏元素。 這樣,如果值是未選的,你將仍獲得有效的返回到表單的值。
formErrors($errors, $options):
生成一個無順序的 XHTML 列表來顯示錯誤。$errors
是個字符串或字符串數組;$options
是你想放入開頭列表標簽的任何屬性。
當通過調用助手中的方法時,你可以指定替代的開頭,結尾和分隔符:
setElementStart($string)
; 缺省為 '<ul class="errors"%s"><li>', 其中 %s 是在$options
中被替換的屬性。
setElementSeparator($string)
; 缺省為 '</li><li>'。
setElementEnd($string)
; 缺省為 '</li></ul>'。
formFile($name, $value, $attribs):
生成<input type="file" />
formHidden($name, $value, $attribs):
生成<input type="hidden" />
formLabel($name, $value, $attribs):
生成 <label>設置for
屬性給 $name
,實際的標簽字符給 $value
。 如果 disable
傳遞給 attribs
,什么都不返回。
formMultiCheckbox($name, $value, $attribs, $options, $listsep):
生成一個 checkboxes 列表。$options
是個聯合數組,可以有任意的深度。$value
可以是單個的值或者是可選的匹配在$options
數組中的鍵的一個數組。$listsep
缺省為一個 HTML break ("<br />")。缺省地,這個元素被當作數組,所有 checkboxes 共享同一個名稱,并以數組的形式提交。
formPassword($name, $value, $attribs):
Creates an <input type="password" /> element.
formRadio($name, $value, $attribs, $options):
生成一系列<input type="button" />,每個$options數組元素一個,key為radio的值,并且元素的值是radio的標簽。
formReset($name, $value, $attribs):
生成<input type="reset" />
formSelect($name, $value, $attribs, $options):
生成<select>...</select>其中的每個<option>對應于一個$option數組元素。元素的key是option的值,元素的值是option的標簽。$value這個值的option默認為選中。
formSubmit($name, $value, $attribs):
生成<input type="submit" />
formText($name, $value, $attribs):
生成<input type="text" />
formTextarea($name, $value, $attribs):
生成<textarea>...</textarea>
url($urlOptions, $name, $reset):
基于已命名的路由生成URL字符串。$urlOptions
必須是一個鍵/值對應的關聯數組,用于特定的路由。
htmlList($items, $ordered, $attribs):
基于傳遞給它的$items
生成無序的和有序的列表。如果 $items
是多維數組,將創建嵌套的列表。
以上helper的使用非常簡單,下面是個例子。注意你只需要調用即可,它們會根據需要自己加載并實例化。
<?php// 在你的view腳本內部, $this 指向 Zend_View 實例.//// 假設你已經為select對應的變量$countries指定一系列option值,// array('us' => 'United States', 'il' =>// 'Israel', 'de' => 'Germany').?><form action="action.php" method="post"> <p><label>Your Email: <?php echo $this->formText('email', 'you@example.com', array('size' => 32)) ?> </label></p> <p><label>Your Country: <?php echo $this->formSelect('country', 'us', null, $this->countries) ?> </label></p> <p><label>Would you like to opt in? <?php echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) ?> </label></p></form>
以上視圖腳本會輸出這樣的結果:
<form action="action.php" method="post"> <p><label>Your Email: <input type="text" name="email" value="you@example.com" size="32" /> </label></p> <p><label>Your Country: <select name="country"> <option value="us" selected="selected">United States</option> <option value="il">Israel</option> <option value="de">Germany</option> </select> </label></p> <p><label>Would you like to opt in? <input type="hidden" name="opt_in" value="no" /> <input type="checkbox" name="opt_in" value="yes" checked="checked" /> </label></p></form>
HTML <object>
元素在網頁里用于嵌入媒體如 Flash 或 QuickTime。 對象視圖助手用最小的代價來幫助嵌入媒體。
有四個初始的對象助手:
formFlash
為嵌入 Flash 文件生成 markup。
formObject
為嵌入定制對象生成 markup。
formPage
為嵌入其它 (X)HTML 頁面生成 markup。
formQuicktime
為嵌入 QuickTime 文件生成 markup。
所有這些助手使用相似的接口。這樣,本文檔只包含兩個助手的例子。
Example #17 Flash 助手
使用助手嵌入 Flash 到你的頁面相當簡單。唯一需要的參數是資源 URI。
<?php echo $this->htmlFlash('/path/to/flash.swf'); ?>
它輸出下列 HTML:
<object data="/path/to/flash.swf" type="application/x-shockwave-flash" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"></object>
另外你可以指定可以和 <object>
一起解析的屬性、參數和內容。 這個用 htmlObject
助手來示范。
Example #18 通過傳遞另外的參數來定制對象
對象助手里的第一個參數總是必需的,它是你想嵌入的資源的 URI。 第二個參數只對 htmlObject
助手是必需的,其它助手對這個參數已經有了正確的值。 第三個參數用來傳遞屬性到對象元素,它只接受帶有key-value對的數組,classid
和codebase
是這個屬性的例子。 第四個參數也用帶有key-value對的數組并用它們生成 <param>
元素,你將很快看到一個這樣的例子。 最后一個是提供另外的內容給對象的選項。來看一下使用所有參數的例子。
echo $this->htmlObject( '/path/to/file.ext', 'mime/type', array( 'attr1' => 'aval1', 'attr2' => 'aval2' ), array( 'param1' => 'pval1', 'param2' => 'pval2' ), 'some content');/*這將輸出:<object data="/path/to/file.ext" type="mime/type" attr1="aval1" attr2="aval2"> <param name="param1" value="pval1" /> <param name="param2" value="pval2" /> some content</object>*/
主要用來獲取和生成url
使用方法:
<?php echo $this->baseUrl();?>
例如訪問
http://www.localzend.com/helper_demo1/public/index/index
對應的是
/helper_demo1/public
常見用法是在base標簽,或者引用外部資源是使用,
<?php echo $this->headScript() ->appendFile($this->baseUrl().'/ui_1/js/jquery-1.7.1.min.js') ->appendFile($this->baseUrl().'/ui_1/js/common.js') ;?>
class Zend_View_Helper_Url extends Zend_View_Helper_Abstract{ /** * Generates an url given the name of a route. * * @access public * * @param array $urlOptions Options passed to the assemble method of the Route object. * @param mixed $name The name of a Route to use. If null it will use the current Route * @param bool $reset Whether or not to reset the route defaults with those provided * @return string Url for the link href attribute. */ public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true) { $router = Zend_Controller_Front::getInstance()->getRouter(); return $router->assemble($urlOptions, $name, $reset, $encode); }}
參數$name默認為空,路由名稱
參數$encode是否對內容進行編碼
使用方法如下:
<?php echo $this->baseUrl();?> <?php echo $this->url(array('action'=>'add','controller'=>'user','module'=>'default'),null,true);?> <?php echo $this->url(array('action'=>'add','controller'=>'user'),null,true);?> <?php echo $this->url(array('action'=>'add','controller'=>'user','module'=>'manage'),null,false);?> <?php echo $this->url(array('action'=>'add','controller'=>'user','module'=>'manage'),null,true);?> <?php echo $this->url(array('action'=>'add','controller'=>'user','username'=>'張三','useremail'=>'a@aa.com'),null,true);?>輸出如下:
/helper_demo1/public/user/add/helper_demo1/public/user/add/helper_demo1/public/manage/user/add/helper_demo1/public/manage/user/add/helper_demo1/public/user/add/username/%E5%BC%A0%E4%B8%89/useremail/a%40aa.com
/** * Retrieve rendered contents of a controller action * * If the action results in a forward or redirect, returns empty string. * * @param string $action * @param string $controller * @param string $module Defaults to default module * @param array $params * @return string */ public function action($action, $controller, $module = null, array $params = array()) { $this->resetObjects(); if (null === $module) { $module = $this->defaultModule; } // clone the view object to prevent over-writing of view variables $viewRendererObj = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); Zend_Controller_Action_HelperBroker::addHelper(clone $viewRendererObj); $this->request->setParams($params) ->setModuleName($module) ->setControllerName($controller) ->setActionName($action) ->setDispatched(true); $this->dispatcher->dispatch($this->request, $this->response); // reset the viewRenderer object to it's original state Zend_Controller_Action_HelperBroker::addHelper($viewRendererObj); if (!$this->request->isDispatched() || $this->response->isRedirect()) { // forwards and redirects render nothing return ''; } $return = $this->response->getBody(); $this->resetObjects(); return $return; }
Action
視圖助手允許視圖腳本執行一個特定的控制器Action;在執行之后的響應對象的結果將被返回。有時候特定的Action生成可重用內容或“widget-ized”內容(在頁面內生成一個帶有特定功能的小面板,類似于Windows Vista的widget,Haohappy注),這時我們就可以使用本功能。
內部調用_forward()
或者轉向的Action在此將無效,將返回空字符串。
Action
視圖助手的API和大部分MVC組件調用控制器動作的方式一樣:action($action,$controller, $module = null, array $params = array())
。$action
和$controller
是必須的;如果沒有指定模塊,缺省模塊將被使用。
Example #1 動作視圖助手的基本用法
例如,假設你有一個CommentController
,為了給當前請求輸出評論列表,帶一個可被調用的 listAction()
方法:
<div id="sidebar right"> <div class="item"> <?= $this->action('list', 'comment', null, array('count' => 10)); ?> </div></div>
Partial
視圖助手被用來在它自己的變量范圍內解析特定的模板。主要用法是(解析)可重用的模板片段,你不需要操心變量名的沖突。另外,它們讓你從特定的模塊指定 partial 視圖腳本。
Partial
的兄弟 PartialLoop
視圖助手允許傳遞可迭代數據并為每個條目解析一部分。
Example #2 Partials 的基本用法
partials 的基本用法是在它自己的視圖范圍內解析一個模板的片段。
<?php // partial.phtml ?><ul> <li>From: <?= $this->escape($this->from) ?></li> <li>Subject: <?= $this->escape($this->subject) ?></li></ul>
你可以這樣從視圖腳本里調用它:
<?= $this->partial('partial.phtml', array( 'from' => 'Team Framework', 'subject' => 'view partials')); ?>
解析結果如下:
<ul> <li>From: Team Framework</li> <li>Subject: view partials</li></ul>
Note: 什么是模型(model)?
和Partial
視圖助手一起使用的模型(即partial()的第二個參數,Haohappy注)可以是下列其中之一:如果你的模型是一個對象,你可能想讓它作為對象傳遞給 partial 腳本,而不是把它系列化成一個數組變量。 你可以通過設置適當的助手的 'objectKey' 屬性來完成這個:
數組 。如果傳遞了數組,它應當是聯合數組,因為它的 ‘鍵/值’ 對用作為視圖變量的鍵賦值給視圖。
實現了toArray() 方法的對象。如果被傳遞的對象有
toArray()
方法,toArray()
的結果將被當作視圖變量賦值給視圖對象。標準對象 。 任何其它對象將把
object_get_vars()
的結果(對象的所有公共屬性)賦值給視圖對象。
// Tell partial to pass objects as 'model' variable$view->partial()->setObjectKey('model');// Tell partial to pass objects from partialLoop as 'model' variable in final// partial view script:$view->partialLoop()->setObjectKey('model');
當傳遞Zend_Db_Table_Rowset
s 給partialLoop()
時這個技術相當有用, 因為你在視圖腳本里有全部訪問 row 對象的權限,允許你調用它們的方法(如從父或依賴的 rows 獲取數據)。
Example #3 使用 PartialLoop 來解析可迭代的(Iterable)的模型
可能你常常會需要在一個循環里使用 partials 來輸出相同的內容片段多次,這時你就可以把大塊的重復的內容或復雜的顯示邏輯放到一個地方。然而這對性能有影響,因為partial助手需要在每個迭代里調用一次。
PartialLoop
視圖助手解決了這個問題。 它允許你把迭代條目(實現Iterator
的數組或對象)當做模型來傳遞。它這些把這些條目當作模型迭代、傳遞給 partial 腳本。在迭代器里的條目可以是Partial
視圖助手允許的任何模型。
讓我們看一下下面的 partial 視圖腳本:
<? // partialLoop.phtml ?> <dt><?= $this->key ?></dt> <dd><?= $this->value ?></dd>
添加下列 "model":
<?php$model = array( array('key' => 'Mammal', 'value' => 'Camel'), array('key' => 'Bird', 'value' => 'Penguin'), array('key' => 'Reptile', 'value' => 'Asp'), array('key' => 'Fish', 'value' => 'Flounder'),);?>
在視圖腳本中,你可以這樣調用 PartialLoop
助手:
<dl><?= $this->partialLoop('partialLoop.phtml', $model) ?></dl><dl></dl> <dt>Mammal</dt> <dd>Camel</dd> <dt>Bird</dt> <dd>Penguin</dd> <dt>Reptile</dt> <dd>Asp</dd> <dt>Fish</dt> <dd>Flounder</dd></dl>
Example #4 在其它模塊中解析 Partials
有時候 partial 存在于不同的模塊(Module)。如果你知道模塊的名稱,你可以把它當作第二個參數傳遞給 partial()
或者partialLoop()
,把 $model
作為第三個參數。
例如,如果一個你想用一個在 'list' 模塊的 pager partial,就象下面這樣來運用:
<?= $this->partial('pager.phtml', 'list', $pagerData) ?>
這樣,你可以重用原來是特別供給其它模塊使用的 partials 。所以,在共享的視圖腳本路徑里放置可重用的 partials 很可能是個好習慣。
/** * Encode data as JSON, disable layouts, and set response header * * If $keepLayouts is true, does not disable layouts. * * @param mixed $data * @param bool $keepLayouts * NOTE: if boolean, establish $keepLayouts to true|false * if array, admit params for Zend_Json::encode as enableJsonExprFinder=>true|false * this array can contains a 'keepLayout'=>true|false * that will not be passed to Zend_Json::encode method but will be used here * @return string|void */ public function json($data, $keepLayouts = false) { $options = array(); if (is_array($keepLayouts)) { $options = $keepLayouts; $keepLayouts = (array_key_exists('keepLayouts', $keepLayouts)) ? $keepLayouts['keepLayouts'] : false; unset($options['keepLayouts']); } $data = Zend_Json::encode($data, null, $options); if (!$keepLayouts) { require_once 'Zend/Layout.php'; $layout = Zend_Layout::getMvcInstance(); if ($layout instanceof Zend_Layout) { $layout->disableLayout(); } } $response = Zend_Controller_Front::getInstance()->getResponse(); $response->setHeader('Content-Type', 'application/json', true); return $data; }
當創建返回 JSON 的視圖,設置適當的響應頭也非常重要,JSON 視圖助手就是來做這個的。另外,缺省地,它關閉(disable)了布局(如果布局是打開(enable)的),因為布局一般不和 JSON 響應一起使用。
JSON 助手設置下列的頭:
Content-Type: application/json
當解析響應來決定如何處理內容,大部分 AJAX 庫尋找這個頭。
JSON 助手的用法相當簡單:
<?php<?= $this->json($this->data) ?>?>
在國際化章節簡寫說明