Zend Framework布局和视图 Layouts views

作者 FarLee 2012年4月12日 22:37:24   ‖浏览(8,290)

Zend Framework 教程 >> Zend Framework布局和视图 Layouts views

Zend Framework 的view 组件是Zend_View。这个view 组件的功能是将action函数中的代码和显示页面的代码分开写。

Zend_View 工作原理

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 的时候,就已经帮我们完成了。

通用的HTML 代码:Layouts

很明显在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 代码。


来说兩句