Zend Framework实现Zend_View集成Smarty模板系统的方法

5年以前  |  阅读数:1118 次  |  编程语言:PHP 

本文实例讲述了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


    <?php
    require_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 = 1
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1

/zf_demo1/application/Bootstrap.php


    <?php
    class 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


    <?php
    class 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程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例