Zend Framework 是 PHP 官方出的开发框架,随着 PHP5 的推广,越来越多的人开始学习、使用 Zend Framework。 Smarty 是一个非常强大的模版引擎,由于其完善的语法、内置的缓存功能,已经被众多开发人员应用在自己的开发项目中。
正因为二者的强大,因此有越来越多的人开始考虑将 Smarty 集成到 Zend Framework ,以便充分的发挥各自的优点。本文翻译自 Zend Developer Zone 。翻译为意译,由于水平有限,纰漏在所难免,欢迎指出翻译中出现的问题。本文为 CodeBit.cn ( http://www.codebit.cn ) 组织翻译,转载请注明出处。
原文作者首先指明了整合的目的:(1)保留 Zend_View 提供的 API;(2)利用 Smarty 提供的缓存功能。
目录结构:
文件名是按照作者的公司(Travello)命名:
Co de:
/Zend
/View
/Travello
/View
Smarty.php
定义类和构造函数:
首先是定义类和构造函数, Travello_View_Smarty 是继承自 Zend_View_Abstract,在构造函数中首先调用了父类的构造函数,然后将初始化好的 Smarty 对象存储在 private 属性中。
注意:这里使用了 configuration 对象存取 Smarty 的配置信息。
PHP:
实现 _run() 方法:
_run() 是唯一的需要在 Zend_View_Abstract 子类中实现的方法,他会自动在 render() 方法中被调用,这里使用了 Smarty 的 display() 方法来输出模版。
PHP:
重写 assign() 方法:
下面是要重写 Zend_View_Abstract 下面的 assign() 方法,我们直接将参数值赋到 Smarty 对象,而不是默认的 Zend_View_Abstract 的 $this->_vars 数组。
PHP:
重写 escape() 方法:
下面是要重写 Zend_View_Abstract 下面的 escape() 方法,使用的是 Zend_View_Abstract 内置的 escape() 方法,但是能够根据传入的字符串或者数组作出相应处理。
PHP:
打印输出:
output() 是对 Zend_View_Abstract 中 render() 方法的封装,增加了一些 header 设置:
PHP:
使用 Smarty 的缓存:
最后的2个方法是为了在 View 类中整合 Smarty 的缓存机制,第一个方法是检查是否已经缓存,第二个是设置是否打开缓存功能。
PHP:
上面是完整的 Travello_View_Smarty 代码。
使用说明:
使用非常简单,在你的导入文件(通常是 index.php ,译注)中,可以用下面的方法初始化, $viewConfig 是设置 Zend_View 的路径,一旦创建好对象后,就将他存在对象中,方便后面调用。
PHP:
在你的 controller 和 act ion 方法中可以这样使用:
PHP:
正因为二者的强大,因此有越来越多的人开始考虑将 Smarty 集成到 Zend Framework ,以便充分的发挥各自的优点。本文翻译自 Zend Developer Zone 。翻译为意译,由于水平有限,纰漏在所难免,欢迎指出翻译中出现的问题。本文为 CodeBit.cn ( http://www.codebit.cn ) 组织翻译,转载请注明出处。
原文作者首先指明了整合的目的:(1)保留 Zend_View 提供的 API;(2)利用 Smarty 提供的缓存功能。
目录结构:
文件名是按照作者的公司(Travello)命名:
Co
/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($da
ta = array()) - {
- parent::__construct($da
ta); - $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 和 act
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);
- }
- ?>