Zend_View-Helpers.xml 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.view.helpers" xmlns:xi="http://www.w3.org/2001/XInclude">
  4. <title>Помощники видов</title>
  5. <para>
  6. Часто бывает так, что в скриптах вида необходимо повторно выполнять
  7. определенный набор функций; например, формирование даты,
  8. генерация элементов формы, отображение ссылок. Вы можете использовать
  9. помощников для выполнения этих действий.
  10. </para>
  11. <para>
  12. Помощник представляет собой просто класс. Скажем, нам нужен помощник
  13. 'fooBar'. По умолчанию имя класса помощника начинается с
  14. <code>'Zend_View_Helper_'</code> (вы можете указать другой префикс при
  15. установке путей к помощникам видов), последней частью имени класа
  16. является имя помощника. Все слова этой части должны писаться слитно,
  17. первые буквы слов - в верхнем регистре (TitleCapped); таким образом мы
  18. получаем имя класа <classname>Zend_View_Helper_FooBar</classname>. Класс должен
  19. содержать как минимум один метод, названный по имени помощника в формате
  20. camelCase: <code>fooBar()</code>.
  21. </para>
  22. <note>
  23. <title>Следите за регистром</title>
  24. <para>
  25. Имена помощников всегда должны быть в стиле camelCased, т.е. они
  26. никогда не начинаются с символа в верхнем регистре. Имя класса
  27. имеет стиль MixedCase (т.е. начинается с символа в верхнем регистре),
  28. но реально выполняемый метод должен быть в стиле camelCase.
  29. </para>
  30. </note>
  31. <note>
  32. <title>Используемый по умолчанию путь к помощникам</title>
  33. <para>
  34. Используемый по умолчанию путь к помощникам всегда указывает на
  35. помощники Zend Framework-а, т.е. 'Zend/View/Helper/'. Даже если вы
  36. вызываете <code>setHelperPath()</code> для перезаписи существующих
  37. путей, этот путь всегда будет использоваться для обеспечения работы
  38. помощников, входящих в поставку Zend Framework-а
  39. </para>
  40. </note>
  41. <para>
  42. Для того, чтобы использовать помощника в своем скрипте вида, вызывайте
  43. его, используя <varname>$this->имяПомощника()</varname>.
  44. В этом случае <classname>Zend_View</classname> загрузит класс
  45. <code>Zend_View_Helper_ИмяПомощника</code>, создаст его экземпляр и
  46. вызовет его метод <code>имяПомощника()</code>. Экземпляр объекта
  47. сохраняется в экземпляре <classname>Zend_View</classname> и будет повторно
  48. использоваться им во всех будущих вызовах
  49. <varname>$this->имяПомощника()</varname>.
  50. </para>
  51. <sect2 id="zend.view.helpers.initial">
  52. <title>Начальный набор помощников</title>
  53. <para>
  54. <classname>Zend_View</classname> поставляется с начальным набором помощников,
  55. большинство из которых связано с генерацией элементов форм и
  56. автоматически экранирует весь вывод. Кроме этого, есть помощники для
  57. создания HTML-списков, URL-ов на основе маршрутов, и объявления
  58. переменных. В настоящее время в поставляемый набор входят:
  59. </para>
  60. <itemizedlist>
  61. <listitem><para>
  62. <code>declareVars():</code> В основном предназначен для
  63. использования вместе с <code>strictVars()</code>. Этот
  64. помощник может использоваться для объявления переменных
  65. шаблонов, которые не обязательно присутствуют в объекте
  66. вида, и для установки значений по умолчанию.
  67. Массивы, переданные методу в качестве аргуметов, будут
  68. использованы для установки значений по умолчанию; иначе, если
  69. переменная не существует, то ее значением будет пустая строка.
  70. </para></listitem>
  71. <listitem><para>
  72. <code>fieldset($name, $content, $attribs):</code> Создает
  73. XHTML-элемент <code>fieldset</code> (набор полей). Если массив
  74. <varname>$attribs</varname> содержит в ключ 'legend', то это значение
  75. используется для элемента <code>legend</code>. Элемент
  76. <code>fieldset</code> будет содержать в себе значение
  77. параметра <varname>$content</varname>, переданного помощнику.
  78. </para></listitem>
  79. <listitem><para>
  80. <code>form($name, $attribs, $content):</code> Генерирует
  81. XHTML-элемент <code>form</code> (форма). Все элементы массива
  82. <varname>$attribs</varname> и добавляются как аттрибуты тега
  83. <code>form</code>. Если параметр <varname>$content</varname> передан и
  84. не имеет значение false, то это содержимое добавляется между
  85. открывающим и закрывающим тегами формы. Если же
  86. <varname>$content</varname> имеет булево значение false (значение по
  87. умолчанию), то будет сгенерирован только открывающий тег формы.
  88. </para></listitem>
  89. <listitem><para>
  90. <code>formButton($name, $value, $attribs)</code>: Создает элемент
  91. <code>&lt;button /&gt;</code>.
  92. </para></listitem>
  93. <listitem>
  94. <para>
  95. <code>formCheckbox($name, $value, $attribs, $options)</code>:
  96. Создает элемент <code>&lt;input type="checkbox" /&gt;</code>
  97. (флажок опций).
  98. </para>
  99. <para>
  100. По умолчанию, если не был передан параметры <varname>$value</varname>
  101. и <varname>$options</varname>, то значение '1' соотвествует
  102. выбранному состоянию, '0' - не выбранному. Если был передан
  103. параметр <varname>$value</varname>, но
  104. не передан <varname>$options</varname>, то значение
  105. <varname>$value</varname> соотвествует выбранному состоянию.
  106. </para>
  107. <para>
  108. <varname>$options</varname> должен быть массивом. Если это
  109. индексный массив, то первое значение соответствует
  110. выбранному состоянию, второе - не выбранному состоянию,
  111. все остальные значения игнорируются. Вы можете также
  112. передавать массив с ключами 'checked' и 'unChecked'.
  113. </para>
  114. <para>
  115. Если параметр $options был передан, и <varname>$value</varname>
  116. соответствует значению в выбранном состоянии, то элемент
  117. будет помечен как выбранный. Вы можете также помечать
  118. элемент как выбранный или не выбранный путем передачи
  119. значения булевого типа для атрибута 'checked'.
  120. </para>
  121. <para>
  122. Наверное, лучше всего проиллюстрировать это примерами:
  123. </para>
  124. <programlisting language="php"><![CDATA[
  125. // '1' и '0' в качестве значений для выбранного/ не выбранного состояний
  126. // флажок не выбран
  127. echo $this->formCheckbox('foo');
  128. // '1' и '0' в качестве значений для выбранного/ не выбранного состояний
  129. // флажок выбран
  130. echo $this->formCheckbox('foo', null, array('checked' => true));
  131. // 'bar' и '0' в качестве значений для выбранного/ не выбранного состояний
  132. // флажок не выбран
  133. echo $this->formCheckbox('foo', 'bar');
  134. // 'bar' и '0' в качестве значений для выбранного/ не выбранного состояний
  135. // флажок выбран
  136. echo $this->formCheckbox('foo', 'bar', array('checked' => true));
  137. // 'bar' и 'baz' в качестве значений для выбранного/ не выбранного состояний
  138. // флажок не выбран
  139. echo $this->formCheckbox('foo', null, null, array('bar', 'baz');
  140. // 'bar' и 'baz' в качестве значений для выбранного/ не выбранного состояний
  141. // флажок не выбран
  142. echo $this->formCheckbox('foo', null, null, array(
  143. 'checked' => 'bar',
  144. 'unChecked' => 'baz'
  145. ));
  146. // 'bar' и 'baz' в качестве значений для выбранного/ не выбранного состояний
  147. // флажок выбран
  148. echo $this->formCheckbox('foo', 'bar', null, array('bar', 'baz');
  149. echo $this->formCheckbox('foo',
  150. null,
  151. array('checked' => true),
  152. array('bar', 'baz');
  153. // 'bar' и 'baz' в качестве значений для выбранного/ не выбранного состояний
  154. // флажок не выбран
  155. echo $this->formCheckbox('foo', 'baz', null, array('bar', 'baz');
  156. echo $this->formCheckbox('foo',
  157. null,
  158. array('checked' => false),
  159. array('bar', 'baz');
  160. ]]></programlisting>
  161. <para>
  162. Во всех случаях разметка предваряется скрытым элементом
  163. <code>&lt;input type="hidden" /&gt;</code>
  164. со значением для не выбранного состояния. Таким образом,
  165. и в том случае, если флажок опций не был выбран, вы будете
  166. получать корректное значение, возвращаемое вашей форме.
  167. </para>
  168. </listitem>
  169. <listitem>
  170. <para>
  171. <code>formErrors($errors, $options):</code> Генерирует
  172. ненумерованный список XHTML для вывода сообщений об ошибках.
  173. <varname>$errors</varname> должен быть строкой или массивом строк.
  174. <varname>$options</varname> должен заключать в себе все аттрибуты,
  175. которые вы хотите поместить в открывающий тег списка.
  176. </para>
  177. <para>
  178. Вы можете указать альтернативный открывающий, закрывающий и
  179. разделяющий код путем вызова нескольких методов данного
  180. помощника:
  181. </para>
  182. <itemizedlist>
  183. <listitem><para>
  184. <code>setElementStart($string)</code>; по умолчанию
  185. используется
  186. '&lt;ul class="errors"%s"&gt;&lt;li&gt;', где %s
  187. заменяется аттрибутами, указанными в
  188. <varname>$options</varname>.
  189. </para></listitem>
  190. <listitem><para>
  191. <code>setElementSeparator($string)</code>; по
  192. умолчанию используется '&lt;/li&gt;&lt;li&gt;'.
  193. </para></listitem>
  194. <listitem><para>
  195. <code>setElementEnd($string)</code>; по умолчанию
  196. используется '&lt;/li&gt;&lt;/ul&gt;'.
  197. </para></listitem>
  198. </itemizedlist>
  199. </listitem>
  200. <listitem><para>
  201. <code>formFile($name, $attribs)</code>: Создает
  202. элемент <code>&lt;input type="file" /&gt;</code>.
  203. </para></listitem>
  204. <listitem><para>
  205. <code>formHidden($name, $value, $attribs)</code>: Создает
  206. элемент <code>&lt;input type="hidden" /&gt;</code>.
  207. </para></listitem>
  208. <listitem><para>
  209. <code>formLabel($name, $value, $attribs):</code> Создает элемент
  210. &lt;label&gt;, устанавливая значение аттрибута <code>for</code>
  211. равным значению <varname>$name</varname>, и содержимое элемента равным
  212. значению <varname>$value</varname>. Если в <varname>$attribs</varname> был
  213. передан <code>disable</code>, то ничего не будет возвращено.
  214. </para></listitem>
  215. <listitem><para>
  216. <code>formMultiCheckbox($name, $value, $attribs, $options,
  217. $listsep):</code>
  218. Создает список флажков опций. <varname>$options</varname> должен
  219. быть ассоциативным массивом, который может быть произвольной
  220. глубины. <varname>$value</varname> может быть скалярным значением или
  221. массивом выбранных значений, которые соответствуют ключам в
  222. массиве <varname>$options</varname>. <varname>$listsep</varname> по
  223. умолчанию является переносом строки в HTML ("&lt;br /&gt;"). По
  224. умолчанию этот элемент интерпретируется как массив - все флажки
  225. опций имеют одно и то же имя и передаются как массив.
  226. </para></listitem>
  227. <listitem><para>
  228. <code>formPassword($name, $value, $attribs)</code>: Создает
  229. элемент <code>&lt;input type="password" /&gt;</code>.
  230. </para></listitem>
  231. <listitem><para>
  232. <code>formRadio($name, $value, $attribs, $options)</code>: Создает
  233. последовательность элементов <code>&lt;input type="radio" /&gt;</code>
  234. (переключатель опций). В массиве <varname>$options</varname> ключ
  235. является значением переключателя, значение является содержимым
  236. элемента <code>label</code> к переключателю. Переключатель опций
  237. со значением <varname>$value</varname> будет предварительно выбранным.
  238. </para></listitem>
  239. <listitem><para>
  240. <code>formReset($name, $value, $attribs)</code>: Создает
  241. элемент <code>&lt;input type="reset" /&gt;</code>.
  242. </para></listitem>
  243. <listitem><para>
  244. <code>formSelect($name, $value, $attribs, $options)</code>:
  245. Создает блок <code>&lt;select&gt;...&lt;/select&gt;</code>,
  246. с опциями <code>&lt;option&gt;</code>, соотвествующими
  247. элементам массива <varname>$options</varname>. В массиве
  248. <varname>$options</varname> ключ является значением опции,
  249. значение - текстом опции. Опция со значением
  250. <varname>$value</varname> будет предварительно выбранной.
  251. </para></listitem>
  252. <listitem><para>
  253. <code>formSubmit($name, $value, $attribs)</code>: Создает
  254. элемент <code>&lt;input type="submit" /&gt;</code>.
  255. </para></listitem>
  256. <listitem><para>
  257. <code>formText($name, $value, $attribs)</code>: Создает
  258. элемент <code>&lt;input type="text" /&gt;</code>.
  259. </para></listitem>
  260. <listitem><para>
  261. <code>formTextarea($name, $value, $attribs)</code>: Создает
  262. блок <code>&lt;textarea&gt;...&lt;/textarea&gt;</code>.
  263. </para></listitem>
  264. <listitem><para>
  265. <code>url($urlOptions, $name, $reset):</code> Создает строку
  266. URL, основываясь на машруте с именем <varname>$name</varname>.
  267. <varname>$urlOptions</varname> должен быть ассоциативным массивом пар
  268. ключ-значение для использования в данном маршруте.
  269. </para></listitem>
  270. <listitem><para>
  271. <code>htmlList($items, $ordered, $attribs, $escape):</code>
  272. Генерирует маркированный или нумерованный список на основе
  273. <varname>$items</varname>. Если <varname>$items</varname> является
  274. многомерным массивом, то будут построены вложенные списки. Если
  275. <varname>$escape</varname> установлен в true (значение по умолчанию),
  276. то все пункты будут экранированы с использованием механизма,
  277. зарегистрированного в объекте вида. Передавайте значение false,
  278. если хотите использовать разметку в своих списках. Если
  279. <varname>$ordered</varname> установлен в false (значение по
  280. умолчанию), то генерируется маркированный список, иначе -
  281. нумерованный.
  282. </para></listitem>
  283. </itemizedlist>
  284. <para>
  285. Использовать их в скрипте вида очень просто, вот пример.
  286. Обратите внимание, все, что вам нужно - это вызывать их,
  287. помощники будут загружаться и инстанцироваться автоматически, по
  288. мере необходимости.
  289. </para>
  290. <programlisting language="php"><![CDATA[
  291. // в скрипте вида $this ссылается на экземпляр Zend_View
  292. //
  293. // предположим, вы уже имеете последовательность опций $countries
  294. // в виде массива ('us' => 'United States', 'il' =>
  295. // 'Israel', 'de' => 'Germany')
  296. ?>
  297. <form action="action.php" method="post">
  298. <p><label>Your Email:
  299. <?php echo $this->formText('email', 'you@example.com', array('size' => 32)) ?>
  300. </label></p>
  301. <p><label>Your Country:
  302. <?php echo $this->formSelect('country', 'us', null, $this->countries) ?>
  303. </label></p>
  304. <p><label>Would you like to opt in?
  305. <?php echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) ?>
  306. </label></p>
  307. </form>
  308. ]]></programlisting>
  309. <para>
  310. Результирующие выходные данные этого скрипта вида будут выглядеть
  311. примерно следующим образом:
  312. </para>
  313. <programlisting language="php"><![CDATA[
  314. <form action="action.php" method="post">
  315. <p><label>Your Email:
  316. <input type="text" name="email" value="you@example.com" size="32" />
  317. </label></p>
  318. <p><label>Your Country:
  319. <select name="country">
  320. <option value="us" selected="selected">United States</option>
  321. <option value="il">Israel</option>
  322. <option value="de">Germany</option>
  323. </select>
  324. </label></p>
  325. <p><label>Would you like to opt in?
  326. <input type="hidden" name="opt_in" value="no" />
  327. <input type="checkbox" name="opt_in" value="yes" checked="checked" />
  328. </label></p>
  329. </form>
  330. ]]></programlisting>
  331. <xi:include href="Zend_View-Helpers-Action.xml">
  332. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Action.xml" /></xi:fallback>
  333. </xi:include>
  334. <xi:include href="Zend_View-Helpers-Cycle.xml">
  335. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Cycle.xml" /></xi:fallback>
  336. </xi:include>
  337. <xi:include href="Zend_View-Helpers-Partial.xml">
  338. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Partial.xml" /></xi:fallback>
  339. </xi:include>
  340. <xi:include href="Zend_View-Helpers-Placeholder.xml">
  341. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Placeholder.xml" /></xi:fallback>
  342. </xi:include>
  343. <xi:include href="Zend_View-Helpers-Doctype.xml">
  344. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Doctype.xml" /></xi:fallback>
  345. </xi:include>
  346. <xi:include href="Zend_View-Helpers-HeadLink.xml">
  347. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HeadLink.xml" /></xi:fallback>
  348. </xi:include>
  349. <xi:include href="Zend_View-Helpers-HeadMeta.xml">
  350. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HeadMeta.xml" /></xi:fallback>
  351. </xi:include>
  352. <xi:include href="Zend_View-Helpers-HeadScript.xml">
  353. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HeadScript.xml" /></xi:fallback>
  354. </xi:include>
  355. <xi:include href="Zend_View-Helpers-HeadStyle.xml">
  356. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HeadStyle.xml" /></xi:fallback>
  357. </xi:include>
  358. <xi:include href="Zend_View-Helpers-HeadTitle.xml">
  359. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HeadTitle.xml" /></xi:fallback>
  360. </xi:include>
  361. <xi:include href="Zend_View-Helpers-HtmlObject.xml">
  362. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-HtmlObject.xml" /></xi:fallback>
  363. </xi:include>
  364. <xi:include href="Zend_View-Helpers-InlineScript.xml">
  365. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-InlineScript.xml" /></xi:fallback>
  366. </xi:include>
  367. <xi:include href="Zend_View-Helpers-Json.xml">
  368. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Json.xml" /></xi:fallback>
  369. </xi:include>
  370. <xi:include href="Zend_View-Helpers-Navigation.xml">
  371. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Navigation.xml" /></xi:fallback>
  372. </xi:include>
  373. <xi:include href="Zend_View-Helpers-Translate.xml">
  374. <xi:fallback><xi:include href="../../en/module_specs/Zend_View-Helpers-Translate.xml" /></xi:fallback>
  375. </xi:include>
  376. </sect2>
  377. <sect2 id="zend.view.helpers.paths">
  378. <title>Пути к классам помощников</title>
  379. <para>
  380. Как и для скриптов вида, ваш контроллер может задать
  381. стек путей, в которых <classname>Zend_View</classname> должен искать
  382. классы помощников. По умолчанию <classname>Zend_View</classname>
  383. ищет классы помощников в <code>Zend/View/Helper/*</code>. Используя
  384. методы <code>setHelperPath()</code> и <code>addHelperPath()</code>,
  385. вы можете укзать <classname>Zend_View</classname>, чтобы он искал классы
  386. помощников в других местах. Кроме этого, вы можете указать префикс
  387. класса, используемый для помощников, находящихся в данном пути;
  388. префикс обеспечивает пространство имен. Если префикс не указан, то
  389. по умолчанию используется 'Zend_View_Helper_'.
  390. </para>
  391. <programlisting language="php"><![CDATA[
  392. $view = new Zend_View();
  393. // Устанавливает путь /path/to/more/helpers с префиксом 'My_View_Helper'
  394. $view->setHelperPath('/path/to/more/helpers', 'My_View_Helper');
  395. ]]></programlisting>
  396. <para>
  397. Вы можете "складывать" в стек пути, используя метод
  398. <code>addHelperPath()</code>. Если вы добавили
  399. пути в стек, то <classname>Zend_View</classname> будет искать запрошенный
  400. класс помощника в этих путях, начиная с пути, добавленного
  401. последним. Это дает возможность добавлять своих
  402. помощников к начальному набору (или даже замещать имеющиеся).
  403. </para>
  404. <programlisting language="php"><![CDATA[
  405. $view = new Zend_View();
  406. // Добавить /path/to/some/helpers с префиксом для классов 'My_View_Helper'
  407. $view->addHelperPath('/path/to/some/helpers', 'My_View_Helper);
  408. // Добавить /other/path/to/helpers с префиксом для классов 'Your_View_Helper'
  409. $view->addHelperPath('/other/path/to/helpers', 'Your_View_Helper');
  410. // теперь, когда вы вызываете $this->helperName(), Zend_View будет искать
  411. // "/path/to/some/helpers/HelperName" с классом
  412. // "Your_View_Helper_HelperName", затем "/other/path/to/helpers/HelperName.php"
  413. // с классом "My_View_Helper_HelperName", и под конец
  414. // "Zend/View/Helper/HelperName.php" с классом "Zend_View_Helper_HelperName".
  415. ]]></programlisting>
  416. </sect2>
  417. <sect2 id="zend.view.helpers.custom">
  418. <title>Написание собственных помощников</title>
  419. <para>
  420. Написать собственного помощника довольно легко, просто следуйте
  421. этим правилам:
  422. </para>
  423. <itemizedlist>
  424. <listitem><para>
  425. Хотя это и не является совершенно необходимым, мы рекомендуем
  426. при создании своего помощника реализовывать интерфейс
  427. <classname>Zend_View_Helper_Interface</classname>
  428. или наследовать от класса <classname>Zend_View_Helper_Abstract</classname>.
  429. Добавленные в версии 1.6.0, они определяют только метод
  430. <code>setView()</code>, но в будущих релизах
  431. мы планируем реализовать паттерн "стратегия", который
  432. значительно упростит следование правилам по именованию,
  433. изложенным ниже. Следование этой рекомендации сейчас
  434. поможет в будущем избежать изменений в вашем коде.
  435. </para></listitem>
  436. <listitem><para>
  437. Имя класса должно, как минимум, заканчиваться именем
  438. помощника в стиле MixedCaps (СмешанныйРегистр). Т.е. если вы
  439. пишете помощника с именем "specialPurpose", то наиболее короткое
  440. имя класса должно быть "SpecialPurpose". Вы можете
  441. (и должны) давать классам имена с префиксом, рекомендуется
  442. использовать 'View_Helper' как часть этого префикса:
  443. "My_View_Helper_SpecialPurpose". Вам нужно будет передать этот
  444. префикс с или без завершающего знака подчеркивания методу
  445. <code>addHelperPath()</code> или <code>setHelperPath()</code>.
  446. </para></listitem>
  447. <listitem><para>
  448. Класс должен иметь открытый метод, имя которого
  449. соответствует имени помощника. Это метод, который будет
  450. вызываться, когда в вашем шаблоне производится вызов
  451. <varname>$this->specialPurpose()</varname>. В нашем примере с
  452. помощником "specialPurpose" объявление требуемого метода должно
  453. быть <code>public function specialPurpose()</code>.
  454. </para></listitem>
  455. <listitem><para>
  456. Обычно класс не должен выполнять вывод, вместо этого
  457. он должен возвращать значение для вывода. Возвращаемое значение
  458. должно быть экранировано должным образом.
  459. </para></listitem>
  460. <listitem><para>
  461. Класс должен быть в файле, названном по имени класса.
  462. Снова используя пример с помощником "specialPurpose", мы
  463. должны дать файлу имя "SpecialPurpose.php".
  464. </para></listitem>
  465. </itemizedlist>
  466. <para>
  467. Размещайте класс помощника где-либо в одном из находящихся в
  468. стеке путей к помощникам, и <classname>Zend_View</classname> будет
  469. автоматически загружать, инстанцировать, сохранять и выполнять его.
  470. </para>
  471. <para>
  472. Вот пример кода нашего помощника <code>SpecialPurpose</code>:
  473. </para>
  474. <programlisting language="php"><![CDATA[
  475. class My_View_Helper_SpecialPurpose extends Zend_View_Helper_Abstract
  476. {
  477. protected $_count = 0;
  478. public function specialPurpose()
  479. {
  480. $this->_count++;
  481. $output = "I have seen 'The Jerk' {$this->_count} time(s).";
  482. return htmlspecialchars($output);
  483. }
  484. }
  485. ]]></programlisting>
  486. <para>
  487. Далее в скрипте вида вы можете вызывать помощника
  488. <code>SpecialPurpose</code> сколько угодно раз. Он будет
  489. инстанцирован один раз, и существует, пока существует
  490. экземпляр <classname>Zend_View</classname>.
  491. </para>
  492. <programlisting language="php"><![CDATA[
  493. // помните, что в скрипте вида $this ссылается на экземпляр Zend_View
  494. echo $this->specialPurpose();
  495. echo $this->specialPurpose();
  496. echo $this->specialPurpose();
  497. ]]></programlisting>
  498. <para>
  499. Результат должен быть примерно следующим:
  500. </para>
  501. <programlisting language="php"><![CDATA[
  502. I have seen 'The Jerk' 1 time(s).
  503. I have seen 'The Jerk' 2 time(s).
  504. I have seen 'The Jerk' 3 time(s).
  505. ]]></programlisting>
  506. <para>
  507. Иногда бывает, что нужен доступ к объекту <classname>Zend_View</classname> -
  508. например, нужно получить зарегистрированное значение кодировки
  509. или произвести рендеринг другого скрипта вида как часть
  510. действий, выполняемых вашим помощником. Для того, чтобы можно было
  511. получить доступ к объекту вида, ваш класс помощника должен иметь
  512. метод <code>setView($view)</code>, его пример показан ниже:
  513. </para>
  514. <programlisting language="php"><![CDATA[
  515. class My_View_Helper_ScriptPath
  516. {
  517. public $view;
  518. public function setView(Zend_View_Interface $view)
  519. {
  520. $this->view = $view;
  521. }
  522. public function scriptPath($script)
  523. {
  524. return $this->view->getScriptPath($script);
  525. }
  526. }
  527. ]]></programlisting>
  528. <para>
  529. Если ваш класс помощника имеет метод <code>setView()</code>, то он
  530. будет вызываться при первом инстанцировании класса помощника и его
  531. передаче текущему объекту вида. Реализация
  532. сохранения объекта вида и доступа к нему в вашем классе помощника
  533. остаются на ваше усмотрение.
  534. </para>
  535. <para>
  536. Если вы наследуете своего помощника от
  537. <classname>Zend_View_Helper_Abstract</classname>, то вам не нужно определять
  538. этот метод, поскольку он уже определен в родительском классе.
  539. </para>
  540. </sect2>
  541. </sect1>
  542. <!--
  543. vim:se ts=4 sw=4 et:
  544. -->