6.6視圖腳本的變量轉義輸出(escaping output)
視圖腳本得到變量以後,需要通過轉義進行輸出,變成頁面可以顯示的Html代碼。 echo $this->escape($this->variable);
$variable變量是在視圖腳本裡用render方法傳遞過來的。
一般情況下,傳遞的變量是通過PHP的 Htmlspecialchars()函數轉義的。而我們也可以實現我們自己的轉義函數。請參考以上“使用回調函數”示例。 6.7視圖腳本的模板系統—操作PHPLib類型的模板
模板系統進一步完美的實現了視圖與程序邏輯的分離。視圖腳本可以完美的操作PHPLib等類型的模板。 6.7.1PHPlib的安裝和調用
為了測試下面的示例,我們必須安裝PHPLib模板系統到我們的環境中。從網上下載到PHPlib-7.4.ZIP安裝壓縮包,解壓到安裝ZEND的library文件夾下,就完成了安裝。
為了在ZF的視圖腳本裡調用得到模板類文件,必須在引導文件Index.php的set_include_path部分添加PHPLib模板類庫文件夾phplib-7.4/PHP到搜索路徑中。以下示例同時包含了Smarty模板引擎的類庫文件的搜索路徑:
set_include_path('.' .
PATH_SEPARATOR . '../library/'.
PATH_SEPARATOR . '../library/phplib-7.4/PHP/'.
PATH_SEPARATOR . '../library/Smarty-2.6.19/libs/'.
PATH_SEPARATOR . 'models/'.
PATH_SEPARATOR . get_include_path() 注意,所有路徑都是以引導文件所在文件夾作為參照的。盡管視圖文件裡所在文件夾不是引導文件所在根目錄,但在視圖文件裡包含PHPLib類庫文件的語句include_once 'template.inc';仍然是以引導文件所在目錄作為參照的。 6.7.2在視圖文件裡調用PHPLib模板
首先包含PHPLib類庫文件,然後聲明模板類的一個實例。使用模板類,首先需要指定一些屬性,比如指定模板所在路徑,指定模板文件等,然後用set_var傳遞模板變量,最後用parse方法調用模板文件。PHPLib模板系統的詳細用法請參考其幫助文檔。 <?PHP
include_once 'template.inc';
$tpl = new Template();
$tpl->set_root('vIEws');
if ($this->books) $tpl->set_file(array(
"booklist" => "booklist.tpl",
"eachbook" => "eachbook.tpl", foreach ($this->books as $key => $val) $tpl->set_var('author', $this->escape($val['author']));
$tpl->set_var('title', $this->escape($val['title']));
$tpl->parse("books", "eachbook", true); $tpl->pparse("output", "booklist"); else $tpl->setFile("nobooks", "nobooks.tpl");
$tpl->pparse("output", "nobooks"); ?>
booklist.tpl文件內容:
<?PHP
if ($this->books):
?>
<table border=1>
<tr>
<th>作者</th>
<th>書名</th>
</tr>
<?PHP
foreach ($this->books as $key => $val):
?>
<tr>
<td><?PHP echo $this->escape($val['author']) ?></td>
<td><?PHP echo $this->escape($val['title']) ?></td>
</tr>
<?PHP endforeach; ?>
</table>
<?PHP
else:
?>
<p>There are no books to display.</p>
<?PHP
endif;
eachbook.tpl文件內容:
<!-- eachbook.tpl -->
<tr>
<td>{author}</td>
<td>{title}</td>
</tr> 6.8視圖腳本的模板系統—使用 Zend_VIEw_Interface調用第三方模板引擎
我們還可以通過實現Zend_VIEw_Interface接口,來得到一個可用的模板系統。
ZF對Zend_VIEw_Interface接口的原始定義:
/** Return the actual template engine object */
public function getEngine();
/* Set the path to vIEw scripts/templates */
public function setScriptPath($path);
/* Set a base path to all vIEw resources */
public function setBasePath($path, $prefix = 'Zend_VIEw');
/* Add an additional base path to vIEw resources */
public function adDBasePath($path, $prefix = 'Zend_VIEw');
/* RetrIEve the current script paths */
public function getScriptPaths();
/* Overloading methods for assigning template variables as object propertIEs */
public function __set($key, $value);
public function __get($key);
public function __isset($key);
public function __unset($key);
/* Manual assignment of template variables, or ability to assign multiple
variables en masse.*/
public function assign($spec, $value = null);
/* Unset all assigned template variables */
public function clearVars();
/* Render the template named $name */
public function render($name);
使用該接口,我們可以很容易的把第三方的模板引擎,比如Smarty,包裝成Zend_VIEw兼容的模板類。 6.8.1Smarty的安裝
下載Smarty軟件包,解壓到ZEND的library文件夾下,就完成了安裝。
為了在ZF的視圖腳本裡調用得到模板類文件,必須在引導文件Index.php的set_include_path部分添加Smarty模板類庫文件夾Smarty-2.6.19/libs到搜索路徑中,參看前面PHPlib的安裝說明部分。
Smarty模板引擎需要建立template_dir和compile_dir文件夾才能工作。ZF手冊裡的示例因為缺少這些設置而無法運行,正確的代碼片段如下:
public function setScriptPath($path) if (is_readable($path)) $this->_smarty->template_dir = $path;
$this->_smarty->compile_dir = $path; //必須加語句:設置編譯路徑
$this->_smarty->cache_dir = $path; //設置緩存路徑
return; ……
我們把對Zend_View_Interface接口的實現的類,放在models文件夾下的ZendVIEwSmarty.PHP文件中,該文件的內容如下:
<?PHP
require_once 'Zend/VIEw/Interface.PHP';
require_once 'Smarty.class.PHP';
class ZendViewSmarty implements Zend_VIEw_Interface /**
* Smarty object
* @var Smarty protected $_smarty; * Constructor
* @param string $tmplPath
* @param array $extraParams
* @return void public function __construct($tmplPath = null, $extraParams = array()) $this->_smarty = new Smarty;
if (null !== $tmplPath) {
$this->setScriptPath($tmplPath); foreach ($extraParams as $key => $value) {
$this->_smarty->$key = $value; } * Return the template engine object
* @return Smarty public function getEngine() return $this->_smarty; /**
* Set the path to the templates
* @param string $path The directory to set as the path.
* @return void public function setScriptPath($path) if (is_readable($path)) {
$this->_smarty->template_dir = $path;
$this->_smarty->compile_dir = $path;
$this->_smarty->cache_dir = $path;
return; throw new Exception('Invalid path provided'); /**
* RetrIEve the current template directory
* @return string public function getScriptPaths() return array($this->_smarty->template_dir); /**
* Alias for setScriptPath
* @param string $path
* @param string $prefix Unused
* @return void public function setBasePath($path, $prefix = 'Zend_VIEw') return $this->setScriptPath($path); /**
* Alias for setScriptPath
* @param string $path
* @param string $prefix Unused
* @return void public function adDBasePath($path, $prefix = 'Zend_VIEw') return $this->setScriptPath($path); /**
* Assign a variable to the template
* @param string $key The variable name.
* @param mixed $val The variable value.
* @return void public function __set($key, $val) $this->_smarty->assign($key, $val); /**
* RetrIEve an assigned variable
* @param string $key The variable name.
* @return mixed The variable value. public function __get($key) return $this->_smarty->get_template_vars($key); /**
* Allows testing with empty() and isset() to work
* @param string $key
* @return boolean public function __isset($key) return (null !== $this->_smarty->get_template_vars($key)); /**
* Allows unset() on object propertIEs to work
* @param string $key
* @return void public function __unset($key) $this->_smarty->clear_assign($key); /**
* Assign variables to the template
* Allows setting a specific key to the specifIEd value, OR passing an array
* of key => value pairs to set en masse.
* @see __set()
* @param string|array $spec The assignment strategy to use (key or array of key
* => value pairs)
* @param mixed $value (Optional) If assigning a named variable, use this
* as the value.
* @return void public function assign($spec, $value = null) if (is_array($spec)) {
$this->_smarty->assign($spec);
return; $this->_smarty->assign($spec, $value); /**
* Clear all assigned variables
* Clears all variables assigned to Zend_VIEw either via [email={@link]{@link[/email] assign()} or
* property overloading ([email={@link]{@link[/email] __get()}/{@link __set()}).
* @return void public function clearVars() $this->_smarty->clear_all_assign(); /**
* Processes a template and returns the output.
* @param string $name The template to process.
* @return string The output. public function render($name) return $this->_smarty->fetch($name); }
?> function smartyAction() $view = new ZendVIEwSmarty(); //實例化新的模板類
$view->setScriptPath('vIEws'); //設置模板文件路徑
$vIEw->book = 'Enter Zend Framework Programme'; //傳遞變量給模板引擎
$vIEw->author = '張慶(網眼)';
echo $vIEw->render('bookinfo.tpl'); //視圖呈現我們看到,由於Smarty模板引擎的良好特性,除過實現上述接口的代碼比較復雜以外,我們這裡的控制代碼要比應用PHPLib模板簡單得多。我們的數據不必像PHPLib引擎那樣,要把數據傳給視圖腳本,再由視圖腳本聲明PHPLib類,再把數據發送給模板去呈現。這裡是在控制腳本裡把數據直接傳遞給 Smarty模板去呈現的。這是因為ZendViewSmarty實現的是Zend_View接口,它和Zend_VIEw的用法是一樣的。
注意:本例只是使用Smarty引擎的其中一種方法。在ZF中還可以用別的形式來使用Smarty模板引擎,我們會在別的章節裡介紹。