2
0

Zend_Controller-ActionHelpers.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15719 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.actionhelpers" xmlns:xi="http://www.w3.org/2001/XInclude">
  5. <title>Action Helfer</title>
  6. <sect2 id="zend.controller.actionhelper.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. Aktion Helfer erlauben Entwicklern Runtime und/oder On-Demand Funktionalität in jeden
  10. Aktion Kontroller zu inizieren der <classname>Zend_Controller_Action</classname>
  11. erweitert. Aktion Kontroller versuchen den Notwendigkeit zu minimieren, den abstrakten
  12. Aktion Kontroller zu erweitern um damit normale Aktion Kontroller Funktionen inizieren.
  13. </para>
  14. <para>
  15. Es gibt eine Menge an Wegen um Aktion Helfer zu verwenden. Aktion Helfer verwenden ein
  16. Broker System, ähnlich den Typen von Brokern in <link
  17. linkend="zend.view.helpers">Zend_View_Helper</link>, und denen von <link
  18. linkend="zend.controller.plugins">Zend_Controller_Plugin</link>. Aktion Helfer
  19. <classname>Zend_View_Helper</classname>) können bei Bedarf geladen und aufgerufen
  20. werden, oder Sie können wärend der Anfragezeit (Bootstrap) instanziert werden oder wären
  21. der Erstellungszeit des Aktion Kontrollers (init()). Um Sie näher zu verstehen,
  22. betrachten wir Ihre Verwendung in der folgenden Sektion.
  23. </para>
  24. </sect2>
  25. <sect2 id="zend.controller.actionhelper.initialization">
  26. <title>Helfer Initialisierung</title>
  27. <para>
  28. Ein Helfer kann auf vielen verschiedenen Wegen initialisiert werden, basierend auf den
  29. eigenen Bedürfnissen und den Funktionalitäten dieses Helfers.
  30. </para>
  31. <para>
  32. Ein Helfer Broker wir das der <varname>$_helper</varname> Teilnehmer von
  33. <classname>Zend_Controller_Action</classname> gespeichert; der Broker kann verwendet
  34. werden um Helfer zu empfangen oder aufzurufen. Einige Methoden das zu tun sind:
  35. </para>
  36. <itemizedlist>
  37. <listitem>
  38. <para>
  39. Explizit <code>getHelper()</code> verwenden. Ihm einfach einen Namen übergeben
  40. und ein Helfer Objekt wird zurückgegeben:
  41. </para>
  42. <programlisting language="php"><![CDATA[
  43. $flashMessenger = $this->_helper->getHelper('FlashMessenger');
  44. $flashMessenger->addMessage('Wir haben in der letzten Anfrage etwas getan');
  45. ]]></programlisting>
  46. </listitem>
  47. <listitem>
  48. <para>
  49. Verwenden der <code>__get()</code> Funktionalität des Helfer Brokers und
  50. Empfangen des Helfers wie wenn er eine Teilnehmer Eigenschaft des Brokers wäre:
  51. </para>
  52. <programlisting language="php"><![CDATA[
  53. $flashMessenger = $this->_helper->FlashMessenger;
  54. $flashMessenger->addMessage('Wir haben in der letzten Anfrage etwas getan');
  55. ]]></programlisting>
  56. </listitem>
  57. <listitem>
  58. <para>
  59. Letztendlich implmentieren die meisten Aktion Helfer die <code>direct()</code>
  60. Methode welche eine spezielle, Standardmethode im Helfer aufruft. In Beispiel
  61. des <code>FlashMessenger</code>s, wird <code>addMessage()</code> aufgerufen:
  62. </para>
  63. <programlisting language="php"><![CDATA[
  64. $this->_helper->FlashMessenger('Wir haben in der letzten Anfrage etwas getan');
  65. ]]></programlisting>
  66. </listitem>
  67. </itemizedlist>
  68. <note>
  69. <para>Alle oben angeführten Beispiel sind funktionell gleichwertig.</para>
  70. </note>
  71. <para>
  72. Man kann Helfer auch explizit instanzieren. Das kann gewollt sein wenn der Helfer
  73. ausserhalb eines Aktion Kontrollers verwendet werden soll, oder wenn ein Helfer an einen
  74. Helfer Broker übergeben wird um Ihn durch irgendeine Aktion zu verwenden. Instanziert
  75. wird er wie jede andere PHP Klasse.
  76. </para>
  77. </sect2>
  78. <sect2 id="zend.controller.actionhelper.broker">
  79. <title>Der Helfer Broker</title>
  80. <para>
  81. <classname>Zend_Controller_Action_HelperBroker</classname> behandelt die Details der
  82. Registrierung von Helfer Objekten und Helfer Pfaden, sowie dem Empfangen von Helfern bei
  83. Befarf.
  84. </para>
  85. <para>
  86. Um einen Helfer im Browser zu registrieren, kann <code>addHelper</code> verwendet
  87. werden:
  88. </para>
  89. <programlisting language="php"><![CDATA[
  90. Zend_Controller_Action_HelperBroker::addHelper($helper);
  91. ]]></programlisting>
  92. <para>
  93. Natürlich ist das Instanzieren und übergeben von Helfern an den Broker etwas Zeit- und
  94. Ressourcen intensiv, weswegen twei Methoden existieren um die Dinge etwas zu
  95. automatisieren: <code>addPrefix()</code> und <code>addPath()</code>.
  96. </para>
  97. <itemizedlist>
  98. <listitem>
  99. <para>
  100. <code>addPrefix()</code> nimmt einen Klassenprefix und verwendet Ihn um einen
  101. Pfad zu ermitteln wo Helferklassen definiert wurden. Er nimmt an das der Prefix
  102. den Konventionen der Benamung von Klassen im Zend Framework folgt.
  103. </para>
  104. <programlisting language="php"><![CDATA[
  105. // Helfer mit vorangestelltem My_Action_Helpers in My/Action/Helpers/ hinzufügen
  106. Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');
  107. ]]></programlisting>
  108. </listitem>
  109. <listitem>
  110. <para>
  111. <code>addPath()</code> nimmt ein Verzeichnis als erstes Argument und einen
  112. Klassenprefix als zweites Argument (Standardwert ist
  113. 'Zend_Controller_Action_Helper'). Das erlaubt es die eigenen Klassenprefixes mit
  114. speziellen Verzeichnissen zu verbinden.
  115. </para>
  116. <programlisting language="php"><![CDATA[
  117. // Helfer mit vorangestelltem Helper in Plugins/Helpers/ hinzufügen
  118. Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers',
  119. 'Helper');
  120. ]]></programlisting>
  121. </listitem>
  122. </itemizedlist>
  123. <para>
  124. Da diese Methoden statisch sind, können Sie zu jeder Zeit in der Kontrollerkette
  125. aufgerufen werden um Helfer dynamisch hinzuzufügen wenn es notwendig wird.
  126. </para>
  127. <para>
  128. Intern verwendet der Helfer Broker <link linkend="zend.loader.pluginloader">eine Instanz
  129. des PluginLoader's</link> um die Pfade zu verwalten. Man erhlt den PluginLoader indem
  130. die statische Methode <code>getPluginLoader()</code> verwendet, oder alternativ, eine
  131. eigene PluginLoader Instanz einfügt durch Verwenden von <code>setPluginLoader()</code>.
  132. </para>
  133. <para>
  134. Um zu ermitteln ob ein Helfer im Helfer Broker existiert, kann
  135. <code>hasHelper($name)</code> verwendet werden, wobei <varname>$name</varname> der
  136. Kurzname des Helfers ist (ohne das Prefix):
  137. </para>
  138. <programlisting language="php"><![CDATA[
  139. // Prüft ob der 'redirector' Helfer im Broker registriert ist:
  140. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  141. echo 'Der Redirector Helfer ist registriert';
  142. }
  143. ]]></programlisting>
  144. <para>
  145. Es gibt auch zwei statische Methoden für das bekommen von Helfern vom Helferbroker:
  146. <code>getExistingHelper()</code> und <code>getStaticHelper()</code>.
  147. <code>getExistingHelper()</code> empfängt einen Helfer nur dann wenn er davor durch den
  148. Helferbroker ausgerufen wirde oder explizit in Ihm registriert wurde; wenn nicht wird
  149. eine Ausnahme geworfen. <code>getStaticHelper()</code> macht das selbe wie
  150. <code>getExistingHelper()</code>, wird aber versuchen den Helfer zu initiieren wenn
  151. dieser davor noch nicht im Helferstack registriert wurde. <code>getStaticHelper()</code>
  152. ist eine gute Wahl für das empfangen von Helfern welche man konfigurieren will.
  153. </para>
  154. <para>
  155. Beide Methoden nehmen ein einzelnes Argument, <varname>$name</varname>, welches der
  156. Kurzname des Helfers (ohne den Präfix) ist.
  157. </para>
  158. <programlisting language="php"><![CDATA[
  159. // Prüfe ob der 'redirector' Helfer im Broker registriert ist und holt Ihn:
  160. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  161. $redirector =
  162. Zend_Controller_Action_HelperBroker::getExistingHelper('redirector');
  163. }
  164. // Oder, Ihn einfach empfangen, ohne darüber nachzudenken ob er bereits
  165. // registriert wurde oder nicht:
  166. $redirector =
  167. Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
  168. }
  169. ]]></programlisting>
  170. <para>
  171. Schlußendlich, um einen registrierten Helfer vom Broker zu entfernen, kann
  172. <code>removeHelper($name)</code> verwendet werden, wobei <varname>$name</varname> der
  173. Kurzname des Helfers ist (ohne den Prefix):
  174. </para>
  175. <programlisting language="php"><![CDATA[
  176. // Wenn vorhanden, entferne den 'redirector' Helfer vom Broker:
  177. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  178. Zend_Controller_Action_HelperBroker::removeHelper('redirector')
  179. }
  180. ]]></programlisting>
  181. </sect2>
  182. <sect2 id="zend.controller.actionhelper.stockhelpers">
  183. <title>Eingebaute Aktions Helfer</title>
  184. <para>
  185. Zend Framework enthält standardmäßig verschiedene Action Helfer:
  186. <code>AutoComplete</code> für automatisierte Antworten für AJAX Autovervollständigung;
  187. <code>ContextSwitch</code> und <code>AjaxContext</code> für alternative Antwort Formate
  188. eigener Aktionen; einen <code>FlashMessenger</code> für die Behandlung von
  189. Kurznachrichten; <code>Json</code> für das verschlüsseln und senden von JSON Antworten;
  190. einen <code>Redirector</code>, um verschiedene Implementationen, für das Umleiten zu
  191. internen und externen Seiten, für die Anwendung bereitzustellen und einen
  192. <code>ViewRenderer</code> um den Prozess des Setzens eines View Objekts im Kontroller
  193. und dem Rendern von Views zu automatisieren.
  194. </para>
  195. <xi:include href="Zend_Controller-ActionHelpers-ActionStack.xml" />
  196. <xi:include href="Zend_Controller-ActionHelpers-AutoComplete.xml" />
  197. <xi:include href="Zend_Controller-ActionHelpers-ContextSwitch.xml" />
  198. <xi:include href="Zend_Controller-ActionHelpers-FlashMessenger.xml" />
  199. <xi:include href="Zend_Controller-ActionHelpers-Json.xml" />
  200. <xi:include href="Zend_Controller-ActionHelpers-Redirector.xml" />
  201. <xi:include href="Zend_Controller-ActionHelpers-ViewRenderer.xml" />
  202. </sect2>
  203. <sect2 id="zend.controller.actionhelper.writingyourown">
  204. <title>Schreiben eigener Helfer</title>
  205. <para>
  206. Aktions Helfer erweitern <classname>Zend_Controller_Action_Helper_Abstract</classname>,
  207. eine abstrakte Klasse die das Basisinterface bietet und vom Helfer Broker funktionell
  208. benötigt wird. Diese inkludiert die folgenden Methoden:
  209. </para>
  210. <itemizedlist>
  211. <listitem>
  212. <para>
  213. <code>setActionController()</code> wird verwendet um den aktuellen Aktion
  214. Kontroller zu setzen.
  215. </para>
  216. </listitem>
  217. <listitem>
  218. <para>
  219. <code>init()</code>, wird vom Helfer Broker wärend der Instanzierung ausgeführt
  220. und kann verwendet werden um den Status zu resetieren wenn mehrere Kontroller
  221. den gleichen Helfer in einer verketteten Aktion verwenden.
  222. </para>
  223. </listitem>
  224. <listitem>
  225. <para>
  226. <code>preDispatch()</code>, wird vor der ausführenden Aktion gestartet.
  227. </para>
  228. </listitem>
  229. <listitem>
  230. <para>
  231. <code>postDispatch()</code> wird ausgeführt nachdem eine Aktion fertig ist --
  232. selbst wenn ein <code>preDispatch()</code> Plugin die Aktion abgebrochen hat.
  233. Normalerweise nützlich für das Saubermachen.
  234. </para>
  235. </listitem>
  236. <listitem>
  237. <para>
  238. <code>getRequest()</code> empfängt das aktuelle Anfrage Objekt.
  239. </para>
  240. </listitem>
  241. <listitem>
  242. <para>
  243. <code>getResponse()</code> empfängt das aktuelle Antwort Objekt.
  244. </para>
  245. </listitem>
  246. <listitem>
  247. <para>
  248. <code>getName()</code> empfängt den Helfernamen. Sie empfängt die Portion des
  249. Klassennamens der dem letzten Unterstrich-Zeichen folgt, oder andererseits den
  250. kompletten Klassennamen. Als Beispiel, wenn die Klasse
  251. <classname>Zend_Controller_Action_Helper_Redirector</classname> heißt, wird
  252. <code>Redirector</code> zurückgegeben; eine Klasse die <code>FooMessage</code>
  253. heißt wird einfach sich selbst zurückgeben.
  254. </para>
  255. </listitem>
  256. </itemizedlist>
  257. <para>
  258. Optional kann eine <code>direct()</code> Methode in der eigenen Helfer Klasse inkludiert
  259. werden. Wenn Sie definiert ist, erlaubt Sie den Helfer als eine Methode des Helfer
  260. Brokers zu verwenden, um eine einfache rein-raus Verwendung des Helfers zu ermöglichen.
  261. Als Beispiel definiert der <link
  262. linkend="zend.controller.actionhelpers.redirector">Umleiter</link>
  263. <code>direct()</code> als einen Alias von <code>goto()</code> und erlaubt damit die
  264. Verwendung des Helfers wie folgt:
  265. </para>
  266. <programlisting language="php"><![CDATA[
  267. // Umleiten zu /blog/view/item/id/42
  268. $this->_helper->redirector('item', 'view', 'blog', array('id' => 42));
  269. ]]></programlisting>
  270. <para>
  271. Intern schaut die <code>__call()</code> Methode des Helfer Brokers nach einem Helfer der
  272. <code>redirector</code> heißt, prüft anschließend ob der Helfer eine definierte
  273. <code>direct</code> Klasse besitzt und ruft diese mit den angegebenen Argumenten auf.
  274. </para>
  275. <para>
  276. Wenn eine eigene Helfer Klasse erstellt wurde, kann man zu Ihr wie im obigen Kapitel
  277. beschrieben, Zugang erhalten.
  278. </para>
  279. </sect2>
  280. </sect1>
  281. <!--
  282. vim:se ts=4 sw=4 et:
  283. -->