程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 走進Zend Framework框架編程(六):視圖( 第二部分)

走進Zend Framework框架編程(六):視圖( 第二部分)

編輯:PHP綜合
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模板引擎,我們會在別的章節裡介紹。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved