Zend_View-Helpers-HeadScript.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect3 id="zend.view.helpers.initial.headscript">
  4. <title>Помощник HeadScript Helper</title>
  5. <para>
  6. HTML-элемент <code>&lt;script&gt;</code> используется для добавления
  7. скриптового кода, исполняемого на клиентской стороне, как
  8. непосредственно в документ, так и через ссылки на удаленные ресурсы,
  9. содержащие этот код. Помощник <code>HeadScript</code> позволяет
  10. использовать оба способа включения.
  11. </para>
  12. <para>
  13. Помощник <code>HeadScript</code> поддерживает следующие методы для
  14. установки и добавления скриптов:
  15. </para>
  16. <itemizedlist>
  17. <listitem><para><code>appendFile($src, $type = 'text/javascript',
  18. $attrs = array())</code></para></listitem>
  19. <listitem><para><code>offsetSetFile($index, $src, $type = 'text/javascript',
  20. $attrs = array())</code></para></listitem>
  21. <listitem><para><code>prependFile($src, $type = 'text/javascript',
  22. $attrs = array())</code></para></listitem>
  23. <listitem><para><code>setFile($src, $type = 'text/javascript',
  24. $attrs = array())</code></para></listitem>
  25. <listitem><para><code>appendScript($script, $type = 'text/javascript',
  26. $attrs = array())</code></para></listitem>
  27. <listitem><para><code>offsetSetScript($index, $script, $type = 'text/javascript',
  28. $attrs = array())</code></para></listitem>
  29. <listitem><para><code>prependScript($script, $type = 'text/javascript',
  30. $attrs = array())</code></para></listitem>
  31. <listitem><para><code>setScript($script, $type = 'text/javascript',
  32. $attrs = array())</code></para></listitem>
  33. </itemizedlist>
  34. <para>
  35. В методах <code>*File()</code> через параметр <varname>$src</varname>
  36. указывается местоположение скрипта, который требуется загрузить; обычно
  37. оно указывется в виде URL или пути к нему.
  38. В методах <code>*Script()</code> через параметр <varname>$script</varname>
  39. передается скриптовый код, который требуется включить в
  40. элемент <code>&lt;script&gt;</code>.
  41. </para>
  42. <note>
  43. <title>Установка условных комментариев</title>
  44. <para>
  45. <code>HeadScript</code> поддерживает включение тега в условные
  46. комментарии с тем, чтобы скрыть его от определенных
  47. браузеров. Для того, чтобы добавить условные теги,
  48. передавайте условие через параметр
  49. <varname>$attrs</varname> в вызове метода, как показано в примере:
  50. </para>
  51. <example id="zend.view.helpers.initial.headscript.conditional">
  52. <title>Скрипты с условными комментариями</title>
  53. <programlisting language="php"><![CDATA[
  54. // добавление скриптов
  55. $this->headScript()->appendFile(
  56. '/js/prototype.js',
  57. 'text/javascript',
  58. array('conditional' => 'lt IE 7')
  59. );
  60. ]]></programlisting>
  61. </example>
  62. </note>
  63. <para>
  64. <code>HeadScript</code> также позволяет "захватывать" вывод скриптов;
  65. это может быть полезным при создании скриптов
  66. программным способом. Пример использования этой возможности будут
  67. показан ниже.
  68. </para>
  69. <para>
  70. Для быстрого добавления скриптовых элементов Вы можете использовать
  71. метод <code>headScript()</code>, сигнатура этого метода -
  72. <code>headScript($mode = 'FILE', $spec, $placement = 'APPEND')</code>.
  73. Параметр <varname>$mode</varname> может иметь значение 'FILE' или 'SCRIPT',
  74. в зависимости от того, ссылаетесь ли вы на уже существующий скрипт или
  75. передаете код для влючения в элемент
  76. <code>&lt;script&gt;</code>. <varname>$spec</varname> содержит либо путь к
  77. файлу, к которому нужно добавить ссылку, либо сам скриптовый код.
  78. <varname>$placement</varname> должен иметь одно из следующих значений:
  79. 'APPEND', 'PREPEND' или 'SET'.
  80. </para>
  81. <para>
  82. <code>HeadScript</code> перегружает методы <code>append()</code>,
  83. <code>offsetSet()</code>, <code>prepend()</code> и <code>set()</code>
  84. с целью принудительного использования специальных методов, перечисленных
  85. выше. Внутри себя помощник сохраняет каждый элемент в виде маркера
  86. <code>stdClass</code>, который затем преобразовывается в строку через
  87. метод <code>itemToString()</code>. Это позволяет производить проверку
  88. элементов в стеке и при необходимости модифицировать их, просто
  89. извлекая объект и изменяя его.
  90. </para>
  91. <para>
  92. Помощник <code>HeadScript</code> является частной реализацией
  93. <link linkend="zend.view.helpers.initial.placeholder">помощника
  94. Placeholder</link>.
  95. </para>
  96. <note>
  97. <title>Используйте InlineScript для скриптов в теле документа</title>
  98. <para>
  99. Для добавления скриптов внутри HTML-элемента <code>body</code>
  100. должен использоваться
  101. родственный помощник <link
  102. linkend="zend.view.helpers.initial.inlinescript">InlineScript</link>.
  103. Помещение скриптов в конец документа является хорошей практикой
  104. для повышения скорости отдачи страницы, особенно если используются
  105. сторонние скрипты-аналитики.
  106. </para>
  107. </note>
  108. <note>
  109. <title>Установка произвольных атрибутов по умолчанию отключена</title>
  110. <para>
  111. По умолчанию <code>HeadScript</code> будет генерировать только
  112. атрибуты, соответствующие спецификации W3C.
  113. В список этих атрибутов входят 'type', 'charset', 'defer',
  114. 'language' и 'src'. Однако некоторые JavaScript фреймворки,
  115. а в особенности <ulink url="http://www.dojotoolkit.org/">Dojo</ulink>,
  116. используют специальные атрибуты в целях изменения поведения. Вы
  117. можете разрешить использование таких атрибутов, воспользовавшись
  118. методом <code>setAllowArbitraryAttributes()</code>:
  119. </para>
  120. <programlisting language="php"><![CDATA[
  121. $this->headScript()->setAllowArbitraryAttributes(true);
  122. ]]></programlisting>
  123. </note>
  124. <example id="zend.view.helpers.initial.headscript.basicusage">
  125. <title>Использование помощника HeadScript</title>
  126. <para>
  127. Вы можете указывать скрипты для добавления в документ в любой момент
  128. времени. Как было указано ранее, это могут быть как ссылки на
  129. файлы со скриптами, так и сами скрипты.
  130. </para>
  131. <programlisting language="php"><![CDATA[
  132. // добавление скриптов
  133. $this->headScript()->appendFile('/js/prototype.js')
  134. ->appendScript($onloadScript);
  135. ]]></programlisting>
  136. <para>
  137. Порядок следования часто важен в скриптах, интерпретируемых на
  138. стороне клиента - например, нужно быть уверенным в том, что
  139. библиотеки загружаются в порядке, обусловленном
  140. зависимостями между ними. В этом случае используйте специальные
  141. методы методы для добавления в начало, конец, и по определенному
  142. смещению:
  143. </para>
  144. <programlisting language="php"><![CDATA[
  145. // Размещение скриптов в определенном порядке
  146. // Добавление по определенному смещению
  147. $this->headScript()->offsetSetFile(100, '/js/myfuncs.js');
  148. // Используем эффекты из библиотеки script.aculo.us
  149. // (будет добавлена с использованием следующего смещения, 101)
  150. $this->headScript()->appendFile('/js/scriptaculous.js');
  151. // Но скрипт prototype всегда должен загружаться первым:
  152. $this->headScript()->prependFile('/js/prototype.js');
  153. ]]></programlisting>
  154. <para>
  155. Когда все будет готово для размещения скриптов в макете, просто
  156. "выводите" помощника:
  157. </para>
  158. <programlisting language="php"><![CDATA[
  159. <?php echo $this->headScript() ?>
  160. ]]></programlisting>
  161. </example>
  162. <example id="zend.view.helpers.initial.headscript.capture">
  163. <title>Составление скриптов с использованием помощника HeadScript</title>
  164. <para>
  165. Иногда нужно генерировать скрипты программым способом.
  166. Хотя вы можете использовать конкатенацию строк, синтаксис heredoc
  167. и т.п., часто бывает легче создать скрипт с включением PHP-тегов.
  168. <code>HeadScript</code> позволяет делать это, захватывая
  169. вывод в стек:
  170. </para>
  171. <programlisting language="php"><![CDATA[
  172. <?php $this->headScript()->captureStart() ?>
  173. var action = '<?php echo $this->baseUrl ?>';
  174. $('foo_form').action = action;
  175. <?php $this->headScript()->captureEnd() ?>
  176. ]]></programlisting>
  177. <para>
  178. Используются следующие допущения:
  179. </para>
  180. <itemizedlist>
  181. <listitem><para>
  182. Скрипт будет добавлен в конец стека. Если требуется
  183. переопределить содержимое стека или добавить скрипт в
  184. конец стека, то передавайте соответственно
  185. 'SET' или 'PREPEND' в качестве первого аргумента
  186. <code>captureStart()</code>.
  187. </para></listitem>
  188. <listitem><para>
  189. По умолчанию предполагается, что MIME-тип скрипта -
  190. 'text/javascript'. Если требуется указать другой тип
  191. скрипта, то передавайте его в качестве второго аргумента
  192. <code>captureStart()</code>.
  193. </para></listitem>
  194. <listitem><para>
  195. Если вы хотите указать какие-либо дополнительные аргументы
  196. для тега <code>&lt;script&gt;</code>, то передавайте их
  197. в массиве в качестве третьего аргумента
  198. <code>captureStart()</code>.
  199. </para></listitem>
  200. </itemizedlist>
  201. </example>
  202. </sect3>
  203. <!--
  204. vim:se ts=4 sw=4 et:
  205. -->