Zend_Controller-ActionHelpers-ViewRenderer.xml 36 KB

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