2
0

Zend_View-Introduction.xml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.view.introduction">
  4. <title>Введение</title>
  5. <para>
  6. <classname>Zend_View</classname> является классом для работы с частью вид (view)
  7. паттерна модель-вид-контроллер (model-view-controller). То есть он
  8. предназначен для того, чтобы помочь отделить скрипты видов от
  9. скриптов моделей и контроллеров. Он предоставляет систему помощников,
  10. фильтрации вывода и экранирования переменных.
  11. </para>
  12. <para>
  13. <classname>Zend_View</classname> не зависит от выбранной вами системы
  14. шаблонов - вы можете использовать PHP в качестве языка шаблонов или
  15. создавать экземпляры других систем шаблонов и работать с ними
  16. в ваших скриптах вида.
  17. </para>
  18. <para>
  19. По существу применение <classname>Zend_View</classname> состоит из двух шагов:
  20. 1. Ваш скрипт контроллера создает экземпляр <classname>Zend_View</classname> и
  21. объявляет переменные этого экземпляра.
  22. 2. Контроллер приказывает <classname>Zend_View</classname> воспроизвести
  23. данный вид, посредством этого производится контроль за скриптом
  24. вида, который генерирует выходные данные вида.
  25. </para>
  26. <sect2 id="zend.view.introduction.controller">
  27. <title>Скрипт контроллера</title>
  28. <para>
  29. В качестве простого примера предположим, что ваш контроллер имеет
  30. список данных по книгам, который нужно воспроизвести через вид.
  31. Скрипт контроллера может выглядеть наподобие этого:
  32. </para>
  33. <programlisting language="php"><![CDATA[
  34. // использование модели для получения данных о заголовках и авторах книг
  35. $data = array(
  36. array(
  37. 'author' => 'Hernando de Soto',
  38. 'title' => 'The Mystery of Capitalism'
  39. ),
  40. array(
  41. 'author' => 'Henry Hazlitt',
  42. 'title' => 'Economics in One Lesson'
  43. ),
  44. array(
  45. 'author' => 'Milton Friedman',
  46. 'title' => 'Free to Choose'
  47. )
  48. );
  49. // теперь присваиваем данные по книгам экземпляру Zend_View
  50. Zend_Loader::loadClass('Zend_View');
  51. $view = new Zend_View();
  52. $view->books = $data;
  53. // и выполняем скрипт вида "booklist.php"
  54. echo $view->render('booklist.php');
  55. ]]></programlisting>
  56. </sect2>
  57. <sect2 id="zend.view.introduction.view">
  58. <title>Скрипт вида</title>
  59. <para>
  60. Теперь нам нужен сопутствующий скрипт вида "booklist.php".
  61. Это такой же скрипт PHP, как и остальные, за одним исключением:
  62. он выполняется в области видимости экземпляра <classname>Zend_View</classname>,
  63. это означает, что <varname>$this</varname> ссылается на
  64. экземпляр <classname>Zend_View</classname>. Переменные, присваиваемые в
  65. контроллере для скрипта вида, являются открытыми свойствами
  66. экземпляра <classname>Zend_View</classname>. Таким образом, базовый скрипт
  67. вида может выглядеть следующим образом:
  68. </para>
  69. <programlisting language="php"><![CDATA[
  70. <?php if ($this->books): ?>
  71. <!-- Таблица из нескольких книг. -->
  72. <table>
  73. <tr>
  74. <th>Author</th>
  75. <th>Title</th>
  76. </tr>
  77. <?php foreach ($this->books as $key => $val): ?>
  78. <tr>
  79. <td><?php echo $this->escape($val['author']) ?></td>
  80. <td><?php echo $this->escape($val['title']) ?></td>
  81. </tr>
  82. <?php endforeach; ?>
  83. </table>
  84. <?php else: ?>
  85. <p>Нет книг для отображения.</p>
  86. <?php endif; ?>
  87. ]]></programlisting>
  88. <para>
  89. Обратите внимание, что мы используем метод <code>escape()</code>
  90. для экранирования переменных.
  91. </para>
  92. </sect2>
  93. <sect2 id="zend.view.introduction.options">
  94. <title>Опции</title>
  95. <para>
  96. <classname>Zend_View</classname> имеет несколько опций, которые могут
  97. использоваться для управления поведением ваших скриптов вида:
  98. </para>
  99. <itemizedlist>
  100. <listitem>
  101. <para>
  102. <code>basePath</code> - базовый путь, начиная от которого
  103. устанавливаются пути скриптов, помощников и фильтров.
  104. Предполагается, что используется следующая структура
  105. директорий:
  106. </para>
  107. <programlisting language="php"><![CDATA[
  108. base/path/
  109. helpers/
  110. filters/
  111. scripts/
  112. ]]></programlisting>
  113. <para>
  114. Эта опция может быть установлена через методы
  115. <code>setBasePath()</code>, <code>addBasePath()</code> или
  116. опцию <code>basePath</code> для конструктора.
  117. </para>
  118. </listitem>
  119. <listitem><para>
  120. <code>encoding</code> - кодировка, которую следует использовать
  121. при вызове функций <code>htmlentities()</code>,
  122. <code>htmlspecialchars()</code> и др. По умолчанию используется
  123. ISO-8859-1 (latin1). Может быть установлена через метод
  124. <code>setEncoding()</code> или опцию <code>encoding</code> для
  125. конструктора.
  126. </para></listitem>
  127. <listitem><para>
  128. <code>escape</code> - обратный вызов, который следует
  129. использовать для метода <code>escape()</code>. Может быть
  130. установлен через метод <code>setEscape()</code> или опцию
  131. <code>escape</code> для конструктора.
  132. </para></listitem>
  133. <listitem><para>
  134. <code>filter</code> - фильтр, который следует использовать после
  135. рендеринга скрипта вида. Может быть установлен через методы
  136. <code>setFilter()</code>, <code>addFilter()</code>, или опцию
  137. <code>filter</code> для конструктора.
  138. </para></listitem>
  139. <listitem><para>
  140. <code>strictVars</code> - если опция установлена, то
  141. <classname>Zend_View</classname> генерирует уведомления (notices) и
  142. предупреждения (warnings), когда производится обращение к
  143. неинициализированной переменной. Опция может быть
  144. установлена посредством вызова <code>strictVars(true)</code> или
  145. передачи опции <code>strictVars</code> конструктору.
  146. </para></listitem>
  147. </itemizedlist>
  148. </sect2>
  149. <sect2 id="zend.view.introduction.shortTags">
  150. <title>Короткие теги в скриптах вида</title>
  151. <para>
  152. В нашей документации и примерах мы применяем короткие теги PHP:
  153. <code>&lt;?</code> and <code>&lt;?=</code>. Кроме того, мы обычно
  154. используем <ulink
  155. url="http://us.php.net/manual/en/control-structures.alternative-syntax.php">альтернативный
  156. синтаксис для управляющих структур</ulink>. Их удобно
  157. использовать при написании скриптов вида, они делают конструкции
  158. более лаконичными и позволяют размещать операторы без лишних
  159. переходов на другую строку.
  160. </para>
  161. <para>
  162. Несмотря на это, многие разработчики
  163. предпочитают использовать длинную форму записи для обеспечения
  164. валидности или переносимости кода. Например, в рекомендуемой
  165. конфигурации PHP
  166. (файл php.ini.recommended) опция <code>short_open_tag</code>
  167. отключена. Также, если вы используете XML в своих скриптах
  168. вида, то с короткими открывающими тегами PHP они не будут проходить
  169. валидацию.
  170. </para>
  171. <para>
  172. Кроме того, если вы используете короткие теги, и опция
  173. <code>short_open_tag</code> отключена, то скрипты вида будут либо
  174. приводить к ошибкам выполнения, либо просто выводить пользователю
  175. код, включенный в эти теги.
  176. </para>
  177. <para>
  178. В последнем случае, если вы хотите использовать короткие теги,
  179. но они отключены, у вас есть два возможных решения:
  180. </para>
  181. <itemizedlist>
  182. <listitem>
  183. <para>
  184. Включить короткие теги в своем файле <code>.htaccess</code>:
  185. </para>
  186. <programlisting language="apache"><![CDATA[
  187. php_value "short_open_tag" "on"
  188. ]]></programlisting>
  189. <para>
  190. Это будет действовать только в том случае, если у вас есть
  191. права на создание и использование файлов <code>.htaccess</code>.
  192. Эта директива также может быть добавлена в
  193. конфигурационный файл <code>httpd.conf</code>.
  194. </para>
  195. </listitem>
  196. <listitem>
  197. <para>
  198. Включить обертку потока (stream wrapper), которая будет
  199. на лету преобразовывать короткие теги в полные:
  200. </para>
  201. <programlisting language="php"><![CDATA[
  202. $view->setUseStreamWrapper(true);
  203. ]]></programlisting>
  204. <para>
  205. В этом вызове <classname>Zend_View_Stream</classname> регистрируется в
  206. качестве обертки потока к скриптам вида, благодаря этому
  207. код будет работать так же, как если бы короткие теги были
  208. были включены.
  209. </para>
  210. </listitem>
  211. </itemizedlist>
  212. <note>
  213. <title>Обертка потока для скриптов вида снижает производительность</title>
  214. <para>
  215. Использование обертки потока <emphasis>снижает</emphasis>
  216. производительность вашего приложения.
  217. Мы рекомендуем включать короткие
  218. теги, переписывать свои скрипты вида с тем, чтобы
  219. использовалась полная форма записи тегов, либо использовать
  220. продуманную стратегию частичного или полного кэширования
  221. содержимого страниц.
  222. </para>
  223. </note>
  224. </sect2>
  225. <sect2 id="zend.view.introduction.accessors">
  226. <title>Вспомогательные аксессоры</title>
  227. <para>
  228. Скорее всего, вам никогда не понадобится вызывать
  229. <code>assign()</code>, <code>render()</code> и другие
  230. перечисленные ниже методы
  231. для установки/добавления фильтров, помощников, путей к скриптам
  232. вида. Тем не менее, если требуется расширить класс
  233. <classname>Zend_View</classname> или нужен доступ к его внутреннему коду,
  234. то можно использовать следующие аксессоры:
  235. </para>
  236. <itemizedlist>
  237. <listitem>
  238. <para>
  239. <code>getVars()</code> возвращает все установленные
  240. переменные.
  241. </para>
  242. </listitem>
  243. <listitem>
  244. <para>
  245. <code>clearVars()</code> удаляет все присвоенные переменные,
  246. полезен, если вы хотите повторно использовать объект вида,
  247. но хотите контролировать доступность переменных.
  248. </para>
  249. </listitem>
  250. <listitem>
  251. <para>
  252. <code>getScriptPath($script)</code> возвращает вычисленный
  253. путь к данному скрипту вида.
  254. </para>
  255. </listitem>
  256. <listitem>
  257. <para>
  258. <code>getScriptPaths()</code> возвращает все
  259. зарегистрированные пути к скриптам вида.
  260. </para>
  261. </listitem>
  262. <listitem>
  263. <para>
  264. <code>getHelperPath($helper)</code> возвращает вычисленный
  265. путь к классу помощника, имя которого передается в
  266. качестве параметра.
  267. </para>
  268. </listitem>
  269. <listitem>
  270. <para>
  271. <code>getHelperPaths()</code> возвращает все
  272. зарегистрированные пути к классам помощников.
  273. </para>
  274. </listitem>
  275. <listitem>
  276. <para>
  277. <code>getFilterPath($filter)</code> возвращает вычисленный
  278. путь к классу фильтра, имя которого передается в
  279. качестве параметра.
  280. </para>
  281. </listitem>
  282. <listitem>
  283. <para>
  284. <code>getFilterPaths()</code> возвращает все
  285. зарегистрированные пути к классам фильтров.
  286. </para>
  287. </listitem>
  288. </itemizedlist>
  289. </sect2>
  290. </sect1>
  291. <!--
  292. vim:se ts=4 sw=4 et:
  293. -->