您的位置:首页 > 编程语言 > PHP开发

Zend Framework 与Smarty 的完美整合!

2010-08-30 10:58 253 查看
废话就不说了,思路是这样的:

1. 先把smarty 类库引入项目目录中,建立好smarty 所需要的一些目录(编译目录、缓存目录等);
2. 在library 目录下新建一个文件Templater.php,这个文件中的Templater 类即是采用smarty 后的新的视图类,它继承自Zend_View_Abstract,注意在这个类中要根据smarty 的操作规则重写Zend_View_Abstract 的一些方法,这样的话,在控制器中我们还是使用Zend_View_Abstract 的视图操作方式但本质上却换成了smarty;
3. 在application/Bootstrap.php 文件的添加一个方法_initSmarty 以初始化smarty 并替代原来的模板显示机制;
4. 大功告成,在控制器上的操作与原来没有什么不同,不过此时已经是用smarty 来渲染视图了。

注意:本例中测试的Zend Framework 版本是1.9.x,其他版本可能需要做一些相应的调整。

下面附上一些主要的代码,有疑问的话可跟贴询问 ^_^

<?php
/**
 * library/Templator.php
 * 新的视图类, 采用smarty 模板
 */
class Templater extends Zend_View_Abstract
{
	protected $_path;
	protected $_engine;
	
	/**
	 * 构造函数, 用于构造一个smarty 对象并设置相应的路径
	 */
	public function __construct()
	{
		require_once 'smarty/Smarty.class.php';
		
		$this->_engine = new Smarty();
		$this->_engine->debugging = true;    //开发时暂时打开调试
		$this->_engine->template_dir    = '../application/views';
		$this->_engine->compile_dir     = '../data/tmp/templates_c';
		$this->_engine->config_dir      = '../data/tpl_configs';
		$this->_engine->plugins_dir     = array('plugins', '../data/tpl/plugins');
		$this->_engine->left_delimiter  = '{-';
		$this->_engine->right_delimiter = '-}';
	}
	
	public function getEngine()
	{
		return $this->_engine;
	}
	
	public function __set($key, $val)
	{
		$this->_engine->assign($key, $val);
	}
	
	public function __get($key)
	{
		return $this->_engine->get_template_vars($key);
	}
	
	public function __isset($key)
	{
		return $this->_engine->get_template_vars($key) !== null;
	}
	
	public function __unset($key)
	{
		$this->$engine->clear_assign($key);
	}
	
	/**
	 * 给模板变量赋值的方法, 可传单个值或数组
	 */
	public function assign($spec, $value = null)
	{
		if (is_array($spec)) {
			$this->_engine->assign($spec);
			return;
		}
		$this->_engine->assign($spec, $value);
	}
	
	/**
	 * 重写父类的方法, 清除模板中所有已赋值的变量
	 */
	public function clearVars()
	{
		$this->_engine->clear_all_assign();
	}
	
	/**
	 * 重写父类的方法, 获得模板的内容, 但不输出
	 */
	public function render($name)
	{
		return $this->_engine->fetch(strtolower($name));
	}
	
	public function _run() {}

}


<?php
/**
 * application/Bootstrap.php
 */
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{	
	//其他方法省略...
	
	/**
	 * 引入Smarty 以替代原来的模板显示机制, 即设置新的view renderer!!!
	 */
	function _initSmarty() 
	{
		require_once 'Templater.php';
		$vr = new Zend_Controller_Action_Helper_ViewRenderer();
		$vr->setView(new Templater());
		$vr->setViewSuffix('html');    //指定模板文件的后缀
		Zend_Controller_Action_HelperBroker::addHelper($vr);
	}
}


下面我们来做一个简单的测试

先写一个简单的模板文件application/views/index/index.html:

{-/ $test_val -}


然后是控制器文件application/controllers/IndexController.php:

<?php
/**
 * application/controllers/IndexController.php
 */
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
	{
		$this->view->test_val = 'Hello World~'; //给模板变量赋值
    }
}


访问相应的页面(例如 http://localhost/zendframeworkwithsmarty/ )即可看到Hello World 字样的输出。



一个常见的问题:如何在模板文件中获得项目基地址的引用?

这确实是一个必须要解决的问题,知道的基地址才能够正确的载入外部js/css 文件以及正确的实现页面间的跳转。

:Zend_Controller_Front 类的getBaseUrl 方法可以获取项目基地址,但每次要先获取该实例再调用方法确实很麻烦,可以这样做,新建一个视图助手Zend_View_Helper_BaseUrl,在该视图助手类中定义一个方法(例如baseUrl)以获取基地址,这样在控制器中就可以通过$this->view 对象来调用该方法了($this->view->baseUrl())

<?php
/**
 * application/views/helpers/BaseUrl.php
 */
class Zend_View_Helper_BaseUrl
{
    function baseUrl()
    {
        $fc = Zend_Controller_Front::getInstance();
		$baseUrl = $fc->getBaseUrl();
        return $baseUrl;
    }
}




参考至 《PHP Web 2.0开发实战》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: