Zend Framework 的view 组件是Zend_View。这个view 组件的功能是将action函数中的代码和显示页面的代码分开写。
Zend_View 的基本使用方法是:
$view = new Zend_View(); $view->setScriptPath('/path/to/scripts'); echo $view->render('script.php');
很明显,如果我们把这段代码放到每一个action函数里面,将会产生很多不是很有意义的重复代码。我们希望在其他地方对view 进行初始化,然后在每个action 函数里面访问那些已经初始化的view 对象。Zend Framework 为此提供了一个叫 ViewRenderer 的 Action Helper。它负责在controller($this->view) 中初始化view 属性,并在action执行后渲染 view 代码。
对于渲染过程,首先 ViewRenderer 创建 Zend_View 对象,该对象会在 views/scripts/{controller name} 目录中查找和 action 名字相同,后缀为.phtml 待渲染的的view 脚本。也就是查找渲染的view 脚本为 views/scripts/{controller name}/{action_name}.phtml,要呈现的内容被添加到Response 对象的body中。Response 对象用于收集所有的 HTTP headers,body content 以及使用MVC模型产生的异常。然后前台控制器在最后调用的body content后面发送headers。这整个render的过程,Zend_Tool 在创建项目、或使用zf create controller 和 zf create action 添加controllers控制器、action 的时候,就已经帮我们完成了。
很明显在views 文件中会有很多通用的HTML 代码,比如页面上重复的header 部分和footer部分,甚至sidebar边栏等。这是一个很常见的问题,Zend 框架使用 Zend_Layout 解决这个问题。Zend_Layout 可以允许我们将通用的header、footer和其他代码移动到布局视图文件代码中,这个布局视图代码中包含为要执行的action指定的view 代码。
布局文件默认放在application/layouts/ 目录,不过 Zend_Application 允许我们配置Zend_Layout这个资源。我们使用Zend_Tool 创建布局视图代码,它同时还知道如何正确地更新 application.ini 文件。在zftest 目录中我们执行下面的命令:
zf enable layout
现在Zend_Tool 已经创建了 application/layouts/scripts 文件夹,并在里面创建了一个layout.phtml 文件,同样也更新了application.ini文件,注意到是在[production]部分添加了一行:
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
在controller action 方法结束之后,也就是整个调用循环的最后,Zend_Layout 将会渲染指定的layout。Zend_Tool 启用layout时,创建的是一个最基础的布局文件,只有一行代码用以显示action的view脚本:
<?php echo $this->layout()->content; ?>
下面我们添加网站必须的一些代码,打开layouts.phtml 文件用下面的代码替换:
zf-tutorial/application/layouts/scripts/layout.phtml <?php $this->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8'); $this->headTitle()->setSeparator(' - '); $this->headTitle('Zend Framework Tutorial'); echo $this->doctype(); ?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <?php echo $this->headMeta(); ?> <?php echo $this->headTitle(); ?> </head> <body> <div id="content"> <h1><?php echo $this->escape($this->title); ?></h1> <?php echo $this->layout()->content; ?> </div> </body> </html>
这个布局文件包含非常标准的“外包”的HTML 代码。因为这是一个普通的PHP 文件,我们可以在里面写php代码。里面有一个$this变量,它是在bootstrapping过程中创建的view 对象的一个实例。我们可以使用它来获取已经赋值给view 的数据,以及调用方法。这个方法(即view helpers)返回我们可以输出的字符串。
首先我们为web网页的head部分配置一些view helpers 方法,然后输出正确的doctype。在<body>
部分,我们创建一个div及包含title的<h1>
标签。为了获取当前action要显示的view 代码,我们使用echo $this->layout()->content;
这个layout() view helper的内容占位符。这表明action的view 代码是在layout的view代码之前执行的。
在渲染任何view 脚本之前,我们要为网页设置好doctype。因为action的 view脚本更早执行,它必须知道现在使用的是哪一个doctype。对于Zend_Form也是如此。那么在哪里设置 doctype 呢?打开 application.ini文件,在[production]部分添加一行:
resources.view.doctype = "XHTML1_STRICT"
doctype() 这个view helper 现在就可以输出正确的doctype了,然后 Zend_Form 等组件生成和它相兼容的HTML 代码。