Table of Contents
- 介绍
- 使用Zend_Layout
- Zend_Layout结论
介绍
当使用Zend Framework MVC层创建web站点的时候,你的视图脚本通常是与请求动作(requested action)相关的HTML片段。比如,如果你有动作“/user/list”,你可以创建一个遍历用户并呈现一个无序表的视图脚本:
- <h2>Users</h2>
- <ul>
- <?php if (!count($this->users)): ?>
- <li>No users found</li>
- <?php else: ?>
- <?php foreach ($this->users as $user): ?>
- <li>
- <?php echo $this->escape($user->fullname) ?>
- (<?php echo $this->escape($user->email) ?>)
- </li>
- <?php endforeach ?>
- <?php endif ?>
- </ul>
因为这仅仅是一个HTML片段,它不是一个有效的页面;它缺少了DOCTYPE声明、开放的HTML和body标签。所以,问题是,这些将在哪里被创建?
在Zend Framework的早期版本中,开发者经常创建含有这些人工标记的“header”和“footer”视图脚本,然后在每个视图脚本中渲染他们。虽然这套方法能够工作,但它也为以后重构造成困难,或者通过调用多个行为去建立复合的内容
两步视图设计模式回答了许多现在的问题。在这个模式里,“application”视图首先被创建,然后将其中注入“page”视图,随后“page”视图提交给客户端。Page视图可看作是你的全站模板或者布局,可以在各个页面之间使用共同的元素
在Zend Framework中,Zend_Layout实现了两步视图模式
使用 Zend_Layout
Zend_Layout基本用法相当琐碎的(trivial)。假设你已经在使用Zend_Application,你能够简单的提供一些配置选项并创建一个布局视图脚本。
Layout 配置
布局存放的推荐位置是在你应用程序的“layout/script/”子目录中
- application
- |-- Bootstrap.php
- |-- configs
- | `-- application.ini
- |-- controllers
- |-- layouts
- | `-- scripts
- | |-- layout.phtml
为了初始化Zend_Layout,将下面的的内容加到你的配置文件("application/configs/application.ini")中:
- resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
- resources.layout.layout = "layout"
第一行显示到哪里去寻找布局脚本;第二行指定使用的布局名称,它是减去视图脚本的扩展名(默认情况下假设是“.phtml”)得到的
创建布局脚本
既然你已经配置到位,那么你需要去创建你的布局脚本。首先,确信你已经创建了"application/layouts/scripts" 目录;然后,打开编辑器,并且为你的布局创建标记。布局脚本是简单的略有一些不同的视图脚本。
- <html>
- <head>
- <title>My Site</title>
- </head>
- <body>
- <?php echo $this->layout()->content ?>
- </body>
- </html>
在这个例子中,你将会注意到layout()视图助手的调用。当你注册Zend_Layout资源,你还会获得动作和允许你访问Zend_Layout实例的视图助手;然后你能够进行调用布局对象的操作。在这个例子中,我们要得到一个命名变量:$content,并echo它。默认情况下,$content变量在应用程序视图脚本渲染中被填充。除此之外,在视图脚本中你要做的任何事情是完全有效的——调用你想调用得任何助手或者视图方法
此时,你已经有了一个工作的布局脚本,你的应用程序已知道它的位置并且去渲染它
访问布局对象
有时,你可能需要直接访问布局对象,有三种方法可以做到这一点:
- 在视图脚本中:使用layout()视图助手,其返回用前端控制器注册的Zend_Layout实例
- <?php $layout = $this->layout(); ?>
因为它返回布局实例,所以你也能够简单的在其上调用方法,而不是将它赋给一个变量。
- 在动作控制器里:使用layout()动作助手,它的行为就像视图助手
- // Calling helper as a method of the helper broker:
- $layout = $this->_helper->layout();
- // Or, more verbosely:
- $helper = $this->_helper->getHelper('Layout');
- $layout = $helper->getLayoutInstance();
如同视图助手,因为动作助手返回布局实例,所以你能够也简单的在其上调用方法,而不是将它付给一个变量
- 其他(elsewhere):使用静态方法getMvcInstance()。这将返回被引导资源(bootstrap resource)注册的布局实例。
- $layout = Zend_Layout::getMvcInstance();
- 通过bootstrap:得到布局资源,它将是Zend_Layout的实例
- $layout = $bootstrap->getResource('Layout');
你随时随地都可以访问引导对象(bootstrap object),这个方法由于使用静待的getMvcInstance()方法。
其他操作
在大多数情况下,上面的设置和布局脚本(带有修改(with modifications))将得到你所需要的。然而,一些其他存在的功能你将迟早可能使用。在所有下面的例子中,你为了要得到布局对象而使用上面列出上的其中一个方法
- 设置布局变量。Zend_Layout保持它自己的你能存取的指定布局(layout-specific)视图变量注册表(Setting layout variables. Zend_Layout keeps its own registry of layout-specific view variables that you can access);在初始布局脚本实例中指出的$content键是一个那样的例子。你能指定和得到这些使用正常属性的入口(access),或者通过assign()方法。
- disableLayout()。有时,你可能想去禁用布局;比如,当应答一个Ajax请求,或者提供一个RESTful资源的代表(representation of a resource)。在这些例子中,你可以在你的布局对象中调用disableLayout() 方法。
- $layout->disableLayout();
与这个方法相对的,当然是enbleLayout(),它能在任何时候被调用为请求的动作重新启用布局。
- 选择一个备用布局:如果为你的站点或应用程序有多个布局。你能够在任何时候通过简单调用setLayout()方法选择使用的布局。通过指定不带文件前缀的布局脚本的名字来调用它
- // Use the layout script "alternate.phtml":
- $layout->setLayout('alternate');
The layout script should reside in the $layoutPath directory specified in your configuration. Zend_Layout will then use this new layout when rendering.
这个布局脚本应该在你的配置里指定的$layoutPath目录。Zend_Layout然后将在渲染的时候使用这个新布局。
Zend_Layout: 结论
Zend_Layout是一个围绕Zend_View非常简单的包装(wrapper),它立即提供给你你两步视图的益处,给你创建一个可以将你的应用程序注入的全站范围设计的灵活性
如果你密切关注这些例子,你可能会提出(come away with)功能相对不足的想法:怎样改变你的页面title,怎样注入一个可选的脚本标签,或者怎样创建一个可选的边栏(sidebar)?这些问题是解决了(are addressed with)“复合视图(Composite View)”的概念——这些问题还是这个教程中下一章的主题,它包含了视图“占位符”。