2

我无法理解何时使用Layout' 变量以及何时使用View' 变量来获取页面上的页面段。这是他们的Layout包教程的图片($this意味着View到处都是实例): 在此处输入图像描述

为什么NavigationContentSidebar作为Layout变量?

$this->layout()->nav;

但是HeadTitle,是直接从 View 中得到的吗HeadScriptHeadStylesheet

$this->headTitle(); // I know that this is a placeholder view helper. 
                    // But this segment of the page logically belongs to Layout.
                    // and it has to be called smth like view->layout->placeholder 

为什么Header和来自于但不是属性的Footer某种partial方法?ViewLayout

$this->partial('header.phtml');

我试图改变它们,两种方式都可以正常工作:

echo $this->nav; // I assigned navigation segment script to the View and it works;

我试图将Footer段脚本分配给Layout它,它也可以工作:

$layout->footer = $footer;
echo $this->layout()->footer;  // it also works, it's displayed on the page

任何方式都可以应用于页面上的任何变量。例如,在Navigation段中,我有很多变量要显示,我可以使用两种方式输出它们 - 一个变量 asLayout的属性,另一个变量 saView的属性。

那么正确使用它们的规则是什么?什么时候应该使用View' 变量,什么时候使用 ' 变量Layout

4

1 回答 1

3

我同意这在文档中不是很清楚,我认为根本没有$this->layout()->nav解释。可能有帮助的几点:

  • $this->layout()实际上是对布局视图助手的调用,它返回Zend_Layout.
  • Zend_Layout注册它自己的占位符助手(使用键'Zend_Layout'),并默认在其中创建一个'content'变量。
  • 该类Zend_Layout有一个神奇的__get()方法,它将任何成员变量调用代理到其注册的占位符容器。所以调用$this->layout()->content是另一种写法$this->placeholder('Zend_Layout')->content
  • 该类Zend_Layout还有一个魔术__set()方法,可以将存储的数据代理到占位符类。所以$layout->footer = 'foo'和调用一样$this->placeholder('Zend_Layout')->footer = 'foo' in the view

考虑到这一点:

为什么将导航、内容和侧边栏段作为布局变量获取?

因为这些正在访问存储在Zend_Layout's 占位符中的数据。你也可以使用$this->placeholder('Zend_Layout')->content

但是 HeadTitle、HeadScript、HeadStylesheet 是直接从 View 中得到的吗?

这些是视图助手。

为什么 Header 和 Footer 来自 View 的某些部分方法而不是 Layout 的属性?

这是从其他模板访问内容的标准方式。

一般来说,假设使用视图对象是访问数据的正确方法。仅当您知道数据在布局占位符中时才使用布局对象/助手。

使用占位符而不是部分的优点是您可以在几个不同的地方访问和修改它们,包括在视图本身中。例如,假设您有一个侧边栏,它存储在部分中。如果您将其存储在 Zend_Layout 占位符中(例如在控制器插件中),您可以为控制器中的某些操作覆盖它:

public function someAction()
{
    $this->view->layout()->sidebar = 'Some other sidebar content';
}

或在视图脚本本身中:

<?php $this->layout()->sidebar = 'Content for this page only'; ?>
于 2012-07-09T16:52:52.287 回答