当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-13 11:15:38 浏览: 评论:0 

本文实例讲述了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

  1. ├── Abstract.php 
  2. ├── Exception.php 
  3. ├── Helper 
  4. │   ├── Abstract.php 
  5. │   ├── Action.php 
  6. │   ├── BaseUrl.php 
  7. │   ├── Currency.php 
  8. │   ├── Cycle.php 
  9. │   ├── DeclareVars.php 
  10. │   ├── Doctype.php 
  11. │   ├── Fieldset.php 
  12. │   ├── FormButton.php 
  13. │   ├── FormCheckbox.php 
  14. │   ├── FormElement.php 
  15. │   ├── FormErrors.php 
  16. │   ├── FormFile.php 
  17. │   ├── FormHidden.php 
  18. │   ├── FormImage.php 
  19. │   ├── FormLabel.php 
  20. │   ├── FormMultiCheckbox.php 
  21. │   ├── FormNote.php 
  22. │   ├── FormPassword.php 
  23. │   ├── Form.php 
  24. │   ├── FormRadio.php 
  25. │   ├── FormReset.php 
  26. │   ├── FormSelect.php 
  27. │   ├── FormSubmit.php 
  28. │   ├── FormTextarea.php 
  29. │   ├── FormText.php 
  30. │   ├── Gravatar.php 
  31. │   ├── HeadLink.php 
  32. │   ├── HeadMeta.php 
  33. │   ├── HeadScript.php 
  34. │   ├── HeadStyle.php 
  35. │   ├── HeadTitle.php 
  36. │   ├── HtmlElement.php 
  37. │   ├── HtmlFlash.php 
  38. │   ├── HtmlList.php 
  39. │   ├── HtmlObject.php 
  40. │   ├── HtmlPage.php 
  41. │   ├── HtmlQuicktime.php 
  42. │   ├── InlineScript.php 
  43. │   ├── Interface.php 
  44. │   ├── Json.php 
  45. │   ├── Layout.php 
  46. │   ├── Navigation 
  47. │   │   ├── Breadcrumbs.php 
  48. │   │   ├── HelperAbstract.php 
  49. │   │   ├── Helper.php 
  50. │   │   ├── Links.php 
  51. │   │   ├── Menu.php 
  52. │   │   └── Sitemap.php 
  53. │   ├── Navigation.php 
  54. │   ├── PaginationControl.php 
  55. │   ├── Partial 
  56. │   │   └── Exception.php 
  57. │   ├── PartialLoop.php 
  58. │   ├── Partial.php 
  59. │   ├── Placeholder 
  60. │   │   ├── Container 
  61. │   │   │   ├── Abstract.php 
  62. │   │   │   ├── Exception.php 
  63. │   │   │   └── Standalone.php 
  64. │   │   ├── Container.php 
  65. │   │   ├── Registry 
  66. │   │   │   └── Exception.php 
  67. │   │   └── Registry.php 
  68. │   ├── Placeholder.php 
  69. │   ├── RenderToPlaceholder.php 
  70. │   ├── ServerUrl.php 
  71. │   ├── TinySrc.php 
  72. │   ├── Translate.php 
  73. │   ├── Url.php 
  74. │   └── UserAgent.php 
  75. ├── Interface.php 
  76. └── Stream.php 

6 directories, 70 files

Zend_View和Zend_Controller的整合

主要在Zend_Controller_Action类中,

  1. /** 
  2.    * Initialize View object 
  3.    * 
  4.    * Initializes {@link $view} if not otherwise a Zend_View_Interface. 
  5.    * 
  6.    * If {@link $view} is not otherwise set, instantiates a new Zend_View 
  7.    * object, using the 'views' subdirectory at the same level as the 
  8.    * controller directory for the current module as the base directory. 
  9.    * It uses this to set the following: 
  10.    * - script path = views/scripts/ 
  11.    * - helper path = views/helpers/ 
  12.    * - filter path = views/filters/ 
  13.    * 
  14.    * @return Zend_View_Interface 
  15.    * @throws Zend_Controller_Exception if base view directory does not exist 
  16.    */ 
  17.   public function initView() 
  18.   { 
  19.     if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { 
  20.       return $this->view; 
  21.     } 
  22.     require_once 'Zend/View/Interface.php'
  23.     if (isset($this->view) && ($this->view instanceof Zend_View_Interface)) { 
  24.       return $this->view; 
  25.     } 
  26.     $request = $this->getRequest(); 
  27.     $module = $request->getModuleName(); 
  28.     $dirs  = $this->getFrontController()->getControllerDirectory(); 
  29.     if (emptyempty($module) || !isset($dirs[$module])) { 
  30.       $module = $this->getFrontController()->getDispatcher()->getDefaultModule(); 
  31.     } 
  32.     $baseDir = dirname($dirs[$module]) . DIRECTORY_SEPARATOR . 'views'
  33.     if (!file_exists($baseDir) || !is_dir($baseDir)) { 
  34.       require_once 'Zend/Controller/Exception.php'
  35.       throw new Zend_Controller_Exception('Missing base view directory ("' . $baseDir . '")'); 
  36.     } 
  37.     require_once 'Zend/View.php'
  38.     $this->view = new Zend_View(array('basePath' => $baseDir)); 
  39.     return $this->view; 
  40.   } 
  41.   /** 
  42.    * Render a view 
  43.    * 
  44.    * Renders a view. By default, views are found in the view script path as 
  45.    * <controller>/<action>.phtml. You may change the script suffix by 
  46.    * resetting {@link $viewSuffix}. You may omit the controller directory 
  47.    * prefix by specifying boolean true for $noController. 
  48.    * 
  49.    * By default, the rendered contents are appended to the response. You may 
  50.    * specify the named body content segment to set by specifying a $name. 
  51.    * 
  52.    * @see Zend_Controller_Response_Abstract::appendBody() 
  53.    * @param string|null $action Defaults to action registered in request object 
  54.    * @param string|null $name Response object named path segment to use; defaults to null 
  55.    * @param bool $noController Defaults to false; i.e. use controller name as subdir in which to search for view script 
  56.    * @return void 
  57.    */ 
  58.   public function render($action = null, $name = null, $noController = false) 
  59.   { 
  60.     if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { 
  61.       return $this->_helper->viewRenderer->render($action$name$noController); 
  62.     } 
  63.     $view  = $this->initView(); 
  64.     $script = $this->getViewScript($action$noController); 
  65.     $this->getResponse()->appendBody( 
  66.       $view->render($script), 
  67.       $name 
  68.     ); 
  69.   } 
  70.   /** 
  71.    * Render a given view script 
  72.    * 
  73.    * Similar to {@link render()}, this method renders a view script. Unlike render(), 
  74.    * however, it does not autodetermine the view script via {@link getViewScript()}, 
  75.    * but instead renders the script passed to it. Use this if you know the 
  76.    * exact view script name and path you wish to use, or if using paths that do not 
  77.    * conform to the spec defined with getViewScript(). 
  78.    * 
  79.    * By default, the rendered contents are appended to the response. You may 
  80.    * specify the named body content segment to set by specifying a $name. 
  81.    * 
  82.    * @param string $script 
  83.    * @param string $name 
  84.    * @return void 
  85.    */ 
  86.   public function renderScript($script$name = null) 
  87.   { 
  88.     if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { 
  89.       return $this->_helper->viewRenderer->renderScript($script$name); 
  90.     } 
  91.     $view = $this->initView(); 
  92.     $this->getResponse()->appendBody( 
  93.       $view->render($script), 
  94.       $name 
  95.     ); 
  96.   } 

Zend_View.php类

  1. <?php 
  2. /** 
  3.  * Zend Framework 
  4.  * 
  5.  * LICENSE 
  6.  * 
  7.  * This source file is subject to the new BSD license that is bundled 
  8.  * with this package in the file LICENSE.txt. 
  9.  * It is also available through the world-wide-web at this URL: 
  10.  * http://framework.zend.com/license/new-bsd 
  11.  * If you did not receive a copy of the license and are unable to 
  12.  * obtain it through the world-wide-web, please send an email 
  13.  * to license@zend.com so we can send you a copy immediately. 
  14.  * 
  15.  * @category  Zend 
  16.  * @package  Zend_View 
  17.  * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) 
  18.  * @license  http://framework.zend.com/license/new-bsd   New BSD License 
  19.  * @version  $Id: View.php 23775 2011-03-01 17:25:24Z ralph $ 
  20.  */ 
  21. /** 
  22.  * Abstract master class for extension. 
  23.  */ 
  24. require_once 'Zend/View/Abstract.php'
  25. /** 
  26.  * Concrete class for handling view scripts. 
  27.  * 
  28.  * @category  Zend 
  29.  * @package  Zend_View 
  30.  * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) 
  31.  * @license  http://framework.zend.com/license/new-bsd   New BSD License 
  32.  */ 
  33. class Zend_View extends Zend_View_Abstract 
  34.   /** 
  35.    * Whether or not to use streams to mimic short tags 
  36.    * @var bool 
  37.    */ 
  38.   private $_useViewStream = false; 
  39.   /** 
  40.    * Whether or not to use stream wrapper if short_open_tag is false 
  41.    * @var bool 
  42.    */ 
  43.   private $_useStreamWrapper = false; 
  44.   /** 
  45.    * Constructor 
  46.    * 
  47.    * Register Zend_View_Stream stream wrapper if short tags are disabled. 
  48.    * 
  49.    * @param array $config 
  50.    * @return void 
  51.    */ 
  52.   public function __construct($config = array()) 
  53.   { 
  54.     $this->_useViewStream = (bool) ini_get('short_open_tag') ? false : true; 
  55.     if ($this->_useViewStream) { 
  56.       if (!in_array('zend.view', stream_get_wrappers())) { 
  57.         require_once 'Zend/View/Stream.php'
  58.         stream_wrapper_register('zend.view''Zend_View_Stream'); 
  59.       } 
  60.     } 
  61.     if (array_key_exists('useStreamWrapper'$config)) { 
  62.       $this->setUseStreamWrapper($config['useStreamWrapper']); 
  63.     } 
  64.     parent::__construct($config); 
  65.   } 
  66.   /** 
  67.    * Set flag indicating if stream wrapper should be used if short_open_tag is off 
  68.    * 
  69.    * @param bool $flag 
  70.    * @return Zend_View 
  71.    */ 
  72.   public function setUseStreamWrapper($flag
  73.   { 
  74.     $this->_useStreamWrapper = (bool) $flag
  75.     return $this
  76.   } 
  77.   /** 
  78.    * Should the stream wrapper be used if short_open_tag is off? 
  79.    * 
  80.    * @return bool 
  81.    */ 
  82.   public function useStreamWrapper() 
  83.   { 
  84.     return $this->_useStreamWrapper; 
  85.   } 
  86.   /** 
  87.    * Includes the view script in a scope with only public $this variables. 
  88.    * 
  89.    * @param string The view script to execute. 
  90.    */ 
  91.   protected function _run() 
  92.   { 
  93.     if ($this->_useViewStream && $this->useStreamWrapper()) { 
  94.       include 'zend.view://' . func_get_arg(0); 
  95.     } else { 
  96.       include func_get_arg(0); 
  97.     } 
  98.   } 

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

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

例如:

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

Zend_View的常用方法

public function __construct($config = array())

构造函数参数

例如

  1. array
  2.  'escape' => array(), 
  3.  'encoding' => array(), 
  4. ); 

常见key:

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

public function getEngine() Return the template engine object

public function init()初始化函数

  1. /** 
  2. * Given a base path, sets the script, helper, and filter paths relative to it 
  3. * 
  4. * Assumes a directory structure of: 
  5. * <code> 
  6. * basePath/ 
  7. *   scripts/ 
  8. *   helpers/ 
  9. *   filters/ 
  10. * </code> 
  11. * 
  12. * @param string $path 
  13. * @param string $prefix Prefix to use for helper and filter paths 
  14. * @return Zend_View_Abstract 
  15. */ 
  16. public function setBasePath($path$classPrefix = 'Zend_View'
  17. /** 
  18. * Given a base path, add script, helper, and filter paths relative to it 
  19. * 
  20. * Assumes a directory structure of: 
  21. * <code> 
  22. * basePath/ 
  23. *   scripts/ 
  24. *   helpers/ 
  25. *   filters/ 
  26. * </code> 
  27. * 
  28. * @param string $path 
  29. * @param string $prefix Prefix to use for helper and filter paths 
  30. * @return Zend_View_Abstract 
  31. */ 
  32. public function addBasePath($path$classPrefix = 'Zend_View'
  33. public function addScriptPath($path)Adds to the stack of view script paths in LIFO order. 
  34. public function setScriptPath($path) Resets the stack of view script paths. 
  35. public function getScriptPath($name)Return full path to a view script specified by $name 
  36. public function getScriptPaths()Returns an array of all currently set script paths 
  37. public function addHelperPath($path$classPrefix = 'Zend_View_Helper_')Adds to the stack of helper paths in LIFO order. 
  38. public function setHelperPath($path$classPrefix = 'Zend_View_Helper_')Resets the stack of helper paths. 
  39. public function getHelperPath($name) Get full path to a helper class file specified by $name 
  40. public function getHelperPaths()Returns an array of all currently set helper paths 
  41. public function getHelper($name) Get a helper by name 
  42. public function getHelpers()Get array of all active helpers 
  43. public function getAllPaths() Return associative array of path types => paths 
  44. public function setEscape($spec
  45. /** 
  46. * Assigns variables to the view script via differing strategies. 
  47. * 
  48. * Zend_View::assign('name', $value) assigns a variable called 'name' 
  49. * with the corresponding $value. 
  50. * 
  51. * Zend_View::assign($array) assigns the array keys as variable 
  52. * names (with the corresponding array values). 
  53. * 
  54. * @see  __set() 
  55. * @param string|array The assignment strategy to use. 
  56. * @param mixed (Optional) If assigning a named variable, use this 
  57. * as the value. 
  58. * @return Zend_View_Abstract Fluent interface 
  59. * @throws Zend_View_Exception if $spec is neither a string nor an array, 
  60. * or if an attempt to set a private or protected member is detected 
  61. */ 
  62. public function assign($spec$value = null) 
  63. 在controller的action可以通过assign传递参数到视图脚本。 
  64.  
  65. 例如 
  66.  
  67. $this->view->assign('roles'$roles); 
  68. $this->view->assign('num'$num); 
  69. $this->view->assign('a'$a); 

或者也可以用

  1. $this->view->roles=$roles
  2. $this->view->a=$a
  3. public function render($name) Processes a view script and returns the output. 
  4. public function escape($var):Escapes a value for output in a view script. 
  5. public function setEncoding($encoding) Set encoding to use with htmlentities() and htmlspecialchars() 
  6. public function getEncoding() :Return current escape encoding 

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

获取传递过来的值

$this->roles

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

  1. $this->baseUrl(); 
  2. $this->url(); 
  3. $this->paginationControl(); 
  4. $this->partial() 

视图常见用法举例

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

  1. /** 
  2.  * Initialize the common view helper 
  3.  */ 
  4. protected function _initViewHelper() 
  5.   $boot=$this->bootstrap('View'); 
  6.   $view = $boot->getResource('View'); 
  7.         $view->setHelperPath('Sql/View/Helper''Sql_View_Helper'); 

action中

  1. /** 
  2.  * 
  3.  * @return void 
  4.  */ 
  5. public function listAction() 
  6.   $this->view->assign('data'$data); 

视图文件

list.phtml

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

Tags: Framework Zend_View

分享到: