Zend_Controller-ActionHelpers-ViewRenderer.xml 36 KB

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