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,其他版本可能需要做一些相应的调整。
下面附上一些主要的代码,有疑问的话可跟贴询问 ^_^
下面我们来做一个简单的测试。
先写一个简单的模板文件application/views/index/index.html:
然后是控制器文件application/controllers/IndexController.php:
访问相应的页面(例如 http://localhost/zendframeworkwithsmarty/ )即可看到Hello World 字样的输出。
一个常见的问题:如何在模板文件中获得项目基地址的引用?
这确实是一个必须要解决的问题,知道的基地址才能够正确的载入外部js/css 文件以及正确的实现页面间的跳转。
答:Zend_Controller_Front 类的getBaseUrl 方法可以获取项目基地址,但每次要先获取该实例再调用方法确实很麻烦,可以这样做,新建一个视图助手Zend_View_Helper_BaseUrl,在该视图助手类中定义一个方法(例如baseUrl)以获取基地址,这样在控制器中就可以通过$this->view 对象来调用该方法了($this->view->baseUrl())
参考至 《PHP Web 2.0开发实战》
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开发实战》
相关文章推荐
- Zend Framework 整合Smarty 的方法
- Zend Framework 整合 Smarty 模板视图
- Zend Framework整合Smarty方法[转]
- CI 2.2 + smarty 3.1.18 完美整合配置成功
- Zend Framework整合smarty方法
- Zend Framework 整合 Smarty 模板引擎(ZF Study)
- Zend Framework整合smarty方法
- PHP Yaf 整合 Zend framework 1 和 smarty 2
- Zend Framework 1.10.x 多模块整合smarty模板
- Zend Framework 1.10.x 多模块 多引导设置 整合smarty模板
- [转]最原始的Zend Framework整合Smarty简易方法
- (转)Ext与.NET超完美整合 .NET开发者的超级优势
- Spring Boot和Kotlin的无缝整合与完美交融
- 《红色警戒3》简体中文完美整合版下载
- dede整合discuz后完美实现双向同步登入登出解决方案
- ci 框架整合smarty
- IIS和TOMCATE6完美整合
- Zend Framework 1.x+jQuery EasyUI 1.3.4 整合二:构建项目
- (转)Ext与.NET超完美整合 .NET开发者的超级优势