Zend_Controller-ActionHelpers-ViewRenderer.xml 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 16162 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.controller.actionhelpers.viewrenderer">
  5. <title>ViewRenderer</title>
  6. <sect4 id="zend.controller.actionhelper.viewrenderer.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. Der <emphasis>ViewRenderer</emphasis> Helfer wurde designt um die folgenden Ziele
  10. erfüllen:
  11. </para>
  12. <itemizedlist>
  13. <listitem>
  14. <para>
  15. Entfernen der Notwendigkeit View Objekte innerhalb der Kontroller zu
  16. instanzieren; View Objekte werden automatisch mit dem Kontroller registriert.
  17. </para>
  18. </listitem>
  19. <listitem>
  20. <para>
  21. Automatisch View Skript, Helfer und Filter Pfade setzen basierend auf dem
  22. aktuellen Modul, und den aktuellen Modulnamen automatisch als Klassenprefix für
  23. Helfer und Filterklassen assoziieren.
  24. </para>
  25. </listitem>
  26. <listitem>
  27. <para>
  28. Ein global vorhandenes View Objekt für alle bearbeitenden Kontroller und
  29. Aktionen erstellen.
  30. </para>
  31. </listitem>
  32. <listitem>
  33. <para>
  34. Dem Entwickler erlauben das Standard View Rendering Optionen für alle Kontroller
  35. gesetzt werden.
  36. </para>
  37. </listitem>
  38. <listitem>
  39. <para>
  40. Die Fähigkeit hinzufügen das ein View Skript ohne Intervention automatisch
  41. gerendert wird.
  42. </para>
  43. </listitem>
  44. <listitem>
  45. <para>
  46. Dem Entwickler erlauben seine eigenen Spezifikationen, für den View Basisnamen
  47. und für View Skriptpfade, zu erstellen.
  48. </para>
  49. </listitem>
  50. </itemizedlist>
  51. <note>
  52. <para>
  53. Wenn man ein <methodname>_forward()</methodname>, eine Umleitung, oder ein
  54. <code>render</code> manuell durchführt, wird kein automatisches rendern erfolgen,
  55. da man beim Ausführen von jeder dieser Aktionen dem
  56. <emphasis>ViewRenderer</emphasis> mitteilt das man seine eigene Ausgabe durchführen
  57. will.
  58. </para>
  59. </note>
  60. <note>
  61. <para>
  62. Der <emphasis>ViewRenderer</emphasis> ist standardmäßig aktiviert. Man kann Ihn
  63. über den Parameter <code>noViewRenderer</code> des Frontkontrollers deaktivieren
  64. (<methodname>$front->setParam('noViewRenderer', true)</methodname>) oder den Helfer
  65. vom Helfer Broker Stack entfernen
  66. (<methodname>Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')</methodname>).
  67. </para>
  68. <para>
  69. Wenn man Einstellungen vom <code>ViewRenderer</code> vor der Ausführung des Front
  70. Kontrollers ändern will, kann das auf zwei Wegen getan werden:
  71. </para>
  72. <itemizedlist>
  73. <listitem>
  74. <para>
  75. Instanzieren und Registrieren eines eigenen
  76. <emphasis>ViewRenderer</emphasis> Objekts und dieses an den Helfer Broker
  77. übergeben:
  78. </para>
  79. <programlisting language="php"><![CDATA[
  80. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
  81. $viewRenderer->setView($view)
  82. ->setViewSuffix('php');
  83. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  84. ]]></programlisting>
  85. </listitem>
  86. <listitem>
  87. <para>
  88. Initialisieren und/oder empfangen eines <emphasis>ViewRenderer</emphasis>
  89. Objekts auf Wunsch über den Helfer Broker:
  90. </para>
  91. <programlisting language="php"><![CDATA[
  92. $viewRenderer =
  93. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  94. $viewRenderer->setView($view)
  95. ->setViewSuffix('php');
  96. ]]></programlisting>
  97. </listitem>
  98. </itemizedlist>
  99. </note>
  100. </sect4>
  101. <sect4 id="zend.controller.actionhelper.viewrenderer.api">
  102. <title>API</title>
  103. <para>
  104. In seiner einfachsten Verwendung, kann der <emphasis>ViewRenderer</emphasis> ganz
  105. einfach instanziert und an den Aktion Helfer Broker übergeben werden. Der einfachste
  106. Weg Ihn auf einmal zu Instanzieren und Registrieren ist es, die Methode
  107. <methodname>getStaticHelper()</methodname> des Helfer Brokers zu verwenden:
  108. </para>
  109. <programlisting language="php"><![CDATA[
  110. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  111. ]]></programlisting>
  112. <para>
  113. Das erste Mal wenn ein Aktion Kontroller instanziert wird, triggert er den
  114. <emphasis>ViewRenderer</emphasis> ein View Objekt zu instanzieren. Jedes Mal wenn ein
  115. Kontroller Instanziert wird, wird die <methodname>init()</methodname> Methode des
  116. <emphasis>ViewRenderer</emphasis>'s aufgerufen, was dazu führt das er die view
  117. Eigenschaft des Aktion Kontrollers setzt, und <methodname>addScriptPath()</methodname>,
  118. mit einem Pfad relativ zum aktuellen Modul, aufruft; das wird mit einem Klassenprefix
  119. aufgerufen der nach dem aktuellen Modul benannt ist, was effektiv für alle Helfer und
  120. Filterklassen die im Modul definiert werden den Namensraum setzt.
  121. </para>
  122. <para>
  123. Jedes Mal wenn <methodname>postDispatch()</methodname> aufgerufen wird, ruft dieses
  124. <methodname>render()</methodname> für die aktuelle Aktion auf.
  125. </para>
  126. <para>
  127. Als Beispiel kann die folgende Klasse angenommen werden:
  128. </para>
  129. <programlisting language="php"><![CDATA[
  130. // Eine Kontroller Klasse, foo Modul:
  131. class Foo_BarController extends Zend_Controller_Action
  132. {
  133. // Rendert standardmäßig bar/index.phtml; keine Aktion benötigt
  134. public function indexAction()
  135. {
  136. }
  137. // Rendert bar/populate.phtml mit der Variable 'foo' gesetzt auf 'bar'.
  138. // Da View Objekte beim preDispatch() definiert werden, sind diese
  139. // bereits vorhanden.
  140. public function populateAction()
  141. {
  142. $this->view->foo = 'bar';
  143. }
  144. }
  145. ...
  146. // In einem der View Sktipte:
  147. $this->foo(); // Foo_View_Helper_Foo::foo() aufrufen
  148. ]]></programlisting>
  149. <para>
  150. Der <emphasis>ViewRenderer</emphasis> definiert auch eine Anzahl von Zugriffspunkten
  151. um das Setzen und Empfangen von View Optionen zu erlauben:
  152. </para>
  153. <itemizedlist>
  154. <listitem>
  155. <para>
  156. <methodname>setView($view)</methodname> erlaubt das Setzen des View Objektes
  157. für den <emphasis>ViewRenderer</emphasis>. Er wird als öffentliche
  158. Klasseneigenschaft <varname>$view</varname> gesetzt.
  159. </para>
  160. </listitem>
  161. <listitem>
  162. <para>
  163. <methodname>setNeverRender($flag = true)</methodname> kann verwendet werden um
  164. das automatische rendern global ein- oder auszuschalten, z.B. für alle
  165. Kontroller. Wenn er auf true gesetzt wird, ruft
  166. <methodname>postDispatch()</methodname> nicht automatisch
  167. <methodname>render()</methodname> im aktuellen Kontroller auf.
  168. <methodname>getNeverRender()</methodname> empfängt den aktuellen Wert.
  169. </para>
  170. </listitem>
  171. <listitem>
  172. <para>
  173. <methodname>setNoRender($flag = true)</methodname> kann verwendet werden um das
  174. automatische rendern ein- oder auszuschalten. Wenn er auf true gesetzt wird,
  175. wird <methodname>postDispatch()</methodname> <methodname>render()</methodname>
  176. im aktuellen Kontroller nicht automatisch aufrufen. Diese Einstellung wird
  177. jedesmal zurückgesetzt wenn <methodname>preDispatch()</methodname> aufgerufen
  178. wird (z.B. muß dieses Flag für jeden Kontroller gesetzt werden für den das
  179. automatische rendern nicht automatisch stattfinden soll).
  180. <methodname>getNoRender()</methodname> empfängt den aktuellen Wert.
  181. </para>
  182. </listitem>
  183. <listitem>
  184. <para>
  185. <methodname>setNoController($flag = true)</methodname> kann verwendet werden um
  186. <methodname>render()</methodname> zu sagen das für Aktion Skripts nicht in
  187. einem Unterverzeichnis gesucht werden soll das nach dem Kontroller benannt ist
  188. (was das Standardverhalten ist). <methodname>getNoController()</methodname>
  189. empfängt den aktuellen Wert.
  190. </para>
  191. </listitem>
  192. <listitem>
  193. <para>
  194. <methodname>setNeverController($flag = true)</methodname> ist analog zu
  195. <methodname>setNoController()</methodname>, arbeitet aber auf einem globalen
  196. Leven -- z.B. wird es nicht für jede ausgeführte Aktion resetiert.
  197. <methodname>getNeverController()</methodname> empfängt den aktuellen Wert.
  198. </para>
  199. </listitem>
  200. <listitem>
  201. <para>
  202. <methodname>setScriptAction($name)</methodname> kann verwendet werden um das
  203. Aktion Skript zu spezifizieren das gerendert werden soll.
  204. <varname>$name</varname> sollte der Name des Skripts sein, ohne den Datei
  205. Suffix (und ohne das Kontroller Unterverzeichnis, ausser wenn
  206. <code>noController</code> eingeschaltet wurde). Wenn nicht spezifiziert, wird
  207. nach einem View Skript gesucht das nach der Aktion in Anfrage Objekt benannt
  208. ist. <methodname>getScriptAction()</methodname> empfängt den aktuellen Wert.
  209. </para>
  210. </listitem>
  211. <listitem>
  212. <para>
  213. <methodname>setResponseSegment($name)</methodname> kann verwendet werden um zu
  214. spezifizieren in welches Segment das nach einem Antwort Objekt benannt ist,
  215. gerendert werden soll. Wenn nicht spezifiziert, wird in das Standard Segment
  216. gerendert. <methodname>getResponseSegment()</methodname> empfängt den aktuellen
  217. Wert.
  218. </para>
  219. </listitem>
  220. <listitem>
  221. <para>
  222. <methodname>initView($path, $prefix, $options)</methodname> kann aufgerufen
  223. werden um den Basis View Pfad, den Klassenprefix für Helfer, Filter Skripts und
  224. <emphasis>ViewRenderer</emphasis> Optionen zu spezifizieren. Es kann eines der
  225. folgenden Flags übergeben werden: <code>neverRender</code>,
  226. <code>noRender</code>, <code>noController</code>, <code>scriptAction</code>,
  227. und <code>responseSegment</code>.
  228. </para>
  229. </listitem>
  230. <listitem>
  231. <para>
  232. <methodname>setRender($action = null, $name = null, $noController =
  233. false)</methodname> erlaubt es <code>scriptAction</code>,
  234. <code>responseSegment</code>, oder <code>noController</code> in einem Schritt
  235. zu übergeben. <methodname>direct()</methodname> ist ein Alias für diese
  236. Methode, und erlaubt es diese Methode einfach vom eigenen Kontroller aus
  237. aufzurufen:
  238. </para>
  239. <programlisting language="php"><![CDATA[
  240. // Rendert 'foo' statt dem aktuellen Aktion Skript
  241. $this->_helper->viewRenderer('foo');
  242. // Rendert form.phtml zum 'html' Antwort Segment, ohne einen Kontroller aus dem
  243. // Unterverzeichnis des View Skripts zu verwenden:
  244. $this->_helper->viewRenderer('form', 'html', true);
  245. ]]></programlisting>
  246. <note><para>
  247. <methodname>setRender()</methodname> und <methodname>direct()</methodname>
  248. stellen das View Sktript nicht dar, sondern setzen Hinweise die
  249. <methodname>postDispatch()</methodname> und
  250. <methodname>render()</methodname> dann verwenden wenn die View dargestellt
  251. wird.
  252. </para></note>
  253. </listitem>
  254. </itemizedlist>
  255. <para>
  256. Der Constructor erlaubt es optional das View Objekt und
  257. <emphasis>ViewRenderer</emphasis> Optionen zu übergeben; er akzeptiert die gleichen
  258. Flags wie <methodname>initView()</methodname>:
  259. </para>
  260. <programlisting language="php"><![CDATA[
  261. $view = new Zend_View(array('encoding' => 'UTF-8'));
  262. $options = array('noController' => true, 'neverRender' => true);
  263. $viewRenderer =
  264. new Zend_Controller_Action_Helper_ViewRenderer($view, $options);
  265. ]]></programlisting>
  266. <para>
  267. Es gibt einige zusätzliche Methoden für das individualisieren von Pfadspezifikationen
  268. die für das Herausfinden des Basis View Pfades verwendet werden der dem View Objekt
  269. hinzugefügt wird, und den View Skript Pfad der verwendet wird wenn das View Skript zu
  270. dem gerendert werden soll automatisch herausgefunden wird. Diese Methoden nehmen alle
  271. ein oder mehrere der folgenden Platzhalter:
  272. </para>
  273. <itemizedlist>
  274. <listitem>
  275. <para>
  276. <emphasis>:moduleDir</emphasis> zeigt auf das aktuelle Modul Basisverzeichnis
  277. (von der Konvention her das Elternverzeicnis des Kontroller Verzeichnisses des
  278. Moduls).
  279. </para>
  280. </listitem>
  281. <listitem>
  282. <para>
  283. <emphasis>:module</emphasis> zeigt auf den aktuellen Modulnamen.
  284. </para>
  285. </listitem>
  286. <listitem>
  287. <para>
  288. <emphasis>:controller</emphasis> zeigt auf den aktuellen Kontrollernamen.
  289. </para>
  290. </listitem>
  291. <listitem>
  292. <para>
  293. <emphasis>:action</emphasis> zeigt auf den aktuellen Aktionsnamen.
  294. </para>
  295. </listitem>
  296. <listitem>
  297. <para>
  298. <emphasis>:suffix</emphasis> zeigt auf das aktuelle Suffix des View Skripts
  299. (welcher über <methodname>setViewSuffix()</methodname> gesetzt werden kann).
  300. </para>
  301. </listitem>
  302. </itemizedlist>
  303. <para>
  304. Die Methoden für das kontrollieren der Pfad Spezifikationen sind:
  305. </para>
  306. <itemizedlist>
  307. <listitem>
  308. <para>
  309. <methodname>setViewBasePathSpec($spec)</methodname> erlaubt die Änderung der
  310. Pfad Spezifikation die verwendet wird um den Basispfad herauszufinden zu dem
  311. das View Objekt hinzugefügt werden soll. Die Standardspezifikation ist
  312. <code>:moduleDir/views</code>. Die aktuelle Spezifikation kann jederzeit
  313. durch Verwenden von <methodname>getViewBasePathSpec()</methodname> erhalten
  314. werden.
  315. </para>
  316. </listitem>
  317. <listitem>
  318. <para>
  319. <methodname>setViewScriptPathSpec($spec)</methodname> erlaubt die Änderung der
  320. Pfad Spezifikation die verwendet wird um den Pfad zu einem individuellen View
  321. Skript herauszufinden (ohne den Basis View Skript Pfad). Die Standard
  322. Spezifikation ist <code>:controller/:action.:suffix</code>. Die aktuelle
  323. Spezifikation kann jederzeit durch Verwenden von
  324. <methodname>getViewScriptPathSpec()</methodname> erhalten werden.
  325. </para>
  326. </listitem>
  327. <listitem>
  328. <para>
  329. <methodname>setViewScriptPathNoControllerSpec($spec)</methodname> erlaubt die
  330. Änderung der Pfad Spezifkiation die verwendet wird um den Pfad zu einem
  331. individuellen View Skript herauszufinden wenn <code>noController</code> aktiv
  332. ist (ohne den Basis View Skript Pfad). Die Standard Spezifikation ist
  333. <code>:action.:suffix</code>. Die aktuelle Spezikifation kann jederzeit durch
  334. Verwenden von <methodname>getViewScriptPathNoControllerSpec()</methodname>
  335. erhalten werden.
  336. </para>
  337. </listitem>
  338. </itemizedlist>
  339. <para>
  340. Für eine feinkörnige Kontrolle über Pfadspezifikationen kann
  341. <link linkend="zend.filter.inflector">Zend_Filter_Inflector</link> verwendet werden.
  342. Im Hintergrund verwendet der <emphasis>ViewRenderer</emphasis> einen Inflector um
  343. bereits Abstimmungen am Pfad durchzuführen. Um auf dem Inflector einzuwirken, damit
  344. entweder ein eigener für die Verwendung gesetzt wird, oder um den Standard Inflector zu
  345. verändern, können die folgenden Methoden verwendet werden:
  346. </para>
  347. <itemizedlist>
  348. <listitem>
  349. <para>
  350. <methodname>getInflector()</methodname> empfängt den Inflector. Wenn bis dahin
  351. keiner im <emphasis>ViewRenderer</emphasis> existiert, wird dieser, anhand der
  352. Verwendung der Standard Regeln, erstellt.
  353. </para>
  354. <para>
  355. Standardmäßig verwendet dieser statische Referenzregeln für das Suffix und
  356. Modulverzeichnis, sowie ein statisches Ziel; das erlaubt verschiedenen
  357. <emphasis>ViewRenderer</emphasis> Eigenschaften den Inflector dynamisch zu
  358. ändern.
  359. </para>
  360. </listitem>
  361. <listitem>
  362. <para>
  363. <methodname>setInflector($inflector, $reference)</methodname> erlaubt das
  364. Setzen eines eigenen Inflectors für die Verwendung mit dem
  365. <emphasis>ViewRenderer</emphasis>. Wenn <varname>$reference</varname> true ist,
  366. setzt dieser das Suffix und Modulverzeichnis als statische Referenz zu
  367. <emphasis>ViewRenderer</emphasis> Eigenschaften, genauso wie das Ziel.
  368. </para>
  369. </listitem>
  370. </itemizedlist>
  371. <note>
  372. <title>Standard Konventionen für das Eruieren</title>
  373. <para>
  374. Der <emphasis>ViewRenderer</emphasis> führt einige Pfad Normalisierungen durch um
  375. das Eruieren von View Skripten einfacher zu machen. Die Standardregeln sind wie
  376. folgt:
  377. </para>
  378. <itemizedlist>
  379. <listitem>
  380. <para>
  381. <emphasis>:module</emphasis>: MixedCase und camelCaseWörter werden durch
  382. Bindestriche getrennt, und der komplette String wird auf
  383. Kleinschreibung geändert. z.B.: "FooBarBaz" wird "foo-bar-baz".
  384. </para>
  385. <para>
  386. Intern verwendet der Inflector die Filter
  387. <classname>Zend_Filter_Word_CamelCaseToDash</classname> und
  388. <classname>Zend_Filter_StringToLower</classname>.
  389. </para>
  390. </listitem>
  391. <listitem>
  392. <para>
  393. <emphasis>:controller</emphasis>: MixedCase und camelCaseWörter werden
  394. durch Bindestriche getrennt; Unterstriche werden in
  395. Verzeichnistrennzeichen konvertiert, und der komplette String wird auf
  396. Kleinschreibung geändert. Beispiele: "FooBar" wird "foo-bar";
  397. "FooBar_Admin" wird "foo-bar/admin".
  398. </para>
  399. <para>
  400. Intern verwendet der Inflector die Filter
  401. <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
  402. <classname>Zend_Filter_Word_UnderscoreToSeparator</classname> und
  403. <classname>Zend_Filter_StringToLower</classname>.
  404. </para>
  405. </listitem>
  406. <listitem>
  407. <para>
  408. <emphasis>:action</emphasis>: MixedCase und camelCaseWörter werden durch
  409. Bindestriche getrennt; nicht-anphanummerische Zeichen werden zu
  410. Bindestrichen übersetzt, und der komplette String wird auf
  411. Kleinschreibung geändert. Beispiele: "fooBar" wird "foo-bar"; "foo-barBaz"
  412. wird "foo-bar-baz".
  413. </para>
  414. <para>
  415. Intern verwendet der Inflector die Filter
  416. <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
  417. <classname>Zend_Filter_PregReplace</classname> und
  418. <classname>Zend_Filter_StringToLower</classname>.
  419. </para>
  420. </listitem>
  421. </itemizedlist>
  422. </note>
  423. <para>
  424. Die letzten Teile in der <emphasis>ViewRenderer</emphasis> API sind die Methoden für
  425. das aktuelle herausfinden von View Skript Pfaden und Rendern von Views. Diese
  426. enthalten:
  427. </para>
  428. <itemizedlist>
  429. <listitem>
  430. <para>
  431. <methodname>renderScript($script, $name)</methodname> erlaubt es ein Skript mit
  432. einem selbst spezifizierten Pfad zu rendern, optional zu einem benannten Pfad
  433. Segment. Wenn diese Methode verwendet wird, ermittelt der
  434. <emphasis>ViewRenderer</emphasis> nicht automatisch den Skriptnamen sondern
  435. übergibt das <varname>$script</varname> Argument direkt der
  436. <methodname>render()</methodname> Methode des View Objekts.
  437. </para>
  438. <note><para>
  439. Sobald die View zum Antwort Objekt gerendert wurde, setzt diese
  440. <code>noRender</code> um irrtümliches mehrfaches rendern zum selben View Skript
  441. zu verhindern.
  442. </para></note>
  443. <note>
  444. <para>
  445. Standardmäßig handelt
  446. <classname>Zend_Controller_Action::renderScript()</classname> in Vertretung
  447. zur <methodname>renderScript()</methodname> Methode des
  448. <emphasis>ViewRenderer</emphasis>'s.
  449. </para>
  450. </note>
  451. </listitem>
  452. <listitem>
  453. <para>
  454. <methodname>getViewScript($action, $vars)</methodname> erstellt den Pfad zu
  455. einem View Skript das auf einer Aktion basiert die übergeben wird, und/oder
  456. allen Variablen die in <varname>$vars</varname> übergeben werden. Schlüssel für
  457. dieses Array können jede der Pfad Spezifikations Schhüssel enthalten
  458. ('moduleDir', 'module', 'controller', 'action', und 'suffix'). Jede übergebene
  459. Variable wird verwendet; andernfalls werden Werte die auf der aktuellen Anfrage
  460. basieren angewendet.
  461. </para>
  462. <para>
  463. <methodname>getViewScript()</methodname> verwendet entweder
  464. <code>viewScriptPathSpec</code> oder
  465. <code>viewScriptPathNoControllerSpec</code> basierend auf den Einstellungen
  466. des <code>noController</code> Flags.
  467. </para>
  468. <para>
  469. Wortbegrenzer die in Modul-, Kontroller- oder Aktionsnamen vorkommen werden mit
  470. Bindestrichen ('-') ersetzt. Deshalb resultiert, wenn der Kontrollername
  471. 'foo.bar' und die Aktion 'baz:bat' ist, die Verwendung der standard Pfad
  472. Spezifikation einen View Skript Pfad von 'foo-bar/baz-bat.phtml'.
  473. </para>
  474. <note>
  475. <para>
  476. Standardmäßig handelt
  477. <classname>Zend_Controller_Action::getViewScript()</classname> in Vertretung
  478. zur <methodname>getViewScript()</methodname> Methode des
  479. <emphasis>ViewRenderer</emphasis>'s.
  480. </para>
  481. </note>
  482. </listitem>
  483. <listitem>
  484. <para>
  485. <methodname>render($action, $name, $noController)</methodname> prüft zuerst ob
  486. entweder <varname>$name</varname> oder <varname>$noController</varname>
  487. übergeben wurde, und wenn dem so ist, wird das betreffende Flag (respektive
  488. responseSegment und noController) im ViewRenderer gesetzt. Dann übergibt er das
  489. <varname>$action</varname> Argument, wenn vorhanden, an
  490. <methodname>getViewScript()</methodname>. Am Ende wird der berechnete View
  491. Skript Pfad an <methodname>renderScript()</methodname> übergeben.
  492. </para>
  493. <note>
  494. <para>
  495. Achtung vor den Nebeneffekten bei der Verwendung von render(): Die Werte die
  496. für den Anwort Segment Namen und für das noController Flag übergeben werden
  497. sind im Objekt dauerhaft. Zusätzlich wird noRender gesetzt nachdem das
  498. rendern fertig ist.
  499. </para>
  500. </note>
  501. <note>
  502. <para>
  503. Standardmäßig handelt
  504. <classname>Zend_Controller_Action::render()</classname> in Vertretung zur
  505. <methodname>render()</methodname> Methode des
  506. <emphasis>ViewRenderer</emphasis>'s.
  507. </para>
  508. </note>
  509. </listitem>
  510. <listitem>
  511. <para>
  512. <methodname>renderBySpec($action, $vars, $name)</methodname> erlaubt es Pfad
  513. Spezifikations Variablen zu übergeben um den View Skript Pfad zu ermitteln der
  514. erstellt werden soll. Es übergibt <varname>$action</varname> und
  515. <varname>$vars</varname> an <methodname>getScriptPath()</methodname> und
  516. übergibt anschließend den resultierenden Skript Pfad und
  517. <varname>$name</varname> an <methodname>renderScript()</methodname>.
  518. </para>
  519. </listitem>
  520. </itemizedlist>
  521. </sect4>
  522. <sect4 id="zend.controller.actionhelper.viewrenderer.basicusage">
  523. <title>Grundsätzliches Beispiel der Verwendung</title>
  524. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-1">
  525. <title>Grundsätzliche Verwendung</title>
  526. <para>
  527. Am einfachsten, wird einfach der <emphasis>ViewRenderer</emphasis> Helfer mit dem
  528. Helfer Broker in der eigenen Bootstrap Datei, initialisiert und registriert, und
  529. anschließend die Variablen in den Aktion Methoden gesetzt.
  530. </para>
  531. <programlisting language="php"><![CDATA[
  532. // In der Bootstrap Datei:
  533. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  534. ...
  535. // 'foo' Modul, 'bar' Kontroller:
  536. class Foo_BarController extends Zend_Controller_Action
  537. {
  538. // Rendert standardmäßig bar/index.phtml; keine Aktion benötigt
  539. public function indexAction()
  540. {
  541. }
  542. // Rendert bar/populate.phtml wobei die Variable 'foo' auf 'bar'
  543. // gesetzt wird. Da das View Objekt beim preDispatch() definiert,
  544. // ist es bereits vorhanden.
  545. public function populateAction()
  546. {
  547. $this->view->foo = 'bar';
  548. }
  549. // Rendert nichts da zu einer anderen Aktion weitergeleitet wird;
  550. // die neue Aktion wird jegliches rendern durchführen
  551. public function bazAction()
  552. {
  553. $this->_forward('index');
  554. }
  555. // Rendert nichts da zu einer anderen Lokation weitergeleitet wird
  556. public function batAction()
  557. {
  558. $this->_redirect('/index');
  559. }
  560. }
  561. ]]></programlisting>
  562. </example>
  563. <note>
  564. <title>Benamungs Konventionen: Wort Begrenzer in Kontroller- und Aktionnamen</title>
  565. <para>
  566. Wenn der Kontroller- oder Aktionsname aus mehreren Wörtern aufgebaut ist, müssen
  567. diese, da der Dispatcher das benötigt, seperiert sein durch die URL nach
  568. spezifischem Pfad und Wort Begrenzer Zeichen. Der <emphasis>ViewRenderer</emphasis>
  569. ersetzt jeden Pfad Begrenzer den er im Kontrollernamen findet mit einem aktuellen
  570. Pfad Begrenzer ('/'), und jeden Wort Begrenzer der gefunden wird mit einem
  571. Bindestrich ('-') wenn Pfade erstellt werden. Deshalb würde ein Aufruf der Aktion
  572. <filename>/foo.bar/baz.bat</filename> zu
  573. <methodname>FooBarController::bazBatAction()</methodname> in
  574. FooBarControll.php weiterleiten was wiederum
  575. <filename>foo-bar/baz-bat.phtml</filename> darstellen würde; ein Aufruf der Aktion
  576. <filename>/bar_baz/baz-bat</filename> für dazu das
  577. <methodname>Bar_BazController::bazBatAction()</methodname> in
  578. <filename>Bar/BazController.php</filename> dispatched wird (betrachte die
  579. Separation des Pfades) und <filename>bar/baz/baz-bat.phtml</filename> gerendert
  580. wird.
  581. </para>
  582. <para>
  583. Es ist zu beachten das im zweiten Beispiel, das Modul noch immer das Standardmodul
  584. ist, aber das der Kontroller, wegen der Existenz eines Pfad Separators, den Namen
  585. <code>Bar_BazController</code> in <filename>Bar/BazController.php</filename>
  586. empfängt. Der ViewRenderer emuliert die Kontroller Verzeichnis Hierarchie.
  587. </para>
  588. </note>
  589. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-2">
  590. <title>Automatisches rendern ausschalten</title>
  591. <para>
  592. Für einige Aktionen oder Kontroller, kann es gewünscht sein das automatische Rendern
  593. auszuschalten -- zum Beispiel, wenn eine andere Art von Ausgabe (XML, JSON, etc)
  594. ausgegeben werden soll, oder wenn man einfach nichts ausgeben will. Es gibt zwei
  595. Optionen: Alle Fälle von automatischem Rendern ausschalten
  596. (<methodname>setNeverRender()</methodname>), oder dieses einfach für die aktuelle
  597. Aktion ausschalten (<methodname>setNoRender()</methodname>).
  598. </para>
  599. <programlisting language="php"><![CDATA[
  600. // Baz Kontroller Klasse, bar Modul:
  601. class Bar_BazController extends Zend_Controller_Action
  602. {
  603. public function fooAction()
  604. {
  605. // Diese Sektion nicht automatisch Rendern
  606. $this->_helper->viewRenderer->setNoRender();
  607. }
  608. }
  609. // Bat Kontroller Klasse, Bar Modul:
  610. class Bar_BatController extends Zend_Controller_Action
  611. {
  612. public function preDispatch()
  613. {
  614. // Die Aktionen dieses Kontroller nie automatisch Rendern
  615. $this->_helper->viewRenderer->setNoRender();
  616. }
  617. }
  618. ]]></programlisting>
  619. </example>
  620. <note>
  621. <para>
  622. In den meisten Fällen, macht es keinen Sinn das automatische Rendern global
  623. auszuschalten (ala <methodname>setNeverRender()</methodname>), da das einzige das
  624. man dann vom <emphasis>ViewRenderer</emphasis> erhält das automatische Setup des
  625. View Objekts ist.
  626. </para>
  627. </note>
  628. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-3">
  629. <title>Ein anderes View Skript auswählen</title>
  630. <para>
  631. Einige Situationen erfordern das ein anderes Skript, als das nach der Aktion
  632. benannte, ausgeführt wird. Zum Beispiel, wenn man einen Kontroller hat der Aktionen
  633. sowohl hinzufügen als auch bearbeiten kann, und beide mit der selben 'form' View
  634. angezeigt werden, aber mit unterschiedlichen Werten gesetzt werden. Der Skript Name
  635. kann ganz einfach geändert werden. Entweder mit
  636. <methodname>setScriptAction()</methodname>, <methodname>setRender()</methodname>
  637. oder durch Aufruf des Helfers als Methode, was wiederum
  638. <methodname>setRender()</methodname> ausruft.
  639. </para>
  640. <programlisting language="php"><![CDATA[
  641. // Bar Kontroller Klasse, foo Modul:
  642. class Foo_BarController extends Zend_Controller_Action
  643. {
  644. public function addAction()
  645. {
  646. // Rendert 'bar/form.phtml' statt 'bar/add.phtml'
  647. $this->_helper->viewRenderer('form');
  648. }
  649. public function editAction()
  650. {
  651. // Rendert 'bar/form.phtml' statt 'bar/edit.phtml'
  652. $this->_helper->viewRenderer->setScriptAction('form');
  653. }
  654. public function processAction()
  655. {
  656. // einige Prüfungen durchführen...
  657. if (!$valid) {
  658. // Rendert 'bar/form.phtml' statt 'bar/process.phtml'
  659. $this->_helper->viewRenderer->setRender('form');
  660. return;
  661. }
  662. // andernfalls die Bearbeitung weiter durchführen...
  663. }
  664. }
  665. ]]></programlisting>
  666. </example>
  667. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-4">
  668. <title>Die resigstrierte View ändern</title>
  669. <para>
  670. Was wenn ein View Objekt modifiziert werden soll -- zum Beispiel, die Helfer Pfade
  671. ändern, oder die Kodierung? Das kann durch Modifikation des View Objekts, das im
  672. Kontroller gesetzt ist, gemacht werden, oder durch herausnehmen des View Objekts
  673. aus dem <emphasis>ViewRenderer</emphasis>; beide referenzieren auf das gleiche
  674. Objekt.
  675. </para>
  676. <programlisting language="php"><![CDATA[
  677. // Bar Kontroller Klasse, foo Modul:
  678. class Foo_BarController extends Zend_Controller_Action
  679. {
  680. public function preDispatch()
  681. {
  682. // Die Kodierung der View ändern
  683. $this->view->setEncoding('UTF-8');
  684. }
  685. public function bazAction()
  686. {
  687. // Das View Objekt erhalten, und den Kommentar Callback
  688. // auf 'htmlspecialchars' setzen
  689. $view = $this->_helper->viewRenderer->view;
  690. $view->setEscape('htmlspecialchars');
  691. }
  692. }
  693. ]]></programlisting>
  694. </example>
  695. </sect4>
  696. <sect4 id="zend.controller.actionhelper.viewrenderer.advancedusage">
  697. <title>Erweiterte Beispiel der Verwendung</title>
  698. <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-1">
  699. <title>Die Pfad Spezifikationen ändern</title>
  700. <para>
  701. In einigen Fällen, kann man entscheiden das die standardmäßige Pfad Spezifikation
  702. nicht den Notwendigkeiten der Seite entspricht. Zum Beispiel, wenn man einen
  703. einzelnen Template Baum haben will zu dem man dann Zugriff für Entwickler geben kann
  704. (das ist sehr typisch wenn man zum Beispiel <ulink
  705. url="http://smarty.php.net/">Smarty</ulink> verwendet). In solchen Fällen, kann
  706. es gewünscht sein die Spezifkiation des View Basispfades hardkodiert zu erstellen
  707. und eine alternative Spezifikation für die Pfade der Aktions View Skripte selbst zu
  708. erstellen.
  709. </para>
  710. <para>
  711. Für die Zwecke dieses Beispiels, nehmen wir an das der Basispfad zur View
  712. '/opt/vendor/templates' sein soll, und das die View Skripte durch
  713. ':moduleDir/:controller/:action.:suffix' referenziert werden sollen; wenn das
  714. noController Flag gesetzt wurde, soll aus dem Top Level statt aus einem
  715. Unterverzeichnis gerendert werden (':action.:suffix'). Zuletzt soll 'tpl' als View
  716. Skript Suffix für Dateinamen verwendet werden.
  717. </para>
  718. <programlisting language="php"><![CDATA[
  719. /**
  720. * In der Bootstrap Datei:
  721. */
  722. // Unterschiedliche View Implmentation
  723. $view = new ZF_Smarty();
  724. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  725. $viewRenderer->setViewBasePathSpec('/opt/vendor/templates')
  726. ->setViewScriptPathSpec(':module/:controller/:action.:suffix')
  727. ->setViewScriptPathNoControllerSpec(':action.:suffix')
  728. ->setViewSuffix('tpl');
  729. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  730. ]]></programlisting>
  731. </example>
  732. <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-2">
  733. <title>Mehrfache View Skripte von der gleichen Aktion rendern</title>
  734. <para>
  735. Manchmal, ist es notwendig mehrfache View Skripte von einer einzelnen Aktion zu
  736. rendern. Das ist sehr geradlinig -- einfach mehrere Aufrufe zu
  737. <methodname>render()</methodname> machen:
  738. </para>
  739. <programlisting language="php"><![CDATA[
  740. class SearchController extends Zend_Controller_Action
  741. {
  742. public function resultsAction()
  743. {
  744. // Annahme das $this->model das aktuelle Modell ist
  745. $this->view->results =
  746. $this->model->find($this->_getParam('query', '');
  747. // render() handelt standardmäßig in Vertretung zum ViewRenderer
  748. // Rendert zuerst die Such Form und anschließend die Ergebnisse
  749. $this->render('form');
  750. $this->render('results');
  751. }
  752. public function formAction()
  753. {
  754. // tue nichts; der ViewRenderer bearbeitet das View Skript automatisch
  755. }
  756. }
  757. ]]></programlisting>
  758. </example>
  759. </sect4>
  760. </sect3>
  761. <!--
  762. vim:se ts=4 sw=4 et:
  763. -->