Zend_View-Helpers-Partial.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <sect3 id="zend.view.helpers.initial.partial">
  2. <title>区域助手(Partial Helper) </title>
  3. <para>
  4. <code>Partial</code> 视图助手被用来在它自己的变量范围内解析特定的模板。主要用法是(解析)可重用的模板片段,你不需要操心变量名的冲突。另外,它们让你从特定的模块指定 partial 视图脚本。
  5. </para>
  6. <para>
  7. <code>Partial</code> 的兄弟 <code>PartialLoop</code> 视图助手允许传递可迭代数据并为每个条目解析一部分。
  8. </para>
  9. <example id="zend.view.helpers.initial.partial.usage">
  10. <title> Partials 的基本用法 </title>
  11. <para>
  12. partials 的基本用法是在它自己的视图范围内解析一个模板的片段。
  13. </para>
  14. <programlisting role="php"><![CDATA[
  15. <?php // partial.phtml ?>
  16. <ul>
  17. <li>From: <?= $this->escape($this->from) ?></li>
  18. <li>Subject: <?= $this->escape($this->subject) ?></li>
  19. </ul>
  20. ]]></programlisting>
  21. <para>
  22. 你可以这样从视图脚本里调用它:
  23. </para>
  24. <programlisting role="php"><![CDATA[
  25. <?= $this->partial('partial.phtml', array(
  26. 'from' => 'Team Framework',
  27. 'subject' => 'view partials')); ?>
  28. ]]></programlisting>
  29. <para>
  30. 解析结果如下:
  31. </para>
  32. <programlisting role="html"><![CDATA[
  33. <ul>
  34. <li>From: Team Framework</li>
  35. <li>Subject: view partials</li>
  36. </ul>
  37. ]]></programlisting>
  38. </example>
  39. <note>
  40. <title> 什么是模型(model)? </title>
  41. <para>
  42. 和 <code>Partial</code> 视图助手一起使用的模型(即partial()的第二个参数,Haohappy注)可以是下列其中之一:
  43. </para>
  44. <itemizedlist>
  45. <listitem><para>
  46. <emphasis> 数组 </emphasis>。如果传递了数组,它应当是联合数组,因为它的 ‘键/值’ 对用作为视图变量的键赋值给视图。
  47. </para></listitem>
  48. <listitem><para>
  49. <emphasis> 实现了toArray() 方法的对象 </emphasis>。如果被传递的对象有 <code>toArray()</code> 方法,<code>toArray()</code>的结果将被当作视图变量赋值给视图对象。
  50. </para></listitem>
  51. <listitem><para>
  52. <emphasis> 标准对象 </emphasis>。 任何其它对象将把<code>object_get_vars()</code>的结果(对象的所有公共属性)赋值给视图对象。
  53. </para></listitem>
  54. </itemizedlist>
  55. <para>
  56. 如果你的模型是一个对象,你可能想让它<emphasis>作为对象</emphasis>传递给 partial 脚本,而不是把它系列化成一个数组变量。
  57. 你可以通过设置适当的助手的 'objectKey' 属性来完成这个:
  58. </para>
  59. <programlisting role="php"><![CDATA[
  60. // Tell partial to pass objects as 'model' variable
  61. $view->partial()->setObjectKey('model');
  62. // Tell partial to pass objects from partialLoop as 'model' variable in final
  63. // partial view script:
  64. $view->partialLoop()->setObjectKey('model');
  65. ]]></programlisting>
  66. <para>
  67. 当传递 <code>Zend_Db_Table_Rowset</code>s 给 <code>partialLoop()</code>时这个技术相当有用,
  68. 因为你在视图脚本里有全部访问 row 对象的权限,允许你调用它们的方法(如从父或依赖的 rows 获取数据)。
  69. </para>
  70. </note>
  71. <example id="zend.view.helpers.initial.partial.partialloop">
  72. <title> 使用 PartialLoop 来解析可迭代的(Iterable)的模型 </title>
  73. <para>
  74. 可能你常常会需要在一个循环里使用 partials 来输出相同的内容片段多次,这时你就可以把大块的重复的内容或复杂的显示逻辑放到一个地方。然而这对性能有影响,因为partial助手需要在每个迭代里调用一次。
  75. </para>
  76. <para>
  77. <code>PartialLoop</code> 视图助手解决了这个问题。 它允许你把迭代条目(实现<code>Iterator</code>的数组或对象)当做模型来传递。它这些把这些条目当作模型迭代、传递给 partial 脚本。在迭代器里的条目可以是 <code>Partial</code> 视图助手允许的任何模型。
  78. </para>
  79. <para>
  80. 让我们看一下下面的 partial 视图脚本:
  81. </para>
  82. <programlisting role="php"><![CDATA[
  83. <? // partialLoop.phtml ?>
  84. <dt><?= $this->key ?></dt>
  85. <dd><?= $this->value ?></dd>
  86. ]]></programlisting>
  87. <para>
  88. 添加下列 "model":
  89. </para>
  90. <programlisting role="php"><![CDATA[<?php
  91. $model = array(
  92. array('key' => 'Mammal', 'value' => 'Camel'),
  93. array('key' => 'Bird', 'value' => 'Penguin'),
  94. array('key' => 'Reptile', 'value' => 'Asp'),
  95. array('key' => 'Fish', 'value' => 'Flounder'),
  96. );
  97. ?>]]></programlisting>
  98. <para>
  99. 在视图脚本中,你可以这样调用 <code>PartialLoop</code> 助手:
  100. </para>
  101. <programlisting role="php"><![CDATA[
  102. <dl>
  103. <?= $this->partialLoop('partialLoop.phtml', $model) ?>
  104. </dl>
  105. ]]></programlisting>
  106. <programlisting role="html"><![CDATA[
  107. <dl></dl>
  108. <dt>Mammal</dt>
  109. <dd>Camel</dd>
  110. <dt>Bird</dt>
  111. <dd>Penguin</dd>
  112. <dt>Reptile</dt>
  113. <dd>Asp</dd>
  114. <dt>Fish</dt>
  115. <dd>Flounder</dd>
  116. </dl>
  117. ]]></programlisting>
  118. </example>
  119. <example id="zend.view.helpers.initial.partial.modules">
  120. <title> 在其它模块中解析 Partials </title>
  121. <para>
  122. 有时候 partial 存在于不同的模块(Module)。如果你知道模块的名称,你可以把它当作第二个参数传递给 <code>partial()</code> 或者 <code>partialLoop()</code>,把 <code>$model</code> 作为第三个参数。
  123. </para>
  124. <para>
  125. 例如,如果一个你想用一个在 'list' 模块的 pager partial,就象下面这样来运用:
  126. </para>
  127. <programlisting role="php"><![CDATA[
  128. <?= $this->partial('pager.phtml', 'list', $pagerData) ?>
  129. ]]></programlisting>
  130. <para>
  131. 这样,你可以重用原来是特别供给其它模块使用的 partials 。所以,在共享的视图脚本路径里放置可重用的 partials 很可能是个好习惯。
  132. </para>
  133. </example>
  134. </sect3>
  135. <!--
  136. vim:se ts=4 sw=4 et:
  137. -->