程序员人生 网站导航

Zend Framework教程-Zend_View

栏目:ZendFramework时间:2014-02-23 01:04:22

    Zend_View是Zend Framework的视图组件,MVC中的视图层。 Zend_View也是应用的直接对用户展示的页面。这里介绍一下Zend_View的实现类,以及如何和Controller结合在一起的。

View的实现

Zend_View的实现主要是通过如下目录的类实现:

root@coder-671T-M:/library/Zend# tree | grep View.php│   └── View/├── View.php

root@coder-671T-M:/library/Zend/View# tree.├── Abstract.php├── Exception.php├── Helper│   ├── Abstract.php│   ├── Action.php│   ├── BaseUrl.php│   ├── Currency.php│   ├── Cycle.php│   ├── DeclareVars.php│   ├── Doctype.php│   ├── Fieldset.php│   ├── FormButton.php│   ├── FormCheckbox.php│   ├── FormElement.php│   ├── FormErrors.php│   ├── FormFile.php│   ├── FormHidden.php│   ├── FormImage.php│   ├── FormLabel.php│   ├── FormMultiCheckbox.php│   ├── FormNote.php│   ├── FormPassword.php│   ├── Form.php│   ├── FormRadio.php│   ├── FormReset.php│   ├── FormSelect.php│   ├── FormSubmit.php│   ├── FormTextarea.php│   ├── FormText.php│   ├── Gravatar.php│   ├── HeadLink.php│   ├── HeadMeta.php│   ├── HeadScript.php│   ├── HeadStyle.php│   ├── HeadTitle.php│   ├── HtmlElement.php│   ├── HtmlFlash.php│   ├── HtmlList.php│   ├── HtmlObject.php│   ├── HtmlPage.php│   ├── HtmlQuicktime.php│   ├── InlineScript.php│   ├── Interface.php│   ├── Json.php│   ├── Layout.php│   ├── Navigation│   │   ├── Breadcrumbs.php│   │   ├── HelperAbstract.php│   │   ├── Helper.php│   │   ├── Links.php│   │   ├── Menu.php│   │   └── Sitemap.php│   ├── Navigation.php│   ├── PaginationControl.php│   ├── Partial│   │   └── Exception.php│   ├── PartialLoop.php│   ├── Partial.php│   ├── Placeholder│   │   ├── Container│   │   │   ├── Abstract.php│   │   │   ├── Exception.php│   │   │   └── Standalone.php│   │   ├── Container.php│   │   ├── Registry│   │   │   └── Exception.php│   │   └── Registry.php│   ├── Placeholder.php│   ├── RenderToPlaceholder.php│   ├── ServerUrl.php│   ├── TinySrc.php│   ├── Translate.php│   ├── Url.php│   └── UserAgent.php├── Interface.php└── Stream.php6 directories, 70 files

Zend_View和Zend_Controller的整合

主要在Zend_Controller_Action类中,

/**     * Initialize View object     *     * Initializes {@link $view} if not otherwise a Zend_View_Interface.     *     * If {@link $view} is not otherwise set, instantiates a new Zend_View     * object, using the 'views' subdirectory at the same level as the     * controller directory for the current module as the base directory.     * It uses this to set the following:     * - script path = views/scripts/     * - helper path = views/helpers/     * - filter path = views/filters/     *     * @return Zend_View_Interface     * @throws Zend_Controller_Exception if base view directory does not exist     */    public function initView()    {        if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {            return $this->view;        }        require_once 'Zend/View/Interface.php';        if (isset($this->view) && ($this->view instanceof Zend_View_Interface)) {            return $this->view;        }        $request = $this->getRequest();        $module  = $request->getModuleName();        $dirs    = $this->getFrontController()->getControllerDirectory();        if (empty($module) || !isset($dirs[$module])) {            $module = $this->getFrontController()->getDispatcher()->getDefaultModule();        }        $baseDir = dirname($dirs[$module]) . DIRECTORY_SEPARATOR . 'views';        if (!file_exists($baseDir) || !is_dir($baseDir)) {            require_once 'Zend/Controller/Exception.php';            throw new Zend_Controller_Exception('Missing base view directory ("' . $baseDir . '")');        }        require_once 'Zend/View.php';        $this->view = new Zend_View(array('basePath' => $baseDir));        return $this->view;    }    /**     * Render a view     *     * Renders a view. By default, views are found in the view script path as     * <controller>/<action>.phtml. You may change the script suffix by     * resetting {@link $viewSuffix}. You may omit the controller directory     * prefix by specifying boolean true for $noController.     *     * By default, the rendered contents are appended to the response. You may     * specify the named body content segment to set by specifying a $name.     *     * @see Zend_Controller_Response_Abstract::appendBody()     * @param  string|null $action Defaults to action registered in request object     * @param  string|null $name Response object named path segment to use; defaults to null     * @param  bool $noController  Defaults to false; i.e. use controller name as subdir in which to search for view script     * @return void     */    public function render($action = null, $name = null, $noController = false)    {        if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {            return $this->_helper->viewRenderer->render($action, $name, $noController);        }        $view   = $this->initView();        $script = $this->getViewScript($action, $noController);        $this->getResponse()->appendBody(            $view->render($script),            $name        );    }    /**     * Render a given view script     *     * Similar to {@link render()}, this method renders a view script. Unlike render(),     * however, it does not autodetermine the view script via {@link getViewScript()},     * but instead renders the script passed to it. Use this if you know the     * exact view script name and path you wish to use, or if using paths that do not     * conform to the spec defined with getViewScript().     *     * By default, the rendered contents are appended to the response. You may     * specify the named body content segment to set by specifying a $name.     *     * @param  string $script     * @param  string $name     * @return void     */    public function renderScript($script, $name = null)    {        if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) {            return $this->_helper->viewRenderer->renderScript($script, $name);        }        $view = $this->initView();        $this->getResponse()->appendBody(            $view->render($script),            $name        );    }
 

Zend_View.php类

<?php/** * Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. * * @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 * @version    $Id: View.php 23775 2011-03-01 17:25:24Z ralph $ *//** * Abstract master class for extension. */require_once 'Zend/View/Abstract.php';/** * Concrete class for handling view scripts. * * @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 */class Zend_View extends Zend_View_Abstract{    /**     * Whether or not to use streams to mimic short tags     * @var bool     */    private $_useViewStream = false;    /**     * Whether or not to use stream wrapper if short_open_tag is false     * @var bool     */    private $_useStreamWrapper = false;    /**     * Constructor     *     * Register Zend_View_Stream stream wrapper if short tags are disabled.     *     * @param  array $config     * @return void     */    public function __construct($config = array())    {        $this->_useViewStream = (bool) ini_get('short_open_tag') ? false : true;        if ($this->_useViewStream) {            if (!in_array('zend.view', stream_get_wrappers())) {                require_once 'Zend/View/Stream.php';                stream_wrapper_register('zend.view', 'Zend_View_Stream');            }        }        if (array_key_exists('useStreamWrapper', $config)) {            $this->setUseStreamWrapper($config['useStreamWrapper']);        }        parent::__construct($config);    }    /**     * Set flag indicating if stream wrapper should be used if short_open_tag is off     *     * @param  bool $flag     * @return Zend_View     */    public function setUseStreamWrapper($flag)    {        $this->_useStreamWrapper = (bool) $flag;        return $this;    }    /**     * Should the stream wrapper be used if short_open_tag is off?     *     * @return bool     */    public function useStreamWrapper()    {        return $this->_useStreamWrapper;    }    /**     * Includes the view script in a scope with only public $this variables.     *     * @param string The view script to execute.     */    protected function _run()    {        if ($this->_useViewStream && $this->useStreamWrapper()) {            include 'zend.view://' . func_get_arg(0);        } else {            include func_get_arg(0);        }    }}


默认情况会自动通过Controller会通过render方法来实例化Zend_View, 然后rener到对应的视图文件中。当然可以自己实例化Zend_View,然后使用。

action默认指向的文件是和action的名称相同,如果要指定视图文件,可以通过$this->render的相关方法指定.也可以通过addScriptPath和setScriptPath设置视图文件的目录。

例如

$view = new Zend_View();$view->addScriptPath('/www/app/myviews');$view->addScriptPath('/www/app/viewscomm');// 如果调用 $view->render('example.php'), Zend_View 将// 首先查找 "/www/app/myviews/example.php", 找不到再找"/www/app/viewscomm/example.php", 如果还找不到,最后查找当前目录下/的"example.php".



Zend_View的常用方法

   public function __construct($config = array())

    构造函数参数 

     例如array(
          'escape' => array(),
          'encoding' => array(),
      );

    常见key:

     escape、encoding、basePath、basePathPrefix、scriptPath、helperPath、 helperPathPrefix、filterPath、filterPathPrefix、filter  


   public function getEngine() Return the template engine object

 
  public function init()初始化函数
 
    /**
     * Given a base path, sets the script, helper, and filter paths relative to it
     *
     * Assumes a directory structure of:
     * <code>
     * basePath/
     *     scripts/
     *     helpers/
     *     filters/
     * </code>
     *
     * @param  string $path
     * @param  string $prefix Prefix to use for helper and filter paths
     * @return Zend_View_Abstract
     */
    public function setBasePath($path, $classPrefix = 'Zend_View')
 

    /**
     * Given a base path, add script, helper, and filter paths relative to it
     *
     * Assumes a directory structure of:
     * <code>
     * basePath/
     *     scripts/
     *     helpers/
     *     filters/
     * </code>
     *
     * @param  string $path
     * @param  string $prefix Prefix to use for helper and filter paths
     * @return Zend_View_Abstract
     */
    public function addBasePath($path, $classPrefix = 'Zend_View')
 
    public function addScriptPath($path)Adds to the stack of view script paths in LIFO order.
 
    public function setScriptPath($path) Resets the stack of view script paths.
  
    public function getScriptPath($name)Return full path to a view script specified by $name 
 
    public function getScriptPaths()Returns an array of all currently set script paths

 
    public function addHelperPath($path, $classPrefix = 'Zend_View_Helper_')Adds to the stack of helper paths in LIFO order.
 
 
    public function setHelperPath($path, $classPrefix = 'Zend_View_Helper_')Resets the stack of helper paths.
 
    public function getHelperPath($name) Get full path to a helper class file specified by $name
 
    public function getHelperPaths()Returns an array of all currently set helper paths
 
    public function getHelper($name) Get a helper by name    
 
    public function getHelpers()Get array of all active helpers
 
    public function getAllPaths() Return associative array of path types => paths
 
    public function setEscape($spec)    


    /**
     * Assigns variables to the view script via differing strategies.
     *
     * Zend_View::assign('name', $value) assigns a variable called 'name'
     * with the corresponding $value.
     *
     * Zend_View::assign($array) assigns the array keys as variable
     * names (with the corresponding array values).
     *
     * @see    __set()
     * @param  string|array The assignment strategy to use.
     * @param  mixed (Optional) If assigning a named variable, use this
     * as the value.
     * @return Zend_View_Abstract Fluent interface
     * @throws Zend_View_Exception if $spec is neither a string nor an array,
     * or if an attempt to set a private or protected member is detected
     */
    public function assign($spec, $value = null)   
   

在controller的action可以通过assign传递参数到视图脚本。

例如

$this->view->assign('roles', $roles);$this->view->assign('num', $num);$this->view->assign('a', $a);


或者也可以用

 

$this->view->roles=$roles;$this->view->a=$a;



    public function render($name) Processes a view script and returns the output. 
 
    public function escape($var):Escapes a value for output in a view script. 
 
    public function setEncoding($encoding) Set encoding to use with htmlentities() and htmlspecialchars()
 
    public function getEncoding() :Return current escape encoding 



视图脚本文件中的常见用法:

获取传递过来的值

$this->roles

使用一些常见的助手方法:

$this->baseUrl();$this->url();$this->paginationControl();$this->partial()



视图常见用法举例

在bootstrap初始化view或者controller的init文件中

	/**	 * Initialize the common view helper 	 */	protected function _initViewHelper()	{		$boot=$this->bootstrap('View');		$view = $boot->getResource('View');                 $view->setHelperPath('Sql/View/Helper', 'Sql_View_Helper');	}	

action中

		/** 	 * 	 * @return void	 */	public function listAction() 	{		 		$this->view->assign('data', $data);		 	}


视图文件
list.phtml

<?php foreach ($this->data as $item) : ?>		 <tr style="height: 19px;">		 		<td  class="datagrid-cell"><?php echo($item->item1);?></td> </tr>				 <?php endforeach; ?>		 


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐