Zend_Controller-ActionHelpers-ViewRenderer.xml 37 KB

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