Chinaunix首页 | 论坛 | 博客
  • 博客访问: 420728
  • 博文数量: 117
  • 博客积分: 5235
  • 博客等级: 大校
  • 技术积分: 1775
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-12 15:51
文章分类

全部博文(117)

文章存档

2012年(9)

2011年(2)

2010年(21)

2009年(13)

2008年(72)

我的朋友

分类:

2010-03-31 10:11:09

1. 简介
用Smarty来代替ZF的view.即用变量来组织Html结构.
2. 整合
有两种方式
2.1 直接
.1 关闭ZF的view功能
在application.ini文件中
===
resources.frontController.noViewRenderer = 1
===
.2 配置smarty
在application.ini文件中,smarty目录及文件事先准备好
===
[smarty]
smarty.class_path = APPLICATION_PATH "/../smarty/smarty/Smarty.class.php"
smarty.left_delimiter = "<*"
smarty.right_delimiter = "*>"
smarty.template_dir = APPLICATION_PATH "/../smarty/templates"
smarty.compile_dir = APPLICATION_PATH "/../smarty/templates_c"
smarty.cache_dir = APPLICATION_PATH "/../smarty/cache"
smarty.cache_lifetime = 600
smarty.caching = 1
===
.3 初始化smarty
在Bootstrap.php中
===
 public function _initView(){
    //从配置文件中读取smarty的配置,CONFIG_FILE_PATH在index.php中定义
  $config = new Zend_Config_Ini(CONFIG_FILE_PATH.'/application.ini', 'smarty'); 
  //加载smarty库
  require_once $config->smarty->class_path;
  //初始化smarty库
  $smarty = new Smarty();
  $smarty->left_delimiter = $config->smarty->left_delimiter;
  $smarty->right_delimiter = $config->smarty->right_delimiter;
  $smarty->template_dir = $config->smarty->template_dir;
  $smarty->compile_dir = $config->smarty->compile_dir;
  $smarty->cache_dir = $config->smarty->cache_dir;
  $smarty->cache_lifetime = $config->smarty->cache_lifetime;
  $smarty->caching = $config->smarty->caching;
  //将$smarty存入注册器
  Zend_Registry::set('smarty', $smarty);
 }
===
.4 使用
在IndexController.php文件中
===
    //声明一个私有变量
    private $smarty;
    public function init()
    {
     //$this->_helper->viewRenderer->setNoRender(); //禁止view
     //从注册器提取$smarty
     $this->smarty = Zend_Registry::get('smarty');
        /* Initialize action controller here */
    }
    public function indexAction()
    {
      //使用
     $hello = "Hello World!";
     $name = "Jack";
     $this->smarty->assign("hello",$hello);
     $this->smarty->assign("name",$name);
     $this->smarty->display('index.tpl');
    }
===
    小插曲:{$var}与html字符串连接, "Hello {$name}"
2.2 实现view的抽象
.1 在ZendViewSmarty.php文件中
===
require_once '../library/Smarty/Smarty.class.php';
require_once 'Zend/View/Interface.php';
class Zend_View_Smarty implements Zend_View_Interface
{
    /**
     * Smarty object
     * @var Smarty
     */
    private $_smarty;
 
    /**
     * Constructor
     *
     * @param string $tmplPath
     * @param array $extraParams
     * @return void
     */
    public function __construct($tmplPath = null, $extraParams = array())
    {
        $this->_smarty = new Smarty;
 
        if (null !== $tmplPath) {
            $this->setScriptPath($tmplPath);
        }
 
        foreach ($extraParams as $key => $value) {
            $this->_smarty->$key = $value;
        }
    }
 
    /**
     * Return the template engine object
     *
     * @return Smarty
     */
    public function getEngine()
    {
        return $this->_smarty;
    }
 
    /**
     * Set the path to the templates
     *
     * @param string $path The directory to set as the path.
     * @return void
     */
    public function setScriptPath($path)  /////////////////////////此函数重要
    {
        if (is_readable($path)) {
            $this->_smarty->template_dir = $path;
            $this->_smarty->compile_dir = $path."/../templates_c";
            return;
        }
 
        throw new Exception('Invalid path provided');
    }
 
    /**
     * Retrieve the current template directory
     *
     * @return string
     */
    public function getScriptPaths()
    {
        return array($this->_smarty->template_dir);
    }
 
    /**
     * Alias for setScriptPath
     *
     * @param string $path
     * @param string $prefix Unused
     * @return void
     */
    public function setBasePath($path, $prefix = 'Zend_View')
    {
        return $this->setScriptPath($path);
    }
 
    /**
     * Alias for setScriptPath
     *
     * @param string $path
     * @param string $prefix Unused
     * @return void
     */
    public function addBasePath($path, $prefix = 'Zend_View')
    {
        return $this->setScriptPath($path);
    }
 
    /**
     * Assign a variable to the template
     *
     * @param string $key The variable name.
     * @param mixed $val The variable value.
     * @return void
     */
    public function __set($key, $val)
    {
        $this->_smarty->assign($key, $val);
    }
   
    //为了获取_smarty变量
    public function __get($property_name){
   if(isset($this->$property_name)){
   return($this->$property_name);
  }else{
   return(NULL);
  }
  }
    /**
     * Allows testing with empty() and isset() to work
     *
     * @param string $key
     * @return boolean
     */
    public function __isset($key)
    {
        return (null !== $this->_smarty->get_template_vars($key));
    }
 
    /**
     * Allows unset() on object properties to work
     *
     * @param string $key
     * @return void
     */
    public function __unset($key)
    {
        $this->_smarty->clear_assign($key);
    }
 
    /**
     * Assign variables to the template
     *
     * Allows setting a specific key to the specified value, OR passing
     * an array of key => value pairs to set en masse.
     *
     * @see __set()
     * @param string|array $spec The assignment strategy to use (key or
     * array of key => value pairs)
     * @param mixed $value (Optional) If assigning a named variable,
     * use this as the value.
     * @return void
     */
    public function assign($spec, $value = null)
    {
        if (is_array($spec)) {
            $this->_smarty->assign($spec);
            return;
        }
 
        $this->_smarty->assign($spec, $value);
    }
 
    /**
     * Clear all assigned variables
     *
     * Clears all variables assigned to Zend_View either via
     * assign()} or property overloading
     * ( __get()}/{@link __set()}).
     *
     * @return void
     */
    public function clearVars()
    {
        $this->_smarty->clear_all_assign();
    }
 
    /**
     * Processes a template and returns the output.
     *
     * @param string $name The template to process.
     * @return string The output.
     */
    public function render($name)
    {
        return $this->_smarty->fetch($name);
    }
}
?>
===
.2 在index.php中引入该类
require_once 'ZendViewSmarty.php';
.3 在controller中初始化
    public function init()
    {
     $this->view   = new Zend_View_Smarty(APPLICATION_PATH.'/../templates');
        $viewRenderer = $this->_helper->getHelper('viewRenderer');
        $viewRenderer->setView($this->view)
                     ->setViewBasePathSpec($this->view->_smarty->template_dir)
                     ->setViewScriptPathSpec(':controller/:action.:suffix')
                     ->setViewScriptPathNoControllerSpec(':action.:suffix')
                     ->setViewSuffix('tpl');
     
        /* Initialize action controller here */
    }
.4 使用
在controller中使用与$this->view一样;
在*.tpl中却要以Smarty的语法读取变量;
.5 一些说明
输出到templates/controller/action.tpl文件  //如templates/index/index.tpl
在tpl中include时,当前目录为templates
阅读(807) | 评论(0) | 转发(0) |
0

上一篇:Mail 总结

下一篇:集成Ajax

给主人留下些什么吧!~~