本文实例讲述了Zend Framework实现Zend_View集成Smarty模板系统的方法。分享给大家供大家参考,具体如下:

Zend_View抽象出了Zend_View_Interface,可以让我们集成不同的视图解决方案,例如可以集成smarty。要在zend中使用其他视图系统作为视图,只要实现Zend_View_Interface接口即可。

Zend_View_Interface的接口定义:

<?php/** * Interface class for Zend_View compatible template engine implementations * * @category  Zend * @package  Zend_View * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) * @license  http://framework.zend.com/license/new-bsd   New BSD License */interface Zend_View_Interface{  /**   * Return the template engine object, if any   *   * If using a third-party template engine, such as Smarty, patTemplate,   * phplib, etc, return the template engine object. Useful for calling   * methods on these objects, such as for setting filters, modifiers, etc.   *   * @return mixed   */  public function getEngine();  /**   * Set the path to find the view script used by render()   *   * @param string|array The directory (-ies) to set as the path. Note that   * the concrete view implentation may not necessarily support multiple   * directories.   * @return void   */  public function setScriptPath($path);  /**   * Retrieve all view script paths   *   * @return array   */  public function getScriptPaths();  /**   * Set a base path to all view resources   *   * @param string $path   * @param string $classPrefix   * @return void   */  public function setBasePath($path, $classPrefix = "Zend_View");  /**   * Add an additional path to view resources   *   * @param string $path   * @param string $classPrefix   * @return void   */  public function addBasePath($path, $classPrefix = "Zend_View");  /**   * Assign a variable to the view   *   * @param string $key The variable name.   * @param mixed $val The variable value.   * @return void   */  public function __set($key, $val);  /**   * Allows testing with empty() and isset() to work   *   * @param string $key   * @return boolean   */  public function __isset($key);  /**   * Allows unset() on object properties to work   *   * @param string $key   * @return void   */  public function __unset($key);  /**   * Assign variables to the view script via differing strategies.   *   * Suggested implementation is to allow 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);  /**   * Clear all assigned variables   *   * Clears all variables assigned to Zend_View either via {@link assign()} or   * property overloading ({@link __get()}/{@link __set()}).   *   * @return void   */  public function clearVars();  /**   * Processes a view script and returns the output.   *   * @param string $name The script name to process.   * @return string The script output.   */  public function render($name);}

集成Smarty的基本实现如下:

smarty下载地址

http://www.smarty.net/files/Smarty-3.1.7.tar.gz

目录结构

root@coder-671T-M:/www/zf_demo1# tree.├── application│   ├── Bootstrap.php│   ├── configs│   │   └── application.ini│   ├── controllers│   │   ├── ErrorController.php│   │   └── IndexController.php│   ├── models│   └── views│       ├── helpers│       └── scripts│           ├── error│           │   └── error.phtml│           └── index│               ├── index.phtml│               └── index.tpl├── docs│   └── README.txt├── library│   ├── Lq│   │   └── View│   │       └── Smarty.php│   └── smartylib│       ├── debug.tpl│       ├── plugins│       │   ├── ...........................│       │   └── variablefilter.htmlspecialchars.php│       ├── SmartyBC.class.php│       ├── Smarty.class.php│       └── sysplugins│           ├── ..........................│           └── smarty_security.php├── public│   └── index.php├── temp│   └── smarty│       └── templates_c│           └── 73d91bef3fca4e40520a7751bfdfb3e44b05bdbd.file.index.tpl.php└── tests    ├── application    │   └── controllers    │       └── IndexControllerTest.php    ├── bootstrap.php    ├── library    └── phpunit.xml

24 directories, 134 files

/zf_demo1/library/Lq/View/Smarty.php

<?phprequire_once "smartylib/Smarty.class.php";class Lq_View_Smarty implements Zend_View_Interface {  /**   * Smarty object   *   * @var Smarty   */  protected $_smarty;  /**   * Constructor   *   * @param $tmplPath string   * @param $extraParams array   * @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 $path string   *      The directory to set as the path.   * @return void   */  public function setScriptPath($path) {    if (is_readable ( $path )) {      $this->_smarty->template_dir = $path;      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 $path string   * @param $prefix string   *      Unused   * @return void   */  public function setBasePath($path, $prefix = "Zend_View") {    return $this->setScriptPath ( $path );  }  /**   * Alias for setScriptPath   *   * @param $path string   * @param $prefix string   *      Unused   * @return void   */  public function addBasePath($path, $prefix = "Zend_View") {    return $this->setScriptPath ( $path );  }  /**   * Assign a variable to the template   *   * @param $key string   *      The variable name.   * @param $val mixed   *      The variable value.   * @return void   */  public function __set($key, $val) {    $this->_smarty->assign ( $key, $val );  }  /**   * Retrieve an assigned variable   *   * @param $key string   *      The variable name.   * @return mixed The variable value.   */  public function __get($key) {    return $this->_smarty->get_template_vars ( $key );  }  /**   * Allows testing with empty() and isset() to work   *   * @param $key string   * @return boolean   */  public function __isset($key) {    return (null !== $this->_smarty->get_template_vars ( $key ));  }  /**   * Allows unset() on object properties to work   *   * @param $key string   * @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 $spec string|array   *      The assignment strategy to use (key or array of key   *      => value pairs)   * @param $value mixed   *      (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 {@link assign()} or   * property overloading ({@link __get()}/{@link __set()}).   *   * @return void   */  public function clearVars() {    $this->_smarty->clear_all_assign ();  }  /**   * Processes a template and returns the output.   *   * @param $name string   *      The template to process.   * @return string The output.   */  public function render($name) {    ob_start();    echo $this->_smarty->fetch ( $name );    unset($name);  }}

/zf_demo1/application/configs/application.ini

[production]includePaths.library = APPLICATION_PATH "/../library"bootstrap.path = APPLICATION_PATH "/Bootstrap.php"bootstrap.class = "Bootstrap"appnamespace = "Application"autoloadernamespaces.lq = "Lq_"pluginpaths.Lq_View_Smarty = "Lq/View/Smarty"resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"resources.frontController.params.displayExceptions = 1phpSettings.display_startup_errors = 1phpSettings.display_errors = 1

/zf_demo1/application/Bootstrap.php

<?phpclass Bootstrap extends Zend_Application_Bootstrap_Bootstrap {  /**   * Initialize Smarty view   */  protected function _initSmarty() {    $smarty = new Lq_View_Smarty ();    $smarty->setScriptPath("/www/zf_demo1/application/views/scripts");    return $smarty;  }}

/zf_demo1/application/controllers/IndexController.php

<?phpclass IndexController extends Zend_Controller_Action {  public function init() {    /*     * Initialize action controller here     */  }  public function indexAction() {    $this->_helper->getHelper("viewRenderer")->setNoRender();    $this->view = $this->getInvokeArg ( "bootstrap" )->getResource ( "smarty" );    $this->view->book = "Hello World! ";    $this->view->author = "by smarty";    $this->view->render("index/index.tpl");  }}

/zf_demo1/application/views/scripts/index/index.tpl

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>{$book}{$author}</body></html>

如果需要配置smarty可以打开/zf_demo1/library/smartylib/Smarty.class.php文件进行相应配置例如

/*** Initialize new Smarty object**/public function __construct(){    // selfpointer needed by some other class methods    $this->smarty = $this;    if (is_callable("mb_internal_encoding")) {      mb_internal_encoding(Smarty::$_CHARSET);    }    $this->start_time = microtime(true);    // set default dirs    $this->setTemplateDir("/www/zf_demo1/temp/smarty" . DS . "templates" . DS)      ->setCompileDir("/www/zf_demo1/temp/smarty" . DS . "templates_c" . DS)      ->setPluginsDir(SMARTY_PLUGINS_DIR)      ->setCacheDir("/www/zf_demo1/temp/smarty" . DS . "cache" . DS)      ->setConfigDir("/www/zf_demo1/temp/smarty" . DS . "configs" . DS);    $this->debug_tpl = "file:" . dirname(__FILE__) . "/debug.tpl";    if (isset($_SERVER["SCRIPT_NAME"])) {      $this->assignGlobal("SCRIPT_NAME", $_SERVER["SCRIPT_NAME"]);    }}

更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。