[ZF-10089] Zend_Log
[zend.git] / documentation / manual / zh / module_specs / Zend_Layout-Advanced.xml
blob63359bab90d6cf1d3a7ccafc43dbba19eadaf9db
1 <sect1 id="zend.layout.advanced">
2     <title>Zend_Layout 高级用法</title>
4     <para>
5         <code>Zend_Layout</code> 有无数用例提供给愿意修改它以适应不同的视图实现、文件系统布局及更多的高级开发者。
6     </para>
8     <para>
9         主要的扩展点是:
10     </para>
12     <itemizedlist>
13         <listitem><para>
14                 <emphasis>定制视图对象。</emphasis> <code>Zend_Layout</code> 允许使用任何实现<code>Zend_View_Interface</code> 的类。
15         </para></listitem>
17         <listitem><para>
18                 <emphasis>定制前端控制器插件。</emphasis> <code>Zend_Layout</code> 和在返回响应之前自动解析布局的标准前端控制器插件一起发布。你可以替换你自己的插件。
19         </para></listitem>
21         <listitem><para>
22                 <emphasis>定制动作助手。</emphasis> <code>Zend_Layout</code> 和标准动作助手一起发布,因为这个助手对于布局对象自己是一个哑代理(dumb proxy),所以它应该适合大部分的需求。
23         </para></listitem>
25         <listitem><para>
26                 <emphasis>定制布局脚本路径解析(resolution)</emphasis>。<code>Zend_Layout</code> 允许为布局脚本路径解析使用你自己的 <link linkend="zend.filter.inflector">变形器(inflector)</link> ,或者简单地修改附加的变形器来指定你自己的变形规则。
27         </para></listitem>
28     </itemizedlist>
30     <sect2 id="zend.layout.advanced.view">
31         <title>定制视图对象</title>
33         <para>
34             <code>Zend_Layout</code> 允许任何实现 <code>Zend_View_Interface</code> 的类或者扩展 <code>Zend_View_Abstract</code> 来解析布局脚本。简单地把定制的视图对象当作参数传递给 constructor/<code>startMvc()</code>,或者用<code>setView()</code> 访问器来设置它:
35         </para>
37         <programlisting role="php"><![CDATA[<?php
38 $view = new My_Custom_View();
39 $layout->setView($view);
40 ?>]]></programlisting>
42         <note>
43             <title>不是所有的 Zend_View 实现都等同</title>
45             <para>
46                 虽然<code>Zend_Layout</code>允许使用任何实现<code>Zend_View_Interface</code>的类,如果它们不能使用各种<code>Zend_View</code>助手,也可能遇到问题,特别是布局和<link linkend="zend.view.helpers.initial.placeholder">占位符</link>助手。这是因为<code>Zend_Layout</code>通过它自己和<link linkend="zend.view.helpers.initial.placeholder">占位符</link>在可用的对象里设置变量。
47             </para>
49             <para>
50                 如果要使用一个定制的不支持这些助手<code>Zend_View</code>实现,那么需要找到一个办法把布局变量给视图。这可以通过两个办法来实现:扩展<code>Zend_Layout</code>对象和改变<code>render()</code>方法来传递变量给视图;或者,创建自己的插件类,在解析布局前传递它们。
51             </para>
53             <para>
54                 做为替换方案,如果你的视图实现支持任何种类的插件,你可以通过'Zend_Layout'占位符使用<link linkend="zend.view.helpers.initial.placeholder">占位符助手</link>:
55             </para>
57             <programlisting role="php"><![CDATA[<?php
58 $placeholders = new Zend_View_Helper_Placeholder();
59 $layoutVars   = $placeholders->placeholder('Zend_Layout')->getArrayCopy();
60 ?>]]></programlisting>
61         </note>
62     </sect2>
64     <sect2 id="zend.layout.advanced.plugin">
65         <title>定制前端控制器插件</title>
67         <para>
68             当和MVC组件一起使用,<code>Zend_Layout</code>注册一个前端控制器插件,这个插件把解析布局做为在退出派遣循环之前的最后一个动作。在大多数情况下,缺省的插件适用,但如果你象写你自己的,可以通过传递<code>pluginClass</code>选项给<code>startMvc()</code>方法来指定插件类的名称去加载。
69         </para>
71         <para>
72             为这个目的所写的任何插件类将需要扩展<code>Zend_Controller_Plugin_Abstract</code>,并应该接受一个布局对象实例做为参数给构造器。另外,你的实现细节取决于你。
73         </para>
75         <para>
76             被使用缺省插件类是<code>Zend_Layout_Controller_Plugin_Layout</code>。
77         </para>
78     </sect2>
80     <sect2 id="zend.layout.advanced.helper">
81         <title>定制动作助手</title>
83         <para>
84             当和MVC组件一起使用,<code>Zend_Layout</code>用助手经纪注册一个动作控制器助手。缺省助手,<code>Zend_Layout_Controller_Action_Helper_Layout</code>,扮作一个哑代理给布局对象实例自己,并应该适合大多数用例。
85         </para>
87         <para>
88             如果你觉得需要写定制的函数,简单地写一个扩展<code>Zend_Controller_Action_Helper_Abstract</code> 的动作助手类并把类名做为<code>helperClass</code>选项传递给<code>startMvc()</code>方法,细节就取决于你了。
89         </para>
90     </sect2>
92     <sect2 id="zend.layout.advanced.inflector">
93         <title>定制布局脚本路径解析(Resolution):使用变形器(Inflector)</title>
95         <para>
96             为翻译布局名到布局脚本路径,<code>Zend_Layout</code> 用 <code>Zend_Filter_Inflector</code>来建立一个过滤链。缺省地,它遵循'StringToLower'(字符变小写)来使用规则'CamelCaseToDash'(驼峰变短横线)和加后缀'phtml'来转换名字到路径。如下几个例子所示:
97         </para>
99         <itemizedlist>
100             <listitem><para>
101                     'foo' will be transformed to 'foo.phtml'.
102             </para></listitem>
104             <listitem><para>
105                     'FooBarBaz' will be transformed to 'foo-bar-baz.phtml'.
106             </para></listitem>
107         </itemizedlist>
109         <para>
110             有三个选项来修改变形:通过<code>Zend_Layout</code>访问器修改变形目标和/或视图后缀,修改变形器规则和与<code>Zend_Layout</code>实例联合变形器目标,或者创建你自己的变形器实例并传递给<code>Zend_Layout::setInflector()</code>。
111         </para>
113         <example id="zend.layout.advanced.inflector.accessors">
114             <title>使用Zend_Layout访问器来修改变形器(inflector)</title>
116             <para>
117                 缺省的<code>Zend_Layout</code>变形器对目标和脚本后缀使用静态地址(references),并拥有访问器来设置这些值。
118             </para>
120             <programlisting role="php"><![CDATA[<?php
121 // Set the inflector target:
122 $layout->setInflectorTarget('layouts/:script.:suffix');
124 // Set the layout view script suffix:
125 $layout->setViewSuffix('php');
126 ?>]]></programlisting>
127         </example>
129         <example id="zend.layout.advanced.inflector.directmodification">
130             <title>Zend_Layout 变形器的直接修改 </title>
132             <para>
133                 变形器有目标和一个或多个规则。缺省目标和<code>Zend_Layout</code>一起使用是':script.:suffix';':script'是被传递的已注册的布局名称,':suffix'是变形器的静态规则。
134             </para>
136             <para>
137                 让我们假设你想用后缀'html'做为布局脚本的文件扩展名,并且想分离混合大小写字和驼峰字为下划线而不是短横线,还不想使用小写字母。另外,你想让它去'layouts'子目录去找脚本。
138             </para>
140             <programlisting role="php"><![CDATA[<?php
141 $layout->getInflector()->setTarget('layouts/:script.:suffix')
142                        ->setStaticRule('suffix', 'html')
143                        ->setFilterRule(array('CamelCaseToUnderscore'));
144 ?>]]></programlisting>
145         </example>
147         <example id="zend.layout.advanced.inflector.custom">
148             <title>定制变形器(inflectors)</title>
150             <para>
151                 在大多数情况下,修改已存在的变形器已经足够。然而,你可能想有一个在多个地方使用的变形器,并带有不同的对象和类型。<code>Zend_Layout</code>支持它。
152             </para>
154             <programlisting role="php"><![CDATA[<?php
155 $inflector = new Zend_Filter_Inflector('layouts/:script.:suffix');
156 $inflector->addRules(array(
157     ':script' => array('CamelCaseToUnderscore'),
158     'suffix'  => 'html'
160 $layout->setInflector($inflector);
161 ?>]]></programlisting>
162         </example>
164         <note>
165             <title>变形(Inflection)可以被禁止 </title>
167             <para>
168                 在<code>Zend_Layout</code>对象种用访问器可以禁止和允许变形。这对想指定绝对路径给布局视图脚本来说很有用,或者知道指定布局脚本不需要变形的机制,简单地使用<code>enableInflection()</code> 和 <code>disableInflection()</code> 方法。
169             </para>
170         </note>
171     </sect2>
172 </sect1>
173 <!--
174 vim:se ts=4 sw=4 et: