本文实例讲述了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. * * @categoryZend * @packageZend_View * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) * @licensehttp://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. * * @categoryZend * @packageZend_View * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) * @licensehttp://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 $namepublic function getScriptPaths()Returns an array of all currently set script pathspublic 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 $namepublic function getHelperPaths()Returns an array of all currently set helper pathspublic function getHelper($name) Get a helper by namepublic function getHelpers()Get array of all active helperspublic function getAllPaths() Return associative array of path types => pathspublic 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程序设计有所帮助。