Zend和Smarty的3集成使用

我试图改变在我的控制器,它似乎只覆盖它,只有追加布局的内容。

我已经建立了使用Zend和Smarty的一个CMS。 我有一个主要的布局,显示每个页面内容:

{$this->layout()->content}

虽然当我尝试覆盖控制器中的“内容”与新的内容区域这会导致显示这两个指数/在index.tpl和接触/ contact.tpl:

$this->view->content = $this->view->display('contact/contact.tpl');

我知道我可以手动指定内容到视图Smarty的变量,但我想,以减少智者的分配和使用的Zend。

在我的application.ini

smarty.caching = 1 smarty.cache_lifetime = 14400 smarty.template_dir = PATH "/templates/default/" smarty.compile_dir = PATH "/tmp/smarty_compile/" smarty.plugins_dir = APPLICATION_PATH "/plugins/smarty/" smarty.config_dir = "" smarty.cache_dir = PATH "/tmp/smarty_cache/" smarty.left_delimiter = "{" smarty.right_delimiter = "}"

在我的bootstrap.php中

protected function _initView() { $view = new Web_View_Smarty($this->getOption('smarty')); $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer'); $viewRenderer->setViewSuffix('tpl'); $viewRenderer->setView($view); $this->bootstrap('layout'); $layout = Zend_Layout::getMvcInstance(); $layout->setViewSuffix('tpl'); return $view; }

在我Smarty.php

<?php /** * Smarty template engine integration into Zend Framework */ class Web_View_Smarty extends Zend_View_Abstract { /** * Instance of Smarty * @var Smarty */ protected $_smarty = null; /** * Template explicitly set to render in this view * @var string */ protected $_customTemplate = ''; /** * Smarty config * @var array */ private $_config = null; /** * Class definition and constructor * * Let's start with the class definition and the constructor part. My class Travello_View_Smarty is extending the Zend_View_Abstract class. In the constructor the parent constructor from Zend_View_Abstract is called first. After that a Smarty object is instantiated, configured and stored in a private attribute. * Please note that I use a configuration object from the object store to get the configuration data for Smarty. * * @param array $smartyConfig * @param array $config */ public function __construct($smartyConfig, $config = array()) { $this->_config = $smartyConfig; parent::__construct($config); $this->_loadSmarty(); } /** * Return the template engine object * * @return Smarty */ public function getEngine() { return $this->_smarty; } /** * Implement _run() method * * The method _run() is the only method that needs to be implemented in any subclass of Zend_View_Abstract. It is called automatically within the render() method. My implementation just uses the display() method from Smarty to generate and output the template. * * @param string $template */ protected function _run() { $file = func_num_args() > 0 && file_exists(func_get_arg(0)) ? func_get_arg(0) : ''; if ($this->_customTemplate || $file) { $template = $this->_customTemplate; if (!$template) { $template = $file; } $this->_smarty->display($template); } else { throw new Zend_View_Exception('Cannot render view without any template being assigned or file does not exist'); } } /** * Overwrite assign() method * * The next part is an overwrite of the assign() method from Zend_View_Abstract, which works in a similar way. The big difference is that the values are assigned to the Smarty object and not to the $this->_vars variables array of Zend_View_Abstract. * * @param string|array $var * @return Ext_View_Smarty */ public function assign($var, $value = null) { if (is_string($var)) { $this->_smarty->assign($var, $value); } elseif (is_array($var)) { foreach ($var as $key => $value) { $this->assign($key, $value); } } else { throw new Zend_View_Exception('assign() expects a string or array, got '.gettype($var)); } return $this; } public function display($template){ $this->clearVars(); $this->_smarty->display($template); return $this; } /** * Overwrite escape() method * * The next part is an overwrite of the escape() method from Zend_View_Abstract. It works both for string and array values and also uses the escape() method from the Zend_View_Abstract. The advantage of this is that I don't have to care about each value of an array to get properly escaped. * * @param mixed $var * @return mixed */ public function escape($var) { if (is_string($var)) { return parent::escape($var); } elseif (is_array($var)) { foreach ($var as $key => $val) { $var[$key] = $this->escape($val); } } return $var; } /** * Print the output * * The next method output() is a wrapper on the render() method from Zend_View_Abstract. It just sets some headers before printing the output. * * @param <type> $name */ public function output($name) { header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-cache"); header("Pragma: no-cache"); header("Cache-Control: post-check=0, pre-check=0", false); print parent::render($name); } /** * Use Smarty caching * * The last two methods were created to simply integrate the Smarty caching mechanism in the View class. With the first one you can check for cached template and with the second one you can set the caching on or of. * * @param string $template * @return bool */ public function isCached($template) { return $this->_smarty->is_cached($template); } /** * Enable/disable caching * * @param bool $caching * @return Ext_View_Smarty */ public function setCaching($caching) { $this->_smarty->caching = $caching; return $this; } /** * Template getter (return file path) * @return string */ public function getTemplate() { return $this->_customTemplate; } /** * Template filename setter * @param string * @return Ext_View_Smarty */ public function setTemplate($tpl) { $this->_customTemplate = $tpl; return $this; } /** * Magic setter for Zend_View compatibility. Performs assign() * * @param string $key * @param mixed $val */ public function __set($key, $val) { $this->assign($key, $val); } /** * Magic getter for Zend_View compatibility. Retrieves template var * * @param string $key * @return mixed */ public function __get($key) { return $this->_smarty->getTemplateVars($key); } /** * Magic getter for Zend_View compatibility. Removes template var * * @see View/Zend_View_Abstract::__unset() * @param string $key */ public function __unset($key) { $this->_smarty->clearAssign($key); } /** * Allows testing with empty() and isset() to work * Zend_View compatibility. Checks template var for existance * * @param string $key * @return boolean */ public function __isset($key) { return (null !== $this->_smarty->getTemplateVars($key)); } /** * Zend_View compatibility. Retrieves all template vars * * @see Zend_View_Abstract::getVars() * @return array */ public function getVars() { return $this->_smarty->getTemplateVars(); } /** * Updates Smarty's template_dir field with new value * * @param string $dir * @return Ext_View_Smarty */ public function setTemplateDir($dir) { $this->_smarty->setTemplateDir($dir); return $this; } /** * Adds another Smarty template_dir to scan for templates * * @param string $dir * @return Ext_View_Smarty */ public function addTemplateDir($dir) { $this->_smarty->addTemplateDir($dir); return $this; } /** * Adds another Smarty plugin directory to scan for plugins * * @param string $dir * @return Ext_View_Smarty */ public function addPluginDir($dir) { $this->_smarty->addPluginsDir($dir); return $this; } /** * Zend_View compatibility. Removes all template vars * * @see View/Zend_View_Abstract::clearVars() * @return Ext_View_Smarty */ public function clearVars() { $this->_smarty->clearAllAssign(); $this->assign('this', $this); return $this; } /** * Zend_View compatibility. Add the templates dir * * @see View/Zend_View_Abstract::addBasePath() * @return Ext_View_Smarty */ public function addBasePath($path, $classPrefix = 'Zend_View') { parent::addBasePath($path, $classPrefix); $this->addScriptPath(PATH . '/templates/default'); $this->addTemplateDir(PATH . '/templates/shared'); return $this; } /** * Zend_View compatibility. Set the templates dir instead of scripts * * @see View/Zend_View_Abstract::setBasePath() * @return Ext_View_Smarty */ public function setBasePath($path, $classPrefix = 'Zend_View') { parent::setBasePath($path, $classPrefix); $this->setScriptPath(PATH . '/templates/default'); $this->addTemplateDir(PATH . '/templates/shared'); return $this; } /** * Magic clone method, on clone create diferent smarty object */ public function __clone() { $this->_loadSmarty(); } /** * Initializes the smarty and populates config params * * @throws Zend_View_Exception * @return void */ private function _loadSmarty() { if (!class_exists('Smarty', true)) { require_once 'Smarty/Smarty.class.php'; } $this->_smarty = new Smarty(); if ($this->_config === null) { throw new Zend_View_Exception("Could not locate Smarty config - node 'smarty' not found"); } $this->_smarty->caching = $this->_config['caching']; $this->_smarty->cache_lifetime = $this->_config['cache_lifetime']; $this->_smarty->template_dir = $this->_config['template_dir']; $this->_smarty->compile_dir = $this->_config['compile_dir']; $this->_smarty->config_dir = $this->_config['config_dir']; $this->_smarty->plugins_dir = $this->_config['plugins_dir']; $this->_smarty->cache_dir = $this->_config['cache_dir']; $this->_smarty->left_delimiter = $this->_config['left_delimiter']; $this->_smarty->right_delimiter = $this->_config['right_delimiter']; $this->assign('this', $this); } }

--------------解决方案-------------

有一个在Zend的文档Smarty的实现。 Smarty的是坏的,任何模板引擎不好,放慢您的应用程序。 使用Zend的原生景观。 请记住,PHP是被发明是一个模板引擎。 http://framework.zend.com/manual/1.11/en/zend.view.scripts.html

当您的模板,你写

{$this->layout()->content}

这是在布局辅助的内容,将呈现相关联的每个动作的图。

当在你的控制器,你写

$this->view->content = $this->view->display('contact/contact.tpl');

您分配一个变量来你的看法,这可以是显示屏,采用

{$content}

在智者的模板。

我觉得你有你整理了这一点的方式有些混乱。 看一看http://framework.zend.com/manual/1.12/en/zend.layout.quickstart.html

不管怎样,你的问题是旧的,你已经选择了一个答案正确的,这是不是真的对了答案,但我不能路过,说什么。 使用Smarty的与Zend是伟大的,Smarty的速度更快和编译/缓存有更好的微调比Zend和两者之间的整合是整齐的(感谢依赖注入)。 您可以在一个应用程序这两个库的力量,所以去了。

分类:php 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.610 (s). 10 q(s)