1 <sect3 id="zend.view.helpers.initial.partial">
2 <title>区域助手(Partial Helper) </title>
5 <code>Partial</code> 视图助手被用来在它自己的变量范围内解析特定的模板。主要用法是(解析)可重用的模板片段,你不需要操心变量名的冲突。另外,它们让你从特定的模块指定 partial 视图脚本。
9 <code>Partial</code> 的兄弟 <code>PartialLoop</code> 视图助手允许传递可迭代数据并为每个条目解析一部分。
12 <example id="zend.view.helpers.initial.partial.usage">
13 <title> Partials 的基本用法 </title>
16 partials 的基本用法是在它自己的视图范围内解析一个模板的片段。
19 <programlisting role="php"><![CDATA[
20 <?php // partial.phtml ?>
22 <li>From: <?= $this->escape($this->from) ?></li>
23 <li>Subject: <?= $this->escape($this->subject) ?></li>
31 <programlisting role="php"><![CDATA[
32 <?= $this->partial('partial.phtml', array(
33 'from' => 'Team Framework',
34 'subject' => 'view partials')); ?>
41 <programlisting role="html"><![CDATA[
43 <li>From: Team Framework</li>
44 <li>Subject: view partials</li>
50 <title> 什么是模型(model)? </title>
53 和 <code>Partial</code> 视图助手一起使用的模型(即partial()的第二个参数,Haohappy注)可以是下列其中之一:
58 <emphasis> 数组 </emphasis>。如果传递了数组,它应当是联合数组,因为它的 ‘键/值’ 对用作为视图变量的键赋值给视图。
62 <emphasis> 实现了toArray() 方法的对象 </emphasis>。如果被传递的对象有 <code>toArray()</code> 方法,<code>toArray()</code>的结果将被当作视图变量赋值给视图对象。
66 <emphasis> 标准对象 </emphasis>。 任何其它对象将把<code>object_get_vars()</code>的结果(对象的所有公共属性)赋值给视图对象。
71 如果你的模型是一个对象,你可能想让它<emphasis>作为对象</emphasis>传递给 partial 脚本,而不是把它系列化成一个数组变量。
72 你可以通过设置适当的助手的 'objectKey' 属性来完成这个:
75 <programlisting role="php"><![CDATA[
76 // Tell partial to pass objects as 'model' variable
77 $view->partial()->setObjectKey('model');
79 // Tell partial to pass objects from partialLoop as 'model' variable in final
80 // partial view script:
81 $view->partialLoop()->setObjectKey('model');
85 当传递 <code>Zend_Db_Table_Rowset</code>s 给 <code>partialLoop()</code>时这个技术相当有用,
86 因为你在视图脚本里有全部访问 row 对象的权限,允许你调用它们的方法(如从父或依赖的 rows 获取数据)。
91 <example id="zend.view.helpers.initial.partial.partialloop">
92 <title> 使用 PartialLoop 来解析可迭代的(Iterable)的模型 </title>
95 可能你常常会需要在一个循环里使用 partials 来输出相同的内容片段多次,这时你就可以把大块的重复的内容或复杂的显示逻辑放到一个地方。然而这对性能有影响,因为partial助手需要在每个迭代里调用一次。
99 <code>PartialLoop</code> 视图助手解决了这个问题。 它允许你把迭代条目(实现<code>Iterator</code>的数组或对象)当做模型来传递。它这些把这些条目当作模型迭代、传递给 partial 脚本。在迭代器里的条目可以是 <code>Partial</code> 视图助手允许的任何模型。
103 让我们看一下下面的 partial 视图脚本:
106 <programlisting role="php"><![CDATA[
107 <? // partialLoop.phtml ?>
108 <dt><?= $this->key ?></dt>
109 <dd><?= $this->value ?></dd>
117 <programlisting role="php"><![CDATA[<?php
119 array('key' => 'Mammal', 'value' => 'Camel'),
120 array('key' => 'Bird', 'value' => 'Penguin'),
121 array('key' => 'Reptile', 'value' => 'Asp'),
122 array('key' => 'Fish', 'value' => 'Flounder'),
124 ?>]]></programlisting>
127 在视图脚本中,你可以这样调用 <code>PartialLoop</code> 助手:
130 <programlisting role="php"><![CDATA[
132 <?= $this->partialLoop('partialLoop.phtml', $model) ?>
136 <programlisting role="html"><![CDATA[
154 <example id="zend.view.helpers.initial.partial.modules">
155 <title> 在其它模块中解析 Partials </title>
158 有时候 partial 存在于不同的模块(Module)。如果你知道模块的名称,你可以把它当作第二个参数传递给 <code>partial()</code> 或者 <code>partialLoop()</code>,把 <code>$model</code> 作为第三个参数。
162 例如,如果一个你想用一个在 'list' 模块的 pager partial,就象下面这样来运用:
165 <programlisting role="php"><![CDATA[
166 <?= $this->partial('pager.phtml', 'list', $pagerData) ?>
170 这样,你可以重用原来是特别供给其它模块使用的 partials 。所以,在共享的视图脚本路径里放置可重用的 partials 很可能是个好习惯。