`

开始使用 Zend_View 占位符:标准占位符

阅读更多

在前面的一节中,我们学习了关于 placeholder() 视图帮助器,以及如何使用它来合并定制的内容。在本节中,我们会研究一下 Zend Framework 内置的占位符,以及如何使用它们来创建更复杂的复合模板。

大部分的内置占位符是为了在你的模板内容中的 <head> 部分产生内容——一个你不能通过你的应用程序的视图脚本直接操作的区域,但是它是你想施加影响的。举例来说:你可能希望每一个页面的标题包含一定的内容,但是这些内容是基于控制器和/或行为的;你可能希望基于你所在的应用程序的不同的部分来指定 CSS 文件;你可能需要在不同的时间载入不同的 JavaScript 脚本;或者你希望设置 DocType 声明。

Zend Framework 为这些情形内置了占位符,甚至更多。

设置 DocType

DocType 声明要想记住是很麻烦的,同时,它被包括进你的文档以确保浏览器正确呈现你的内容是最基本的。doctype() 视图帮助器允许你使用简单的字符串记忆术来指定希望的 DocType;另外,其它的帮助器将会查询 doctype() 帮助器来确保输出和被请求的 DocType 一致。

举一个例子,如果你想使用 XHTML1 Strict DTD,你可以简单的指定:

在可选的记忆短语中,你会找到这些常用的类型:

你可以赋值给类型然后在一个单独的调用中呈现声明:

然而,更好的办法是在你的 bootstrap 里面指定类型,然后在你的模板中呈现它。试着把以下添加到你的 bootstrap 类中:

然后,在你的模板脚本中,在文件的顶部简单的输出帮助器就可以了:

这将确保你的关注 DocType 的视图帮助器呈现合适的标记,确保模板在呈现之前设置好类型,同时提供了一个单独改变 DocType 类型的地方。

指定页面标题

经常,一个网站会把网站名字或者公司名字包括在页面标题内,然后基于所处网站内的位置再添加额外的信息。举例来说,zend.com 网站所有页面的标题都包含有 Zend.com 这个字符串,在它之前添加基于页面的信息:Zend Server - Zend.com。在 Zend Framework 内部,headTitle() 视图帮助器可以帮助简化这个工作。

最简单的,headTitle() 帮助器允许你为 >title< 标签合并内容;当你输出它,它然后收集基于片断被添加的顺序的信息。你可以使用 prepend() 和 append() 来控制顺序,使用 setSeparator() 方法来为各个片断之间提供一个分割符。

典型的,你应该在你的 bootstrap 中指定对于所有页面都适用的片断,和我们如何定义 doctype 是一样的。在这个例子中,我们会定义一个 _initPlaceholders() 方法来操作许多的占位符,然后指定一个初始的标题和一个分割符。

在一个视图脚本中,我们可能想添加另外一个片断:

在我们的模板中,我们将简单的输出 headTitle() 帮助器:

这将会产生以下的输出:

用 headLink 指定样式表

好的 CSS 开发者会经常为整个网站创建一个通用的风格样式表,和为指定的部门或者网页创建各自的风格样式表,有条件的载入后者,这样可以减少每一次请求所需要传递的数据数量。headLink() 占位符在你的应用程序中制造这样有条件的细微的风格样式组合。

为了完成这个工作,headLink() 定义了大量的虚拟的方法(通过重载)来使过程变得细微。我们将要关注的是 appendStylesheet() 和 prependStylesheet()。这两个分别接受4个参数,$href(到风格样式表的相对路径),$media(MIME 类型,默认是 text/css),$conditionalStylesheet(用来评估使用哪个风格样式表而指定的条件),和 $extras(一个索引数组的键和值对,通常用来指定 media 的一个外键)。在大多数例子中,你只要简单的指定第一个参数,到风格样式表的相对路径。

在我们的例子中,我们将假设全部的网页需要加载位于 /styles/site.css 的风格样式表(相对于文档根目录);我们会在我们的 _initPlaceholders() bootstrap 方法中指定它。

之后,在一个控制器或者特定行为的视图脚本中,我们可以添加更多的风格样式:

在我们的模板视图脚本中,再一次,我们只需要简单的输出占位符:

这将会产出以下的输出:

使用 headScript 添加脚本

另外一个防止页面载入时间过长的常用策略是只有在必要的时候才载入 JavaScript。这就是说,你可能需要几个层次的脚本:一个是网站逐渐展开的菜单,另外一个是特定网页内容。在这些情形中,headScript() 提供了解决办法。

和 headLink() 帮助器类似,headScript() 提供了把脚本附加和前置到收集物上的功能,然后输出整套内容。它提供了可以指定自己加载的脚本文件或者精确的 JaveScript 扩展性能。你还有通过 captureStart() / captureEnd() 来采集 JavaScript 的选择,这将允许你只要简单内联 JavaScript,而不是向你的服务器请求额外的调用。

如同 headLink(),headScript() 通过以一种当指定合并的事物的时候方便的方式重载提供了虚拟的方法,通用的方法包括 prependFile(),appendFile(),prependScript(),和 appendScript()。开头的两个允许你指定在 <script> 标签中 $src 属性引用的文件;后两个将会接受提供的内容,并把这些内容在一个 <script> 标签中按文本 JavaScript 呈现。

在这个例子中,我们将指定一个脚本,/js/site.js 这个脚本将在每一个页面加载;为了达到这个,我们要更新我们的 _initPlaceholders() bootstrap 方法。

在一个视图脚本内,我们可能然后把一个额外的脚本文件增加到源,或者把一些 JavaScript 抓取到我们的文档中。

在我们的模板脚本中,我们然后简单的输出这个占位符,就象我们对其它的占位符做的一样:

这将产生以下输出:

<script type="text/javascript" src="/js/site.js "></script>
<script type="text/javascript" src="/js/user-list.js "></script>
<script>
site = {
baseUrl: "<?php echo $this-> baseUrl() ?> "
};
</script>

注意:关联脚本变体类型

许多浏览器直到在 <head> 标签中所引用的全部脚本和风格样式表加载完毕之前会经常不显示页面内容。如果你有一些这样的指令,它会早影响到某人多快可以开始真正浏览网页。

针对这个,其中的一个办法是在你的文档的 <body> 标签关闭之前发表你的 <script> 标签。(此方法被Y! Slow project 特别指定)。 Zend Framework 通过两种办法来支持这个:

你可以在你的模板脚本中的任何你想的位置呈现 headScript() 标签;不要因为名字有 head 就意味它只能在那个位置呈现。

另外,你可以使用 inlineScript() 帮助器,这是 headScript() 简单变体,保留了相同的行为,但是使用了一个独立的注册。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics