Zend Framework 是 PHP 官方出的開發框架,隨著 PHP5 的推廣,越來越多的人開始學習、使用 Zend Framework。 Smarty 是一個非常強大的模版引擎,由於其完善的語法、內置的緩存功能,已經被眾多開發人員應用在自己的開發項目中。
正因為二者的強大,因此有越來越多的人開始考慮將 Smarty 集成到 Zend Framework ,以便充分的發揮各自的優點。本文翻譯自 Zend Developer Zone 。翻譯為意譯,由於水平有限,纰漏在所難免,歡迎指出翻譯中出現的問題。
原文作者首先指明了整合的目的:(1)保留 Zend_View 提供的 API;(2)利用 Smarty 提供的緩存功能。
目錄結構:
文件名是按照作者的公司(Travello)命名:
Code:
/Zend
/View
/Travello
/View
Smarty.php
定義類和構造函數:
首先是定義類和構造函數, Travello_View_Smarty 是繼承自 Zend_View_Abstract,在構造函數中首先調用了父類的構造函數,然後將初始化好的 Smarty 對象存儲在 private 屬性中。
注意:這裡使用了 configuration 對象存取 Smarty 的配置信息。
PHP:
<?php class Travello_View_Smarty extends Zend_View_Abstract { private $_smarty = false; public function __construct($data = array()) { parent::__construct($data); $config = Zend::registry('config'); $this->_smarty = new Smarty(); $this->_smarty->caching = $config->getSetting('smarty', 'caching'); $this->_smarty->cache_lifetime = $config->getSetting('smarty', 'cache_lifetime'); $this->_smarty->template_dir = $config->getSetting('smarty', 'template_dir'); $this->_smarty->compile_dir = $config->getSetting('smarty', 'compile_dir'); $this->_smarty->config_dir = $config->getSetting('smarty', 'config_dir'); $this->_smarty->cache_dir = $config->getSetting('smarty', 'cache_dir'); }
實現 _run() 方法:
_run() 是唯一的需要在 Zend_View_Abstract 子類中實現的方法,他會自動在 render() 方法中被調用,這裡使用了 Smarty 的 display() 方法來輸出模版。
PHP:
<?php protected function _run($template) { $this->_smarty->display($template); }
重寫 assign() 方法:
下面是要重寫 Zend_View_Abstract 下面的 assign() 方法,我們直接將參數值賦到 Smarty 對象,而不是默認的 Zend_View_Abstract 的 $this->_vars 數組。
PHP:
<?php public function assign($var) { if (is_string($var)) { $value = @func_get_arg(1); $this->_smarty->assign($var, $value); } elseif (is_array($var)) { foreach ($var as $key => $value) { $this->_smarty->assign($key, $value); } } else { throw new Zend_View_Exception('assign() expects a string or array, got '.gettype($var)); } }
重寫 escape() 方法:
下面是要重寫 Zend_View_Abstract 下面的 escape() 方法,使用的是 Zend_View_Abstract 內置的 escape() 方法,但是能夠根據傳入的字符串或者數組作出相應處理。
PHP:
<?php public function escape($var) { if (is_string($var)) { return parent::escape($var); } elseif (is_array($var)) { foreach ($var as $key => $val) { $var[$key] = $this->escape($val); } return $var; } else { return $var; } }
打印輸出:
output() 是對 Zend_View_Abstract 中 render() 方法的封裝,增加了一些 header 設置:
PHP:
<?php public function output($name) { header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-cache"); header("Pragma: no-cache"); header("Cache-Control: post-check=0, pre-check=0", FALSE); print parent::render($name); }
使用 Smarty 的緩存:
最後的2個方法是為了在 View 類中整合 Smarty 的緩存機制,第一個方法是檢查是否已經緩存,第二個是設置是否打開緩存功能。
PHP:
<?php public function isCached($template) { if ($this->_smarty->is_cached($template)) { return true; } return false; } public function setCaching($caching) { $this->_smarty->caching = $caching; } } // end Travello_View_Smarty ?>
上面是完整的 Travello_View_Smarty 代碼。
使用說明:
使用非常簡單,在你的導入文件(通常是 index.php ,譯注)中,可以用下面的方法初始化, $viewConfig 是設置 Zend_View 的路徑,一旦創建好對象後,就將他存在對象中,方便後面調用。
PHP:
<?php $viewConfig = array(); $viewConfig['scriptPath'] = $config->getSetting('framework', 'view_dir'); $view = new Travello_View_Smarty($viewConfig); Zend::register('view', $view); ?>
在你的 controller 和 action 方法中可以這樣使用:
PHP:
<?php public function indexAction() { $temp_file = 'homepage.htm'; $view = Zend::registry('view'); if (false === $view->isCached($temp_file)) { $vars = array(); $vars['title' ] = 'Page <title>'; $vars['text' ] = 'A text is a text & a text is a text.'; $vars['numbers'][0] = 12.9; $vars['numbers'][1] = 29; $vars['numbers'][2] = 78; $vars = $view->escape($vars); $view->assign($vars); } $view->output($temp_file); } ?>