您的位置:首页 > 编程语言 > PHP开发

Zend Framework教程-Zend_View集成Smarty模板系统

2012-02-06 13:25 459 查看
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']);
        }
    }
......................
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: