2
0

Zend_Controller-ActionHelpers-ViewRenderer.xml 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  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. Level -- z.B. wird es nicht für jede ausgeführte Aktion zurückgesetzt.
  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>
  249. <para>
  250. <methodname>setRender()</methodname> und <methodname>direct()</methodname>
  251. stellen das View Sktript nicht dar, sondern setzen Hinweise die
  252. <methodname>postDispatch()</methodname> und
  253. <methodname>render()</methodname> dann verwenden wenn die View dargestellt
  254. wird.
  255. </para>
  256. </note>
  257. </listitem>
  258. </itemizedlist>
  259. <para>
  260. Der Constructor erlaubt es optional das View Objekt und
  261. <emphasis>ViewRenderer</emphasis> Optionen zu übergeben; er akzeptiert die gleichen
  262. Flags wie <methodname>initView()</methodname>:
  263. </para>
  264. <programlisting language="php"><![CDATA[
  265. $view = new Zend_View(array('encoding' => 'UTF-8'));
  266. $options = array('noController' => true, 'neverRender' => true);
  267. $viewRenderer =
  268. new Zend_Controller_Action_Helper_ViewRenderer($view, $options);
  269. ]]></programlisting>
  270. <para>
  271. Es gibt einige zusätzliche Methoden für das individualisieren von Pfadspezifikationen
  272. die für das Herausfinden des Basis View Pfades verwendet werden der dem View Objekt
  273. hinzugefügt wird, und den View Skript Pfad der verwendet wird wenn das View Skript zu
  274. dem gerendert werden soll automatisch herausgefunden wird. Diese Methoden nehmen alle
  275. ein oder mehrere der folgenden Platzhalter:
  276. </para>
  277. <itemizedlist>
  278. <listitem>
  279. <para>
  280. <emphasis>:moduleDir</emphasis> zeigt auf das aktuelle Modul Basisverzeichnis
  281. (von der Konvention her das Elternverzeicnis des Controller Verzeichnisses des
  282. Moduls).
  283. </para>
  284. </listitem>
  285. <listitem>
  286. <para>
  287. <emphasis>:module</emphasis> zeigt auf den aktuellen Modulnamen.
  288. </para>
  289. </listitem>
  290. <listitem>
  291. <para>
  292. <emphasis>:controller</emphasis> zeigt auf den aktuellen Controllernamen.
  293. </para>
  294. </listitem>
  295. <listitem>
  296. <para>
  297. <emphasis>:action</emphasis> zeigt auf den aktuellen Aktionsnamen.
  298. </para>
  299. </listitem>
  300. <listitem>
  301. <para>
  302. <emphasis>:suffix</emphasis> zeigt auf das aktuelle Suffix des View Skripts
  303. (welcher über <methodname>setViewSuffix()</methodname> gesetzt werden kann).
  304. </para>
  305. </listitem>
  306. </itemizedlist>
  307. <para>
  308. Die Methoden für das kontrollieren der Pfad Spezifikationen sind:
  309. </para>
  310. <itemizedlist>
  311. <listitem>
  312. <para>
  313. <methodname>setViewBasePathSpec($spec)</methodname> erlaubt die Änderung der
  314. Pfad Spezifikation die verwendet wird um den Basispfad herauszufinden zu dem
  315. das View Objekt hinzugefügt werden soll. Die Standardspezifikation ist
  316. <filename>:moduleDir/views</filename>. Die aktuelle Spezifikation kann
  317. jederzeit durch Verwenden von <methodname>getViewBasePathSpec()</methodname>
  318. erhalten werden.
  319. </para>
  320. </listitem>
  321. <listitem>
  322. <para>
  323. <methodname>setViewScriptPathSpec($spec)</methodname> erlaubt die Änderung der
  324. Pfad Spezifikation die verwendet wird um den Pfad zu einem individuellen View
  325. Skript herauszufinden (ohne den Basis View Skript Pfad). Die Standard
  326. Spezifikation ist <filename>:controller/:action.:suffix</filename>. Die
  327. aktuelle Spezifikation kann jederzeit durch Verwenden von
  328. <methodname>getViewScriptPathSpec()</methodname> erhalten werden.
  329. </para>
  330. </listitem>
  331. <listitem>
  332. <para>
  333. <methodname>setViewScriptPathNoControllerSpec($spec)</methodname> erlaubt die
  334. Änderung der Pfad Spezifkiation die verwendet wird um den Pfad zu einem
  335. individuellen View Skript herauszufinden wenn <emphasis>noController</emphasis>
  336. aktiv ist (ohne den Basis View Skript Pfad). Die Standard Spezifikation ist
  337. <filename>:action.:suffix</filename>. Die aktuelle Spezikifation kann jederzeit
  338. durch Verwenden von
  339. <methodname>getViewScriptPathNoControllerSpec()</methodname> erhalten werden.
  340. </para>
  341. </listitem>
  342. </itemizedlist>
  343. <para>
  344. Für eine feinkörnige Kontrolle über Pfadspezifikationen kann
  345. <link linkend="zend.filter.inflector">Zend_Filter_Inflector</link> verwendet werden.
  346. Im Hintergrund verwendet der <emphasis>ViewRenderer</emphasis> einen Inflector um
  347. bereits Abstimmungen am Pfad durchzuführen. Um auf dem Inflector einzuwirken, damit
  348. entweder ein eigener für die Verwendung gesetzt wird, oder um den Standard Inflector zu
  349. verändern, können die folgenden Methoden verwendet werden:
  350. </para>
  351. <itemizedlist>
  352. <listitem>
  353. <para>
  354. <methodname>getInflector()</methodname> empfängt den Inflector. Wenn bis dahin
  355. keiner im <emphasis>ViewRenderer</emphasis> existiert, wird dieser, anhand der
  356. Verwendung der Standard Regeln, erstellt.
  357. </para>
  358. <para>
  359. Standardmäßig verwendet dieser statische Referenzregeln für das Suffix und
  360. Modulverzeichnis, sowie ein statisches Ziel; das erlaubt verschiedenen
  361. <emphasis>ViewRenderer</emphasis> Eigenschaften den Inflector dynamisch zu
  362. ändern.
  363. </para>
  364. </listitem>
  365. <listitem>
  366. <para>
  367. <methodname>setInflector($inflector, $reference)</methodname> erlaubt das
  368. Setzen eines eigenen Inflectors für die Verwendung mit dem
  369. <emphasis>ViewRenderer</emphasis>. Wenn <varname>$reference</varname>
  370. <constant>TRUE</constant> ist, setzt dieser das Suffix und Modulverzeichnis
  371. als statische Referenz zu <emphasis>ViewRenderer</emphasis> Eigenschaften,
  372. genauso wie das Ziel.
  373. </para>
  374. </listitem>
  375. </itemizedlist>
  376. <note>
  377. <title>Standard Konventionen für das Eruieren</title>
  378. <para>
  379. Der <emphasis>ViewRenderer</emphasis> führt einige Pfad Normalisierungen durch um
  380. das Eruieren von View Skripten einfacher zu machen. Die Standardregeln sind wie
  381. folgt:
  382. </para>
  383. <itemizedlist>
  384. <listitem>
  385. <para>
  386. <emphasis>:module</emphasis>: MixedCase und camelCaseWörter werden durch
  387. Bindestriche getrennt, und der komplette String wird auf
  388. Kleinschreibung geändert. z.B.: "FooBarBaz" wird "foo-bar-baz".
  389. </para>
  390. <para>
  391. Intern verwendet der Inflector die Filter
  392. <classname>Zend_Filter_Word_CamelCaseToDash</classname> und
  393. <classname>Zend_Filter_StringToLower</classname>.
  394. </para>
  395. </listitem>
  396. <listitem>
  397. <para>
  398. <emphasis>:controller</emphasis>: MixedCase und camelCaseWörter werden
  399. durch Bindestriche getrennt; Unterstriche werden in
  400. Verzeichnistrennzeichen konvertiert, und der komplette String wird auf
  401. Kleinschreibung geändert. Beispiele: "<classname>FooBar</classname>" wird
  402. "foo-bar"; "<classname>FooBar_Admin</classname>" wird
  403. "<filename>foo-bar/admin</filename>".
  404. </para>
  405. <para>
  406. Intern verwendet der Inflector die Filter
  407. <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
  408. <classname>Zend_Filter_Word_UnderscoreToSeparator</classname> und
  409. <classname>Zend_Filter_StringToLower</classname>.
  410. </para>
  411. </listitem>
  412. <listitem>
  413. <para>
  414. <emphasis>:action</emphasis>: MixedCase und camelCaseWörter werden durch
  415. Bindestriche getrennt; nicht-anphanummerische Zeichen werden zu
  416. Bindestrichen übersetzt, und der komplette String wird auf
  417. Kleinschreibung geändert. Beispiele: "fooBar" wird "foo-bar"; "foo-barBaz"
  418. wird "foo-bar-baz".
  419. </para>
  420. <para>
  421. Intern verwendet der Inflector die Filter
  422. <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
  423. <classname>Zend_Filter_PregReplace</classname> und
  424. <classname>Zend_Filter_StringToLower</classname>.
  425. </para>
  426. </listitem>
  427. </itemizedlist>
  428. </note>
  429. <para>
  430. Die letzten Teile in der <emphasis>ViewRenderer</emphasis> <acronym>API</acronym> sind
  431. die Methoden für das aktuelle herausfinden von View Skript Pfaden und Rendern von
  432. Views. Diese enthalten:
  433. </para>
  434. <itemizedlist>
  435. <listitem>
  436. <para>
  437. <methodname>renderScript($script, $name)</methodname> erlaubt es ein Skript mit
  438. einem selbst spezifizierten Pfad zu rendern, optional zu einem benannten Pfad
  439. Segment. Wenn diese Methode verwendet wird, ermittelt der
  440. <emphasis>ViewRenderer</emphasis> nicht automatisch den Skriptnamen sondern
  441. übergibt das <varname>$script</varname> Argument direkt der
  442. <methodname>render()</methodname> Methode des View Objekts.
  443. </para>
  444. <note>
  445. <para>
  446. Sobald die View zum Antwort Objekt gerendert wurde, setzt diese
  447. <emphasis>noRender</emphasis> um irrtümliches mehrfaches rendern zum selben
  448. View Skript zu verhindern.
  449. </para>
  450. </note>
  451. <note>
  452. <para>
  453. Standardmäßig handelt
  454. <methodname>Zend_Controller_Action::renderScript()</methodname> in
  455. Vertretung zur <methodname>renderScript()</methodname> Methode des
  456. <emphasis>ViewRenderer</emphasis>'s.
  457. </para>
  458. </note>
  459. </listitem>
  460. <listitem>
  461. <para>
  462. <methodname>getViewScript($action, $vars)</methodname> erstellt den Pfad zu
  463. einem View Skript das auf einer Aktion basiert die übergeben wird, und/oder
  464. allen Variablen die in <varname>$vars</varname> übergeben werden. Schlüssel für
  465. dieses Array können jede der Pfad Spezifikations Schhüssel enthalten
  466. ('moduleDir', 'module', 'controller', 'action', und 'suffix'). Jede übergebene
  467. Variable wird verwendet; andernfalls werden Werte die auf der aktuellen Anfrage
  468. basieren angewendet.
  469. </para>
  470. <para>
  471. <methodname>getViewScript()</methodname> verwendet entweder
  472. <emphasis>viewScriptPathSpec</emphasis> oder
  473. <emphasis>viewScriptPathNoControllerSpec</emphasis> basierend auf den
  474. Einstellungen des <emphasis>noController</emphasis> Flags.
  475. </para>
  476. <para>
  477. Wortbegrenzer die in Modul-, Controller- oder Aktionsnamen vorkommen werden mit
  478. Bindestrichen ('-') ersetzt. Deshalb resultiert, wenn der Controllername
  479. '<command>foo.bar</command>' und die Aktion '<command>baz:bat</command>' ist,
  480. die Verwendung der standard Pfad Spezifikation einen View Skript Pfad von
  481. '<filename>foo-bar/baz-bat.phtml</filename>'.
  482. </para>
  483. <note>
  484. <para>
  485. Standardmäßig handelt
  486. <methodname>Zend_Controller_Action::getViewScript()</methodname> in
  487. Vertretung zur <methodname>getViewScript()</methodname> Methode des
  488. <emphasis>ViewRenderer</emphasis>'s.
  489. </para>
  490. </note>
  491. </listitem>
  492. <listitem>
  493. <para>
  494. <methodname>render($action, $name, $noController)</methodname> prüft zuerst ob
  495. entweder <varname>$name</varname> oder <varname>$noController</varname>
  496. übergeben wurde, und wenn dem so ist, wird das betreffende Flag (respektive
  497. responseSegment und noController) im ViewRenderer gesetzt. Dann übergibt er das
  498. <varname>$action</varname> Argument, wenn vorhanden, an
  499. <methodname>getViewScript()</methodname>. Am Ende wird der berechnete View
  500. Skript Pfad an <methodname>renderScript()</methodname> übergeben.
  501. </para>
  502. <note>
  503. <para>
  504. Achtung vor den Nebeneffekten bei der Verwendung von
  505. <methodname>render()</methodname>: Die Werte die für den Anwort Segment
  506. Namen und für das noController Flag übergeben werden sind im Objekt
  507. dauerhaft. Zusätzlich wird noRender gesetzt nachdem das rendern fertig ist.
  508. </para>
  509. </note>
  510. <note>
  511. <para>
  512. Standardmäßig handelt
  513. <methodname>Zend_Controller_Action::render()</methodname> in Vertretung zur
  514. <methodname>render()</methodname> Methode des
  515. <emphasis>ViewRenderer</emphasis>'s.
  516. </para>
  517. </note>
  518. </listitem>
  519. <listitem>
  520. <para>
  521. <methodname>renderBySpec($action, $vars, $name)</methodname> erlaubt es Pfad
  522. Spezifikations Variablen zu übergeben um den View Skript Pfad zu ermitteln der
  523. erstellt werden soll. Es übergibt <varname>$action</varname> und
  524. <varname>$vars</varname> an <methodname>getScriptPath()</methodname> und
  525. übergibt anschließend den resultierenden Skript Pfad und
  526. <varname>$name</varname> an <methodname>renderScript()</methodname>.
  527. </para>
  528. </listitem>
  529. </itemizedlist>
  530. </sect4>
  531. <sect4 id="zend.controller.actionhelper.viewrenderer.basicusage">
  532. <title>Grundsätzliches Beispiel der Verwendung</title>
  533. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-1">
  534. <title>Grundsätzliche Verwendung</title>
  535. <para>
  536. Am einfachsten, wird einfach der <emphasis>ViewRenderer</emphasis> Helfer mit dem
  537. Helfer Broker in der eigenen Bootstrap Datei, initialisiert und registriert, und
  538. anschließend die Variablen in den Aktion Methoden gesetzt.
  539. </para>
  540. <programlisting language="php"><![CDATA[
  541. // In der Bootstrap Datei:
  542. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  543. ...
  544. // 'foo' Modul, 'bar' Controller:
  545. class Foo_BarController extends Zend_Controller_Action
  546. {
  547. // Rendert standardmäßig bar/index.phtml; keine Aktion benötigt
  548. public function indexAction()
  549. {
  550. }
  551. // Rendert bar/populate.phtml wobei die Variable 'foo' auf 'bar'
  552. // gesetzt wird. Da das View Objekt beim preDispatch() definiert,
  553. // ist es bereits vorhanden.
  554. public function populateAction()
  555. {
  556. $this->view->foo = 'bar';
  557. }
  558. // Rendert nichts da zu einer anderen Aktion weitergeleitet wird;
  559. // die neue Aktion wird jegliches rendern durchführen
  560. public function bazAction()
  561. {
  562. $this->_forward('index');
  563. }
  564. // Rendert nichts da zu einer anderen Lokation weitergeleitet wird
  565. public function batAction()
  566. {
  567. $this->_redirect('/index');
  568. }
  569. }
  570. ]]></programlisting>
  571. </example>
  572. <note>
  573. <title>Benamungs Konventionen: Wort Begrenzer in Controller- und Aktionnamen</title>
  574. <para>
  575. Wenn der Controller- oder Aktionsname aus mehreren Wörtern aufgebaut ist, müssen
  576. diese, da der Dispatcher das benötigt, seperiert sein durch die
  577. <acronym>URL</acronym> nach spezifischem Pfad und Wort Begrenzer Zeichen. Der
  578. <emphasis>ViewRenderer</emphasis> ersetzt jeden Pfad Begrenzer den er im
  579. Controllernamen findet mit einem aktuellen Pfad Begrenzer ('/'), und jeden Wort
  580. Begrenzer der gefunden wird mit einem Bindestrich ('-') wenn Pfade erstellt werden.
  581. Deshalb würde ein Aufruf der Aktion <filename>/foo.bar/baz.bat</filename> zu
  582. <methodname>FooBarController::bazBatAction()</methodname> in
  583. <filename>FooBarControll.php</filename> weiterleiten was wiederum
  584. <filename>foo-bar/baz-bat.phtml</filename> darstellen würde; ein Aufruf der Aktion
  585. <filename>/bar_baz/baz-bat</filename> für dazu das
  586. <methodname>Bar_BazController::bazBatAction()</methodname> in
  587. <filename>Bar/BazController.php</filename> dispatched wird (betrachte die
  588. Separation des Pfades) und <filename>bar/baz/baz-bat.phtml</filename> gerendert
  589. wird.
  590. </para>
  591. <para>
  592. Es ist zu beachten das im zweiten Beispiel, das Modul noch immer das Standardmodul
  593. ist, aber das der Controller, wegen der Existenz eines Pfad Separators, den Namen
  594. <classname>Bar_BazController</classname> in
  595. <filename>Bar/BazController.php</filename> empfängt. Der ViewRenderer emuliert die
  596. Controller Verzeichnis Hierarchie.
  597. </para>
  598. </note>
  599. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-2">
  600. <title>Automatisches rendern ausschalten</title>
  601. <para>
  602. Für einige Aktionen oder Controller, kann es gewünscht sein das automatische Rendern
  603. auszuschalten -- zum Beispiel, wenn eine andere Art von Ausgabe
  604. (<acronym>XML</acronym>, <acronym>JSON</acronym>, etc)
  605. ausgegeben werden soll, oder wenn man einfach nichts ausgeben will. Es gibt zwei
  606. Optionen: Alle Fälle von automatischem Rendern ausschalten
  607. (<methodname>setNeverRender()</methodname>), oder dieses einfach für die aktuelle
  608. Aktion ausschalten (<methodname>setNoRender()</methodname>).
  609. </para>
  610. <programlisting language="php"><![CDATA[
  611. // Baz Controller Klasse, bar Modul:
  612. class Bar_BazController extends Zend_Controller_Action
  613. {
  614. public function fooAction()
  615. {
  616. // Diese Sektion nicht automatisch Rendern
  617. $this->_helper->viewRenderer->setNoRender();
  618. }
  619. }
  620. // Bat Controller Klasse, Bar Modul:
  621. class Bar_BatController extends Zend_Controller_Action
  622. {
  623. public function preDispatch()
  624. {
  625. // Die Aktionen dieses Controller nie automatisch Rendern
  626. $this->_helper->viewRenderer->setNoRender();
  627. }
  628. }
  629. ]]></programlisting>
  630. </example>
  631. <note>
  632. <para>
  633. In den meisten Fällen, macht es keinen Sinn das automatische Rendern global
  634. auszuschalten (ala <methodname>setNeverRender()</methodname>), da das einzige das
  635. man dann vom <emphasis>ViewRenderer</emphasis> erhält das automatische Setup des
  636. View Objekts ist.
  637. </para>
  638. </note>
  639. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-3">
  640. <title>Ein anderes View Skript auswählen</title>
  641. <para>
  642. Einige Situationen erfordern das ein anderes Skript, als das nach der Aktion
  643. benannte, ausgeführt wird. Zum Beispiel, wenn man einen Controller hat der Aktionen
  644. sowohl hinzufügen als auch bearbeiten kann, und beide mit der selben 'form' View
  645. angezeigt werden, aber mit unterschiedlichen Werten gesetzt werden. Der Skript Name
  646. kann ganz einfach geändert werden. Entweder mit
  647. <methodname>setScriptAction()</methodname>, <methodname>setRender()</methodname>
  648. oder durch Aufruf des Helfers als Methode, was wiederum
  649. <methodname>setRender()</methodname> ausruft.
  650. </para>
  651. <programlisting language="php"><![CDATA[
  652. // Bar Controller Klasse, foo Modul:
  653. class Foo_BarController extends Zend_Controller_Action
  654. {
  655. public function addAction()
  656. {
  657. // Rendert 'bar/form.phtml' statt 'bar/add.phtml'
  658. $this->_helper->viewRenderer('form');
  659. }
  660. public function editAction()
  661. {
  662. // Rendert 'bar/form.phtml' statt 'bar/edit.phtml'
  663. $this->_helper->viewRenderer->setScriptAction('form');
  664. }
  665. public function processAction()
  666. {
  667. // einige Prüfungen durchführen...
  668. if (!$valid) {
  669. // Rendert 'bar/form.phtml' statt 'bar/process.phtml'
  670. $this->_helper->viewRenderer->setRender('form');
  671. return;
  672. }
  673. // andernfalls die Bearbeitung weiter durchführen...
  674. }
  675. }
  676. ]]></programlisting>
  677. </example>
  678. <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-4">
  679. <title>Die resigstrierte View ändern</title>
  680. <para>
  681. Was wenn ein View Objekt modifiziert werden soll -- zum Beispiel, die Helfer Pfade
  682. ändern, oder die Kodierung? Das kann durch Modifikation des View Objekts, das im
  683. Controller gesetzt ist, gemacht werden, oder durch herausnehmen des View Objekts
  684. aus dem <emphasis>ViewRenderer</emphasis>; beide referenzieren auf das gleiche
  685. Objekt.
  686. </para>
  687. <programlisting language="php"><![CDATA[
  688. // Bar Controller Klasse, foo Modul:
  689. class Foo_BarController extends Zend_Controller_Action
  690. {
  691. public function preDispatch()
  692. {
  693. // Die Kodierung der View ändern
  694. $this->view->setEncoding('UTF-8');
  695. }
  696. public function bazAction()
  697. {
  698. // Das View Objekt erhalten, und den Kommentar Callback
  699. // auf 'htmlspecialchars' setzen
  700. $view = $this->_helper->viewRenderer->view;
  701. $view->setEscape('htmlspecialchars');
  702. }
  703. }
  704. ]]></programlisting>
  705. </example>
  706. </sect4>
  707. <sect4 id="zend.controller.actionhelper.viewrenderer.advancedusage">
  708. <title>Erweiterte Beispiel der Verwendung</title>
  709. <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-1">
  710. <title>Die Pfad Spezifikationen ändern</title>
  711. <para>
  712. In einigen Fällen, kann man entscheiden das die standardmäßige Pfad Spezifikation
  713. nicht den Notwendigkeiten der Seite entspricht. Zum Beispiel, wenn man einen
  714. einzelnen Template Baum haben will zu dem man dann Zugriff für Entwickler geben kann
  715. (das ist sehr typisch wenn man zum Beispiel <ulink
  716. url="http://smarty.php.net/">Smarty</ulink> verwendet). In solchen Fällen, kann
  717. es gewünscht sein die Spezifkiation des View Basispfades hardkodiert zu erstellen
  718. und eine alternative Spezifikation für die Pfade der Aktions View Skripte selbst zu
  719. erstellen.
  720. </para>
  721. <para>
  722. Für die Zwecke dieses Beispiels, nehmen wir an das der Basispfad zur View
  723. '<filename>/opt/vendor/templates</filename>' sein soll, und das die View Skripte
  724. durch '<filename>:moduleDir/:controller/:action.:suffix</filename>' referenziert
  725. werden sollen; wenn das <emphasis>noController</emphasis> Flag gesetzt wurde, soll
  726. aus dem Top Level statt aus einem Unterverzeichnis gerendert werden
  727. ('<filename>:action.:suffix</filename>'). Zuletzt soll 'tpl' als View Skript Suffix
  728. für Dateinamen verwendet werden.
  729. </para>
  730. <programlisting language="php"><![CDATA[
  731. /**
  732. * In der Bootstrap Datei:
  733. */
  734. // Unterschiedliche View Implmentation
  735. $view = new ZF_Smarty();
  736. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  737. $viewRenderer->setViewBasePathSpec('/opt/vendor/templates')
  738. ->setViewScriptPathSpec(':module/:controller/:action.:suffix')
  739. ->setViewScriptPathNoControllerSpec(':action.:suffix')
  740. ->setViewSuffix('tpl');
  741. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  742. ]]></programlisting>
  743. </example>
  744. <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-2">
  745. <title>Mehrfache View Skripte von der gleichen Aktion rendern</title>
  746. <para>
  747. Manchmal, ist es notwendig mehrfache View Skripte von einer einzelnen Aktion zu
  748. rendern. Das ist sehr geradlinig -- einfach mehrere Aufrufe zu
  749. <methodname>render()</methodname> machen:
  750. </para>
  751. <programlisting language="php"><![CDATA[
  752. class SearchController extends Zend_Controller_Action
  753. {
  754. public function resultsAction()
  755. {
  756. // Annahme das $this->model das aktuelle Modell ist
  757. $this->view->results =
  758. $this->model->find($this->_getParam('query', '');
  759. // render() handelt standardmäßig in Vertretung zum ViewRenderer
  760. // Rendert zuerst die Such Form und anschließend die Ergebnisse
  761. $this->render('form');
  762. $this->render('results');
  763. }
  764. public function formAction()
  765. {
  766. // tue nichts; der ViewRenderer bearbeitet das View Skript automatisch
  767. }
  768. }
  769. ]]></programlisting>
  770. </example>
  771. </sect4>
  772. </sect3>