Zend_View-Introduction.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: 22917 -->
  4. <sect1 id="zend.view.introduction">
  5. <title>Einführung</title>
  6. <para>
  7. <classname>Zend_View</classname> ist eine Klasse für die Verarbeitung des "View" Teils des
  8. Model-View-Controller Entwurfsmusters. Er existiert, um das View-Skript von den Model- und
  9. Controller-Skripten zu trennen. Es stellt ein System an Helfern, Ausgabefiltern und
  10. Variablenmaskierung bereit.
  11. </para>
  12. <para>
  13. <classname>Zend_View</classname> ist unabhängig von einem Template-System. Du kannst
  14. <acronym>PHP</acronym> als Template-Sprache verwenden oder Instanzen anderer Template-
  15. Systeme erstellen und diese in deinem View-Skript verarbeiten.
  16. </para>
  17. <para>
  18. Im wesentlichen verläuft die Verwendung von <classname>Zend_View</classname> in zwei
  19. Hauptschritten: 1. Dein Controller-Skript erstellt eine Instanz von
  20. <classname>Zend_View</classname> und übergibt Variablen an diese Instanz. 2. Der Controller
  21. teilt <classname>Zend_View</classname> mit, ein bestimmtes View-Skript zu verarbeiten. Dabei
  22. wird die Kontrolle an das View-Skript übergeben, welches die Ausgabe erstellt.
  23. </para>
  24. <sect2 id="zend.view.introduction.controller">
  25. <title>Controller-Skript</title>
  26. <para>
  27. In einem einfachen Beispiel hat dein Controller-Skript eine Liste von Buchdaten, die
  28. von einem View-Skript verarbeitet werden sollen. Dieses Controller-Skript kann ungefähr
  29. so aussehen:
  30. </para>
  31. <programlisting language="php"><![CDATA[
  32. // verwende ein Modell, um die Daten der Bücher und Autoren zu erhalten
  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. // nun übergebe die Buchdaten an die Zend_View Instanz
  48. Zend_Loader::loadClass('Zend_View');
  49. $view = new Zend_View();
  50. $view->books = $data;
  51. // und verarbeite ein View Skript mit Namen "booklist.php"
  52. echo $view->render('booklist.php');
  53. ]]></programlisting>
  54. </sect2>
  55. <sect2 id="zend.view.introduction.view">
  56. <title>View Skript</title>
  57. <para>
  58. Nun benötigen wir das zugehörige View-Skript "booklist.php". Dies ist ein
  59. <acronym>PHP</acronym>-Skript wie jedes andere mit einer Ausnahme: es wird innerhalb der
  60. Instanz <classname>Zend_View</classname> ausgeführt, was bedeutet, dass Referenzen auf
  61. $this auf die Eigenschaften und Methoden der Instanz <classname>Zend_View</classname>
  62. weisen. (Variablen, die vom Controller an die Instanz übergeben wurden, sind öffentliche
  63. (public) Eigenschaften der <classname>Zend_View</classname> Instanz). Dadurch kann ein
  64. sehr einfaches View-Skript wie folgt aussehen:
  65. </para>
  66. <programlisting language="php"><![CDATA[
  67. <?php if ($this->books): ?>
  68. <!-- Eine Tabelle mit einigen Büchern. -->
  69. <table>
  70. <tr>
  71. <th>Autor</th>
  72. <th>Titel</th>
  73. </tr>
  74. <?php foreach ($this->books as $key => $val): ?>
  75. <tr>
  76. <td><?php echo $this->escape($val['author']) ?></td>
  77. <td><?php echo $this->escape($val['title']) ?></td>
  78. </tr>
  79. <?php endforeach; ?>
  80. </table>
  81. <?php else: ?>
  82. <p>Es gibt keine Bücher zum Anzeigen.</p>
  83. <?php endif;?>
  84. ]]></programlisting>
  85. <para>
  86. Beachte, wie wir die "escape()" Methode verwenden, um die Variablen für die Ausgabe zu
  87. maskieren.
  88. </para>
  89. </sect2>
  90. <sect2 id="zend.view.introduction.options">
  91. <title>Optionen</title>
  92. <para>
  93. <classname>Zend_View</classname> hat einige Optionen, die gesetzt werden können, um
  94. das Verhalten deiner View-Skripte zu konfigurieren.
  95. </para>
  96. <itemizedlist>
  97. <listitem>
  98. <para>
  99. <property>basePath</property>: zeigt den Basispfad von dem der Skript-, Helfer-
  100. und Filterpfad gesetzt wird. Es nimmt folgende Verzeichnisstruktur an:
  101. </para>
  102. <programlisting language="php"><![CDATA[
  103. base/path/
  104. helpers/
  105. filters/
  106. scripts/
  107. ]]></programlisting>
  108. <para>
  109. Das kann über <methodname>setBasePath()</methodname>,
  110. <methodname>addBasePath()</methodname>, oder die <property>basePath</property>
  111. Option dem Konstruktor gesetzt werden.
  112. </para>
  113. </listitem>
  114. <listitem>
  115. <para>
  116. <property>encoding</property>: gibt das Verschlüsseln der Zeichen für die
  117. Verwendung mit <methodname>htmlentities()</methodname>,
  118. <methodname>htmlspecialchars()</methodname>, und anderen Operationen an.
  119. Standardwert ist UTF-8. Kann über
  120. <methodname>setEncoding()</methodname>, oder die Option <property>encoding</property>
  121. im Constructor, gesetzt werden.
  122. </para>
  123. </listitem>
  124. <listitem>
  125. <para>
  126. <property>escape</property>: gibt eine Callback-Funktion an, welche durch
  127. <methodname>escape()</methodname> benutzt wird. Kann über
  128. <methodname>setEscape()</methodname>, oder die Option <property>escape</property>
  129. im Konstruktor, gesetzt werden.
  130. </para>
  131. </listitem>
  132. <listitem>
  133. <para>
  134. <property>filter</property>: gibt einen Filter an, welcher nach dem Rendern des
  135. View Skripts verwendet wird. Kann über <methodname>setFilter()</methodname>,
  136. <methodname>addFilter()</methodname>, oder die Option <property>filter</property>
  137. im Konstruktor, gesetzt werden.
  138. </para>
  139. </listitem>
  140. <listitem>
  141. <para>
  142. <property>strictVars:</property> zwingt <classname>Zend_View</classname> Notizen
  143. und Warnungen auszugeben, wenn auf nicht initialisierte View-Variablen
  144. zugegriffen wird. Das kann durch den Aufruf von
  145. <methodname>strictVars(true)</methodname>, oder der Übergabe der
  146. Option <property>strictVars</property> im Konstruktor, gesetzt werden.
  147. </para>
  148. </listitem>
  149. </itemizedlist>
  150. </sect2>
  151. <sect2 id="zend.view.introduction.shortTags">
  152. <title>View Skripte mit Short Tags</title>
  153. <para>
  154. In unseren Beispielen verwenden wir <acronym>PHP</acronym> Long
  155. Tags: <emphasis>&lt;?php</emphasis>. Wir empfehlen auch die <ulink
  156. url="http://us.php.net/manual/en/control-structures.alternative-syntax.php">
  157. alternative Syntax für Kontrollstrukturen</ulink>. Diese sind übliche Abkürzungen
  158. die verwendet werden, wenn View-Skripte geschrieben werden, da sie Konstrukte
  159. verständlicher machen, die Anweisungen auf einer einzelnen Zeile belassen und die
  160. Notwendigkeit eleminieren nach Klammern im <acronym>HTML</acronym> zu suchen.
  161. </para>
  162. <para>
  163. In vorhergehenden Versionen haben wir oft die Verwendung von Short Tags empfohlen
  164. (<emphasis>&lt;?</emphasis> und <emphasis>&lt;?=</emphasis>), da sie die View-Skripte
  165. weniger kompliziert machen. Trotzdem ist der Standardwert der
  166. <filename>php.ini</filename>-Option <constant>short_open_tag</constant> typischerweise
  167. in Produktion oder bei Shared Hosts deaktiviert -- was deren Verwendung nicht wirklich
  168. portabel macht. Wenn man <acronym>XML</acronym> in View-Skripten als Template verwendet,
  169. werden Short Open Tags dazu führen das die Prüfung der Templates fehlschlägt.
  170. Letztendlich, wenn man Short Tags verwendet, während <constant>short_open_tag</constant>
  171. ausgeschaltet ist, werden die View Skripte entweder Fehler verursachen oder einfach den
  172. <acronym>PHP</acronym>-Code an den Betrachter zurücksenden.
  173. </para>
  174. <para>
  175. Wenn man trotz der Warnungen Short Tags verwenden will, diese aber ausgeschaltet sind,
  176. hat man zwei Optionen:
  177. </para>
  178. <itemizedlist>
  179. <listitem>
  180. <para>
  181. Die Short Tags in der <filename>.htaccess</filename> Datei einschalten:
  182. </para>
  183. <programlisting language="apache"><![CDATA[
  184. php_value "short_open_tag" "on"
  185. ]]></programlisting>
  186. <para>
  187. Das ist nur dann möglich, wenn es erlaubt ist <filename>.htaccess</filename>
  188. Dateien zu erstellen und anzupassen. Diese Direktive kann auch in der
  189. Datei <filename>httpd.conf</filename> hinzugefügt werden.
  190. </para>
  191. </listitem>
  192. <listitem>
  193. <para>
  194. Einen optionalen Stream Wrapper einschalten um Short Tags zu Long Tags on the
  195. fly zu konvertieren:
  196. </para>
  197. <programlisting language="php"><![CDATA[
  198. $view->setUseStreamWrapper(true);
  199. ]]></programlisting>
  200. <para>
  201. Das registriert <classname>Zend_View_Stream</classname> als Stream Wrapper für
  202. View-Skripte, und stellt sicher, dass der Code weiterhin funktioniert, wie wenn
  203. Short Tags eingeschaltet wären.
  204. </para>
  205. </listitem>
  206. </itemizedlist>
  207. <warning>
  208. <title>View Stream Wrapper verringert die Geschwindigkeit</title>
  209. <para>
  210. Die Verwendung des Stream Wrapper <emphasis>wird</emphasis> die Geschwindigkeit der
  211. Anwendung verringern, auch wenn es nicht möglich ist, Benchmarks durchzuführen um
  212. den Grad der Verlangsamung festzustellen. Wir empfehlen, dass entweder Short Tags
  213. aktiviert werden, die Skripte volle Tags verwenden, oder eine gute Strategie für
  214. das Cachen von partiellen, und/oder volle Seiteninhalten vorhanden ist.
  215. </para>
  216. </warning>
  217. </sect2>
  218. <sect2 id="zend.view.introduction.accessors">
  219. <title>Zugriff auf Dienstprogramme</title>
  220. <para>
  221. Typischerweise ist es nur notwendig <methodname>assign()</methodname>,
  222. <methodname>render()</methodname>, oder eine der Methoden für das Setzen/Hinzufügen von
  223. Filtern, Helfern und Skript-Pfade aufzurufen. Wenn <classname>Zend_View</classname>
  224. trotzdem selbst erweitert werden soll, oder auf einige der
  225. Internas zugegriffen werden soll, existieren hierfür einige Zugriffsmöglichkeiten:
  226. </para>
  227. <itemizedlist>
  228. <listitem>
  229. <para>
  230. <methodname>getVars()</methodname> gibt alle zugeordneten Variablen zurück.
  231. </para>
  232. </listitem>
  233. <listitem>
  234. <para>
  235. <methodname>clearVars()</methodname> löscht alle zugeordneten Variablen;
  236. Nützlich wenn ein View-Objekt wiederverwendet werden, aber auch kontrolliert
  237. werden soll welche Variablen vorhanden sind.
  238. </para>
  239. </listitem>
  240. <listitem>
  241. <para>
  242. <methodname>getScriptPath($script)</methodname> ruft den aufgelösten Pfad zu
  243. einem gegebenen View-Skript ab.
  244. </para>
  245. </listitem>
  246. <listitem>
  247. <para>
  248. <methodname>getScriptPaths()</methodname> ruft alle registrierten
  249. Skript-Pfade ab.
  250. </para>
  251. </listitem>
  252. <listitem>
  253. <para>
  254. <methodname>getHelperPath($helper)</methodname> ruft den aufgelösten Pfad
  255. zur angegebenen Helferklasse ab.
  256. </para>
  257. </listitem>
  258. <listitem>
  259. <para>
  260. <methodname>getHelperPaths()</methodname> ruft alle registrierten
  261. Helferpfade ab.
  262. </para>
  263. </listitem>
  264. <listitem>
  265. <para>
  266. <methodname>getFilterPath($filter)</methodname> ruft den aufgelösten Pfad
  267. zur angegebenen Filterklasse ab.
  268. </para>
  269. </listitem>
  270. <listitem>
  271. <para>
  272. <methodname>getFilterPaths()</methodname> ruft alle registrierten
  273. Filterpfade ab.
  274. </para>
  275. </listitem>
  276. </itemizedlist>
  277. </sect2>
  278. </sect1>