网上查了一些资料没发现很好能理解的关于 zend framework、smarty 和 layout 一起使用的方案,自己琢磨了下帖出来分享,大部分代码摘自网络,可能办法比较笨拙,还望高手指正
1、引导文件 index.php
//setup the view renderer
include_once './library/Templater/Templater.php';
$vr = new Zend_Controller_Action_Helper_ViewRenderer();
$vr->setView(new Templater());
$vr->setViewSuffix('tpl');
Zend_Controller_Action_HelperBroker::addHelper($vr);
2、Zend_View_Abstract 的子类 Templater
说明:初始化smarty对象,重定义视图对象的方法
<?php
class Templater extends Zend_View_Abstract{
protected $_engine;
public function __construct(){
require_once('Smarty/Smarty.class.php');
$this->_engine = new SmartyAdvancedDisplay();
//$this->_engine = new Smarty();
$this->_engine->left_delimiter = '{#';
$this->_engine->right_delimiter = '#}';
$this->_engine->compile_dir = './application/views/templates_c';
$this->_engine->cache_dir = './application/views/templates_c/cache_c';
$this->_engine->template_dir = './application/views/templates';
$this->_engine->plugins_dir = './library/Templater/plugins';
}
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->display(strtolower($name));
}
public function _run()
{ }
}
?>
3、Smarty 的子类 SmartyAdvancedDisplay
说明:重定义display方法,使之能够支持layout
class SmartyAdvancedDisplay extends Smarty{
public $layout_name = 'default.tpl';
function display($template,$cache_id,$compile_id,$parent) {
if (!$this->getTemplateVars('template')) {
$this->assign('template',$template);
}
parent::display('layouts/'.$this->layout_name,$cache_id,$compile_id,$parent);
}
function setLayoutName($name){
$this->layout_name = $name;
}
function setActionTemplateDir($dir){
$this->assign('template',$dir);
}
}
4、controller中动态的加载layout
function indexAction() {
$this->view->title = 'zhudong.me的精彩生活从此开始...(期待ing)';
$diaryObj = new Diary();
$tempDiarys = $diaryObj->fetchAll();
foreach ($tempDiarys as $value) {
$postdate = gmdate('Y/m/d H:i',$value['postdate']+8*3600);
$diary['id'] = $value['id'];
$diary['title'] = $value['title'];
$diary['content'] = $value['content'];
$diary['postdate'] = $postdate;
$diarys[] = $diary;
}
$this->view->diarys = $diarys;
//动态加载控制器模版
//$this->view->getEngine()->setActionTemplateDir('index/index.tpl');
//动态加载布局模版
//$this->view->getEngine()->setLayoutName('default.tpl');
}