Zend_View-Introduction.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 21829 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.view.introduction">
  5. <title>Wprowadzenie</title>
  6. <para>
  7. Zend_View jest klasą zapewniającą obsługę części widoku ("view")
  8. we wzorcu projektowym MVC (model-view-controller). Istnieje ona
  9. w celu oddzielenia wyglądu aplikacji od kontrolerów i danych.
  10. Zapewnia system skryptów helperów i filtrów.
  11. </para>
  12. <para>
  13. Zend_View jest bardzo prostym systemem; możesz użyć PHP jako
  14. języka szablonów lub utworzyć instancje innych systemów szablonów,
  15. a następnie manipulować nimi wewnątrz skryptu widoku.
  16. </para>
  17. <para>
  18. Zasadniczo użycie Zend_View składa się z dwóch kroków:
  19. 1. Twój skrypt kontrolera tworzy instancję klasy
  20. Zend_View i przekazuje zmienne do tej instancji.
  21. 2. Kontroler mówi obiektowi Zend_View aby przetworzył określony skrypt
  22. widoku, skutkiem tego jest wygenerowanie wyjściowego widoku.
  23. </para>
  24. <sect2 id="zend.view.introduction.controller">
  25. <title>Skrypt kontrolera</title>
  26. <para>
  27. Aby pokazać prosty przykład załóżmy, że kontroler ma dane w postaci
  28. listy książek i chcemy aby były one przetworzone jako widok. Skrypt
  29. kontrolera mógłby wyglądać tak:
  30. </para>
  31. <programlisting role="php"><![CDATA[
  32. // użyjmy modelu aby uzyskać dane o autorach książek i ich tytułach
  33. $data = array(
  34. array(
  35. 'author' => 'Hernando de Soto',
  36. 'title' => 'The Mystery of Capitalism'
  37. ),
  38. array(
  39. 'author' => 'Henry Hazlitt',
  40. 'title' => 'Economics in One Lesson'
  41. ),
  42. array(
  43. 'author' => 'Milton Friedman',
  44. 'title' => 'Free to Choose'
  45. )
  46. );
  47. // przekażmy dane o książkach do instancji Zend_View
  48. Zend_Loader::loadClass('Zend_View');
  49. $view = new Zend_View();
  50. $view->books = $data;
  51. // wygenerujemy wyjściowy widok o nazwie "booklist.php"
  52. echo $view->render('booklist.php');
  53. ]]>
  54. </programlisting>
  55. </sect2>
  56. <sect2 id="zend.view.introduction.view">
  57. <title>Skrypt widoku</title>
  58. <para>
  59. Teraz potrzebujemy skryptu widoku "booklist.php". Jest
  60. to skrypt PHP jak każdy inny, z jednym wyjątkiem: jest on wykonywany
  61. w przestrzeni instancji Zend_View, co oznacza, że odnosi się on do
  62. właściwości i metod klasy Zend_View za pomocą $this. Zmienne
  63. przekazane do tej instancji przez kontroler są publicznymi
  64. właściwościami instancji Zend_View) więc bardzo prosty skrypt
  65. mógłby wyglądać tak:
  66. </para>
  67. <programlisting role="php"><![CDATA[
  68. if ($this->books): ?>
  69. <!-- Tabela z książkami. -->
  70. <table>
  71. <tr>
  72. <th>Autor</th>
  73. <th>Tytuł</th>
  74. </tr>
  75. <?php foreach ($this->books as $key => $val): ?>
  76. <tr>
  77. <td><?php echo $this->escape($val['author']) ?></td>
  78. <td><?php echo $this->escape($val['title']) ?></td>
  79. </tr>
  80. <?php endforeach; ?>
  81. </table>
  82. <?php else: ?>
  83. <p>Nie ma żadnych książek do wyświetlenia.</p>
  84. <?php endif;
  85. ]]>
  86. </programlisting>
  87. <para>
  88. Zauważ, że używamy metody "escape()" aby przefiltrować zmienne
  89. wyjściowe.
  90. </para>
  91. </sect2>
  92. <sect2 id="zend.view.introduction.options">
  93. <title>Opcje</title>
  94. <para>
  95. <code>Zend_View</code> posiada kilka opcji, które mogą być użyte do
  96. skonfigurowania zachowania skryptów widoków.
  97. </para>
  98. <itemizedlist>
  99. <listitem>
  100. <para>
  101. <code>basePath:</code> określa bazową ścieżkę, wewnątrz
  102. której znajdują się skrypty widoków, klasy helperów oraz
  103. klasy filtrów. Zakładane jest, że struktura katalogów
  104. wygląda tak:
  105. </para>
  106. <programlisting role="php"><![CDATA[
  107. base/path/
  108. helpers/
  109. filters/
  110. scripts/
  111. ]]>
  112. </programlisting>
  113. <para>
  114. Ta opcja może być ustawiona za pomocą metody
  115. <code>setBasePath()</code>, metody <code>addBasePath()</code>,
  116. lub jako opcja <code>basePath</code> przekazana do
  117. konstruktora.
  118. </para>
  119. </listitem>
  120. <listitem><para>
  121. <code>encoding:</code> określa kodowanie znaków, które ma być
  122. użyte przez metody <code>htmlentities()</code>,
  123. <code>htmlspecialchars()</code> oraz w innych operacjach.
  124. Domyślnie jest to ISO-8859-1 (latin1). Może być ustawione za
  125. pomocą metody <code>setEncoding()</code> lub jako opcja
  126. <code>encoding</code> konstruktora.
  127. </para></listitem>
  128. <listitem><para>
  129. <code>escape:</code> określa funkcję używaną przez metodę
  130. <code>escape()</code>. Może być ustawiona za pomocą metody
  131. <code>setEscape()</code> lub za pomocą opcji <code>escape</code>
  132. konstruktora.
  133. </para></listitem>
  134. <listitem><para>
  135. <code>filter:</code> określa filtr, który ma być użyty po
  136. renderowaniu skryptu widoku. Może być ustawiony za pomocą
  137. metody <code>setFilter()</code>, metody <code>addFilter()</code>,
  138. lub za pomocą opcji <code>filter</code> konstruktora.
  139. </para></listitem>
  140. <listitem><para>
  141. <code>strictVars:</code> zmusza <code>Zend_View</code> do
  142. wyświetlania not i ostrzeżeń, wtedy gdy zdarzy się próba
  143. uzyskania dostępu do niezainicjowanych zmiennych widoków.
  144. Może to być ustawione przez wywołanie metody
  145. <code>strictVars(true)</code> lub przekazanie opcji
  146. <code>strictVars</code> do konstruktora.
  147. </para></listitem>
  148. </itemizedlist>
  149. </sect2>
  150. <sect2 id="zend.view.introduction.shortTags">
  151. <title>Krótkie znaczniki wewnątrz skryptów widoków</title>
  152. <para>
  153. W naszych przykładach i dokumentacji używamy krótkich znaczników PHP:
  154. <code>&lt;?</code> oraz <code>&lt;?=</code>.
  155. Dodatkowo używamy <ulink
  156. url="http://us.php.net/manual/en/control-structures.alternative-syntax.php">alternatywnej
  157. składni instrukcji kontrolnych</ulink>. Te wygodne skróty,
  158. których można użyć w skryptach widoków, pozwalają na zwiększenie
  159. czytelności kodu
  160. </para>
  161. <para>
  162. Jednak wielu programistów woli używać pełnych znaczników dla celów
  163. poprawności czy przenośności aplikacji. Przykładowo dyrektywa
  164. <code>short_open_tag</code> jest wyłączona w rekomendowanym pliku
  165. konfiguracyjnym php.ini.recommended, a także jeśli używasz w
  166. skryptach widoków języka XML, krótkie znaczniki mogłyby powodować
  167. błędy.
  168. </para>
  169. <para>
  170. Dodatkowo, jeśli użyjesz krótkich znaczników gdy ich obsługa jest
  171. wyłączona, to mogą wystąpić błędy w skryptach widoków lub po prostu
  172. kod może zostać wyświetlony użytkownikom.
  173. </para>
  174. <para>
  175. W przypadku gdy chcesz użyć krótkich znaczników, a ich obsługa jest
  176. wyłączona, masz dwa rozwiązania:
  177. </para>
  178. <itemizedlist>
  179. <listitem>
  180. <para>
  181. Włączyć krótkie znaczniki w pliku <code>.htaccess</code>:
  182. </para>
  183. <programlisting role="apache"><![CDATA[
  184. php_value "short_open_tag" "on"
  185. ]]>
  186. </programlisting>
  187. <para>
  188. To będzie możliwe tylko jeśli posiadasz uprawnienia
  189. pozwalające na tworzenie i użycie plików
  190. <code>.htaccess</code>. Ta dyrektywa może być także dodana
  191. do pliku <code>httpd.conf</code>.
  192. </para>
  193. </listitem>
  194. <listitem>
  195. <para>
  196. Włączyć alternatywną obsługę strumienia danych, aby w locie
  197. konwertować krótkie znaczniki na pełne:
  198. </para>
  199. <programlisting role="php"><![CDATA[
  200. $view->setUseStreamWrapper(true);
  201. ]]>
  202. </programlisting>
  203. <para>
  204. Rejestruje to klasę <code>Zend_View_Stream</code> jako klasę
  205. obsługującą strumień danych dla skryptów widoków i umożliwia
  206. dalsze działanie skryptów widoków, tak jakby obsługa krótkich
  207. znaczników była aktywna.
  208. </para>
  209. </listitem>
  210. </itemizedlist>
  211. <note>
  212. <title>Alternatywna obsługa strumienia danych zmniejsza wydajność</title>
  213. <para>
  214. Użycie strumienia danych <emphasis>zmniejszy</emphasis> wydajność
  215. aplikacji, ale obecnie nie są dostępne testy które mogłyby pokazać
  216. jak bardzo zmniejszy. Zalecamy włączenie obsługi krótkich
  217. znaczników, konwersję skryptów widoków aby używały pełnych
  218. znaczników lub wprowadzenie dobrego buforowania części lub
  219. całości widoków.
  220. </para>
  221. </note>
  222. </sect2>
  223. <sect2 id="zend.view.introduction.accessors">
  224. <title>Narzędziowe metody dostępowe</title>
  225. <para>
  226. W większości przypadków będziesz używał tylko metod
  227. <code>assign()</code>, <code>render()</code>, lub jednej z metod
  228. do ustawiania/dodawania filtrów, klas helperów oraz ścieżek
  229. skryptów widoków. Jednak jeśli chcesz samodzielnie rozszerzyć klasę
  230. <code>Zend_View</code>, lub potrzebujesz dostępu do jej pewnych
  231. wewnętrznych funkcjonalności, to możesz użyć kilku istniejących
  232. metod dostępowych:
  233. </para>
  234. <itemizedlist>
  235. <listitem>
  236. <para>
  237. <code>getVars()</code> zwraca wszystkie przypisane zmienne.
  238. </para>
  239. </listitem>
  240. <listitem>
  241. <para>
  242. <code>clearVars()</code> wyczyści wszystkie przypisane
  243. zmienne; użyteczne gdy chcesz ponownie użyć obiektu widoku,
  244. ale chcesz zachować kontrolę nad tym, które zmienne mają
  245. być dostępne.
  246. </para>
  247. </listitem>
  248. <listitem>
  249. <para>
  250. <code>getScriptPath($script)</code> zwraca ścieżkę dla
  251. podanego skryptu widoku.
  252. </para>
  253. </listitem>
  254. <listitem>
  255. <para>
  256. <code>getScriptPaths()</code> zwraca wszystkie
  257. zarejestrowane ścieżki skryptów widoków.
  258. </para>
  259. </listitem>
  260. <listitem>
  261. <para>
  262. <code>getHelperPath($helper)</code> zwraca ścieżkę dla
  263. podanej klasy helpera.
  264. </para>
  265. </listitem>
  266. <listitem>
  267. <para>
  268. <code>getHelperPaths()</code> zwraca wszystkie
  269. zarejestrowane ścieżki klas helperów.
  270. </para>
  271. </listitem>
  272. <listitem>
  273. <para>
  274. <code>getFilterPath($filter)</code> zwraca ścieżkę dla
  275. podanej klasy filtra.
  276. </para>
  277. </listitem>
  278. <listitem>
  279. <para>
  280. <code>getFilterPaths()</code> zwraca wszystkie zarejestrowane
  281. ścieżki klas filtrów.
  282. </para>
  283. </listitem>
  284. </itemizedlist>
  285. </sect2>
  286. </sect1>