php教程

超轻量级php框架startmvc

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

更新时间:2020-03-08 01:22:45 作者:startmvc
本文实例讲述了ZendFramework实现Zend_View集成Smarty模板系统的方法。分享给大家供大家参考,

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