Zend_Controller-ActionHelpers-ViewRenderer.xml 39 KB

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