php教程

超轻量级php框架startmvc

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

更新时间:2020-03-08 01:22:45 作者:startmvc
本文实例讲述了ZendFramework教程之视图组件Zend_View用法。分享给大家供大家参考,具体如下

本文实例讲述了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 Framework 视图组件 Zend_View