您的位置:首页 > 编程语言 > PHP开发

Zend_Layout入门指南(leaning zendframework翻译4)

2010-05-14 10:41 591 查看
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()方法。
// Setting content:

$layout->somekey = "foo"

// Echoing that same content:

echo $layout->somekey; // 'foo'

// Using the assign() method:

$layout->assign('someotherkey', 'bar');

// Access to assign()'d variables remains the same:

echo $layout->someotherkey; // 'bar'

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)”的概念——这些问题还是这个教程中下一章的主题,它包含了视图“占位符”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: