Zend Framework教程之视图组件Zend_View用法详解

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

本文实例讲述了Zend Framework教程之视图组件Zend_View用法。分享给大家供大家参考,具体如下:

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.php

6 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; ?>

更多关于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分页类完整实例