zend framework & smarty & layout

网上查了一些资料没发现很好能理解的关于 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');
	}

  

posted @ 2011-11-18 12:03  朱冬  阅读(775)  评论(0编辑  收藏  举报