Zend_Controller-ActionHelpers-ContextSwitch.xml 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15742 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.controller.actionhelpers.contextswitch">
  5. <title>ContextSwitch und AjaxContext</title>
  6. <para>
  7. Der <code>ContextSwitch</code> Action Helfer ist vorgesehen für die Erleicherung bei der
  8. Rückgabe von unserschiedlichen Antwortformaten oder Anfragen. Der <code>AjaxContext</code>
  9. Helfer ist eine spezialisierte Version von <code>ContextSwitch</code> die die
  10. Rückgabe von Antworten zu XmlHttpRequests erleichtert.
  11. </para>
  12. <para>
  13. Um einen von Ihnen zu aktivieren, muß der Kontroller darauf hingewiesen werden welche
  14. Aktion zu welchem Kontext antworten kann. Wenn eine hereinkommende Anfrage einen gültigen
  15. Kontext für eine gegebene Aktion indiziert, dann wird der Helfer:
  16. </para>
  17. <itemizedlist>
  18. <listitem><para>
  19. das Layout ausschalten wenn es eingeschaltet ist.
  20. </para></listitem>
  21. <listitem><para>
  22. einen alternativen View suffix setzen, was effektiv ein separates View Skript für
  23. den Kontext benötigt.
  24. </para></listitem>
  25. <listitem><para>
  26. die richtigen Antwort Header für den gewünschten Kontext senden.
  27. </para></listitem>
  28. <listitem><para>
  29. optional den spezifizierten Callback aufrufen um den Kontext zu definieren und/oder
  30. anschließende Berechnungen durchführen.
  31. </para></listitem>
  32. </itemizedlist>
  33. <para>
  34. Als Beispiel wird der folgende Kontroller angenommen:
  35. </para>
  36. <programlisting language="php"><![CDATA[
  37. class NewsController extends Zend_Controller_Action
  38. {
  39. /**
  40. * Landeseite; leitet zu listAction() weiter
  41. */
  42. public function indexAction()
  43. {
  44. $this->_forward('list');
  45. }
  46. /**
  47. * News Items auflisten
  48. */
  49. public function listAction()
  50. {
  51. }
  52. /**
  53. * Ein News Item anzeigen
  54. */
  55. public function viewAction()
  56. {
  57. }
  58. }
  59. ]]></programlisting>
  60. <para>
  61. Angenommen wir wollen das <code>listAction()</code> auch im XML Format vorhanden ist. Statt
  62. der Erstellung einer anderen Aktion, kann angezeigt werden das eine XML Antwort
  63. zurückgegeben wird:
  64. </para>
  65. <programlisting language="php"><![CDATA[
  66. class NewsController extends Zend_Controller_Action
  67. {
  68. public function init()
  69. {
  70. $contextSwitch = $this->_helper->getHelper('contextSwitch');
  71. $contextSwitch->addActionContext('list', 'xml')
  72. ->initContext();
  73. }
  74. // ...
  75. }
  76. ]]></programlisting>
  77. <para>
  78. Was macht das:
  79. </para>
  80. <itemizedlist>
  81. <listitem><para>
  82. Setzt den 'Content-Type' Antwort Header auf 'text/xml'.
  83. </para></listitem>
  84. <listitem><para>
  85. Ändert den View Suffix auf 'xml.phtml' (oder, wenn ein alternativer View Suffix
  86. verwendet wird, 'xml.[dein Suffix]').
  87. </para></listitem>
  88. </itemizedlist>
  89. <para>
  90. Jetzt muß ein neues View Skript erstellt werden, 'news/list.xml.phtml', welches das XML
  91. erzeugt und darstellt.
  92. </para>
  93. <para>
  94. Um zu ermitteln ob eine Anfrage eine Kontextänderung initiiert, prüft der Helfer auf ein
  95. token im Anfrage Objekt. Standardäßig schaut er auf den 'format' Parameter, durch den das
  96. konfiguriert werden kann. Das bedeutet das, in den meisten Fällen, um eine Kontextänderung
  97. zu triggern, ein 'format' Parameter in der Anfrage hinzugefügt werden kann:
  98. </para>
  99. <itemizedlist>
  100. <listitem><para>
  101. über URL Parameter: <code>/news/list/format/xml</code> (beachte, das Standard
  102. Routing Schema erlaubt übliche Schlüssel/Werte Paare nach der Aktion)
  103. </para></listitem>
  104. <listitem><para>
  105. über Abfrage String: z.B., <code>/news/list?format=xml</code>
  106. </para></listitem>
  107. </itemizedlist>
  108. <para>
  109. <code>ContextSwitch</code> erlaubt es beliebige Kontexte zu spezifizieren, inklusive
  110. welche Kontextänderung stattfinden wird (wenn überhaupt), jegliche Antwort Header die
  111. gesendet werden sollen, und beliebige Callbacks für Initialisierung und folgende
  112. Bearbeitung.
  113. </para>
  114. <sect4 id="zend.controller.actionhelpers.contextswitch.contexts">
  115. <title>Vorhandene Standard Kontexte</title>
  116. <para>
  117. Standardmäßig sind zwei Kontexte im <code>ContextSwitch</code> Helfer vorhanden: json
  118. und xml.
  119. </para>
  120. <itemizedlist>
  121. <listitem>
  122. <para>
  123. <emphasis>JSON</emphasis>. Der JSON Kontext setzt den 'Content-Type' Antwort
  124. Header auf 'application/json' und den View Skript Suffix auf 'json.phtml'.
  125. </para>
  126. <para>
  127. Trotzdem wird standardmäßig kein View Skript benötigt. Es serialisiert einfach
  128. alle View Variablen und sendet die JSON Antwort sofort aus.
  129. </para>
  130. <para>
  131. Dieses Verhalten kann deaktiviert werden indem die auto-JSON Serialisierung
  132. abgeschaltet wird:
  133. </para>
  134. <programlisting language="php"><![CDATA[
  135. $this->_helper->contextSwitch()->setAutoJsonSerialization(false);
  136. ]]></programlisting>
  137. </listitem>
  138. <listitem>
  139. <para>
  140. <emphasis>XML</emphasis>. Der XML Kontext setzt den 'Content-Type' Antwort
  141. Header auf 'text/xml' und den View Skript Suffix auf 'xml.phtml'. Es muß ein
  142. neues View Skript für den Kontext erstellt werden.
  143. </para>
  144. </listitem>
  145. </itemizedlist>
  146. </sect4>
  147. <sect4 id="zend.controller.actionhelpers.contextswitch.custom">
  148. <title>Eigene Kontexte erstellen</title>
  149. <para>
  150. Manchmal sind die Standardkontexte nicht genug. Zum Beispiel wenn man YAML zurückgeben
  151. will, oder PHP serialisieren, ein RSS oder ATOM Feed, usw. <code>ContextSwitch</code>
  152. erlaubt es das zu tun.
  153. </para>
  154. <para>
  155. Der einfachste Weg einen neuen Kontext hinzuzufügen ist über die
  156. <code>addContext()</code> Methode. Diese Methoe nimmt zwei Argumente, den Namen des
  157. Kontextes, und eine Array Spezifikation. Die Spezifikation sollte ein oder mehrere der
  158. folgenden Dinge enthalten:
  159. </para>
  160. <itemizedlist>
  161. <listitem>
  162. <para><emphasis>suffix</emphasis>: Der Suffix der dem Standard View Suffix angefügt
  163. werden soll der im ViewRenderer registriert ist.</para>
  164. </listitem>
  165. <listitem>
  166. <para><emphasis>headers</emphasis>: Ein Array von Header/Wert Paaren das als Teil
  167. der Antwort gesendet werden soll.</para>
  168. </listitem>
  169. <listitem>
  170. <para>
  171. <emphasis>callbacks</emphasis>: Ein Array das ein oder mehrere der Schlüssel
  172. 'init' oder 'post' enthält, die auf gültige PHP Callbacks zeigen und die für die
  173. Initialisierung des Contextes und die Nachbearbeitung verwendet werden können.
  174. </para>
  175. <para>Initialisierungs Callbacks treten auf wenn der Kontext durch
  176. <code>ContextSwitch</code> erkannt wird. Sie können verwendet werden um spezielle
  177. Logik auszuführen die stattfinden soll. Als Beispiel verwendet der JSON Kontext
  178. einen Callback um den ViewRenderer auszuschalten wenn auto-JSON Serialisierung
  179. eingeschaltet ist.</para>
  180. <para>Nachbearbeitung tritt wärend der <code>postDispatch()</code> Routine der
  181. Aktion auf, und kann verwendet werden um spezielle Logik auszuführen. Als Beispiel
  182. verwendet der JSON Kontext einen Callback um festzustellen ob auto-JSON
  183. Serialisierung eingeschaltet ist; wenn dem so ist, serialisiert es die View
  184. Variablen zu JSON und sendet die Antwort, aber wenn dem nicht so ist, schaltet es
  185. den ViewRenderer wieder ein.</para>
  186. </listitem>
  187. </itemizedlist>
  188. <para>
  189. Es gibt eine Vielzahl an Methoden für die Interaktion mit Kontexten:
  190. </para>
  191. <itemizedlist>
  192. <listitem><para>
  193. <code>addContext($context, array $spec)</code>: Fügt einen neuen Kontext hinzu.
  194. Wirft eine Ausnahme wenn der Kontext bereits existiert.
  195. </para></listitem>
  196. <listitem><para>
  197. <code>setContext($context, array $spec)</code>: Fügt einen neuen Kontext hinzu oder
  198. überschreibt einen bestehenden Kontext. Verwendet die gleiche Spezifikation wie
  199. <code>addContext()</code>.
  200. </para></listitem>
  201. <listitem><para>
  202. <code>addContexts(array $contexts)</code>: Fügt viele Kontexte auf einmal hinzu.
  203. Das <varname>$contexts</varname> Array sollte ein Array von Kontext/Spezifikation
  204. Paaren sein. Wenn einer der Kontexte bereits existiert, wird eine Ausnahme
  205. geworfen.
  206. </para></listitem>
  207. <listitem><para>
  208. <code>setContexts(array $contexts)</code>: Fügt neue Kontexte hinzu und
  209. überschreibt bestehende. Verwendet die gleiche Spezifikation wie
  210. <code>addContexts()</code>.
  211. </para></listitem>
  212. <listitem><para>
  213. <code>hasContext($context)</code>: Gibt true zurück wenn der Kontext existiert,
  214. andernfalls false.
  215. </para></listitem>
  216. <listitem><para>
  217. <code>getContext($context)</code>: Empfängt einen einzelnen Kontext
  218. durch den Namen. Gibt ein Array zurück das der Spezifikation folgt die in
  219. <code>addContext()</code> verwendet wird.
  220. </para></listitem>
  221. <listitem><para>
  222. <code>getContexts()</code>: Empfängt alle Kontexte. Gibt ein Array von
  223. Kontext/Spezifikation Paaren zurück.
  224. </para></listitem>
  225. <listitem><para>
  226. <code>removeContext($context)</code>: Entfernt einen einzelnen Kontext durch seinen
  227. Namen. Gibt im Erfolgsfall true zurück, und false wenn der Kontext nicht gefunden
  228. wurde.
  229. </para></listitem>
  230. <listitem><para>
  231. <code>clearContexts()</code>: Entfernt alle Kontexte.
  232. </para></listitem>
  233. </itemizedlist>
  234. </sect4>
  235. <sect4 id="zend.controller.actionhelpers.contextswitch.actions">
  236. <title>Kontexte per Aktion setzen</title>
  237. <para>
  238. Es gibt zwei Mechanismen für das Setzen vorhandener Kontexte. Es kann entweder manuell
  239. ein Array im Kontroller erstellt werden, oder es können verschiedene Methoden in
  240. <code>ContextSwitch</code> verwendet werden um Sie zu bauen.
  241. </para>
  242. <para>
  243. Die prinzipielle Methode für das Hinzufügen von Aktion/Kontext Relationen ist
  244. <code>addActionContext()</code>. Sie erwartet zwei Argumente, die Aktion zu der der
  245. Kontext hinzugefügt werden soll, und entweder den Namen des Kontextes oder ein Array
  246. von Kontexten. Als Beispiel nehmen wir die folgende Controller Klasse an:
  247. </para>
  248. <programlisting language="php"><![CDATA[
  249. class FooController extends Zend_Controller_Action
  250. {
  251. public function listAction()
  252. {
  253. }
  254. public function viewAction()
  255. {
  256. }
  257. public function commentsAction()
  258. {
  259. }
  260. public function updateAction()
  261. {
  262. }
  263. }
  264. ]]></programlisting>
  265. <para>
  266. Angenommen wir sollen einen XML Kontext zu der 'list' Aktion hinzufügen, und XML und
  267. JSON Kontexte zu der 'comments' Aktion. Wir können das in der <code>init()</code>
  268. Methode machen:
  269. </para>
  270. <programlisting language="php"><![CDATA[
  271. class FooController extends Zend_Controller_Action
  272. {
  273. public function init()
  274. {
  275. $this->_helper->contextSwitch()
  276. ->addActionContext('list', 'xml')
  277. ->addActionContext('comments', array('xml', 'json'))
  278. ->initContext();
  279. }
  280. }
  281. ]]></programlisting>
  282. <para>
  283. Alternativ kann einfach die Array-Eigenschaft <varname>$contexts</varname> definiert
  284. werden:
  285. </para>
  286. <programlisting language="php"><![CDATA[
  287. class FooController extends Zend_Controller_Action
  288. {
  289. public $contexts = array(
  290. 'list' => array('xml'),
  291. 'comments' => array('xml', 'json')
  292. );
  293. public function init()
  294. {
  295. $this->_helper->contextSwitch()->initContext();
  296. }
  297. }
  298. ]]></programlisting>
  299. <para>
  300. Das obige ist weniger Overhead, aber enthält auch potentielle Fehler.
  301. </para>
  302. <para>
  303. Die folgenden Methoden können verwendet werden um die Kontext-Mappings zu erstellen:
  304. </para>
  305. <itemizedlist>
  306. <listitem>
  307. <para>
  308. <code>addActionContext($action, $context)</code>: markiert einen oder mehrere
  309. Kontexte als in einer Aktion vorhanden. Wenn bereits Mapping existieren wird
  310. einfach bei diesen Mappings angehängt. <varname>$context</varname> kann ein
  311. einzelner Kontext sein, oder ein Array von Kontexten.
  312. </para>
  313. <para>
  314. Ein Wert von <constant>TRUE</constant> für den Kontext markiert alle vorhandenen
  315. Kontexte als vorhanden für die Aktion.
  316. </para>
  317. <para>
  318. Ein leerer Wert für $context deaktiviert alle Kontexte für die gegebene Aktion.
  319. </para>
  320. </listitem>
  321. <listitem><para>
  322. <code>setActionContext($action, $context)</code>: markiert einen oder mehrere
  323. Kontexte als in einer Aktion vorhanden. Wenn bereits Mappings existieren werden
  324. Sie mit den spezifizierten ersetzt. <varname>$context</varname> kann ein
  325. einzelner Kontext sein, oder ein Array von Kontexten.
  326. </para></listitem>
  327. <listitem><para>
  328. <code>addActionContexts(array $contexts)</code>: fügt mehrere Aktion/Kontext
  329. Paare auf einmal hinzu. <varname>$contexts</varname> sollte ein assoziatives
  330. Array von Aktion/Kontext Paaren sein. Es entspricht
  331. <code>addActionContext()</code>, was bedeutet das wenn eine Paarung bereits
  332. existiert, diese hinzugefügt wird.
  333. </para></listitem>
  334. <listitem><para>
  335. <code>setActionContexts(array $contexts)</code>: fungiert wie
  336. <code>addActionContexts()</code>, überschreibt aber bestehende Aktion/Kontext
  337. Paare.
  338. </para></listitem>
  339. <listitem><para>
  340. <code>hasActionContext($action, $context)</code>: ermittelt ob eine spezielle
  341. Aktion einen gegebenen Kontext hat.
  342. </para></listitem>
  343. <listitem><para>
  344. <code>getActionContexts($action = null)</code>: gibt entweder alle Kontexte
  345. für eine gegebene Aktion zurück, oder alle Aktion/Kontext Paare.
  346. </para></listitem>
  347. <listitem><para>
  348. <code>removeActionContext($action, $context)</code>: entfernt ein oder mehrere
  349. Kontexte von einer gegebenen Aktion. <varname>$context</varname> kann ein
  350. einzelner Kontext sein, oder ein Array von Kontexten.
  351. </para></listitem>
  352. <listitem><para>
  353. <code>clearActionContexts($action = null)</code>: entfernt alle Kontexte von
  354. einer gegebenen Aktion, oder von allen Aktionen mit Kontexten.
  355. </para></listitem>
  356. </itemizedlist>
  357. </sect4>
  358. <sect4 id="zend.controller.actionhelpers.contextswitch.initcontext">
  359. <title>Kontext Switching initialisieren</title>
  360. <para>
  361. Um Kontext Switching zu initialisieren, muß <code>initContext()</code> im Action
  362. Controller aufgerufen werden:
  363. </para>
  364. <programlisting language="php"><![CDATA[
  365. class NewsController extends Zend_Controller_Action
  366. {
  367. public function init()
  368. {
  369. $this->_helper->contextSwitch()->initContext();
  370. }
  371. }
  372. ]]></programlisting>
  373. <para>
  374. In einigen Fällen, will man einen Kontext erzwingen der verwendet werden soll; zum
  375. Beispiel wenn man nur den XML Kontext erlauben will wenn Kontext Switching aktiviert
  376. ist. Das kann durch die Übergaben des Kontextes zu <code>initContext()</code> getan
  377. werden:
  378. </para>
  379. <programlisting language="php"><![CDATA[
  380. $contextSwitch->initContext('xml');
  381. ]]></programlisting>
  382. </sect4>
  383. <sect4 id="zend.controller.actionhelpers.contextswitch.misc">
  384. <title>Zusätzliche Funktionalitäten</title>
  385. <para>
  386. Eine Vielzahl an Methoden kann verwendet werden um das Verhalten des
  387. <code>ContextSwitch</code> Helfers zu verändern. Diese sind:
  388. </para>
  389. <itemizedlist>
  390. <listitem>
  391. <para>
  392. <code>setAutoJsonSerialization($flag)</code>: Standardmäßig serialisieren JSON
  393. Kontexte alle View Variablen in die JSON Notierung und geben diese als Antwort
  394. zurück. Wenn man seine eigene Antwort erstellen will, sollte das ausgeschaltet
  395. werden; das muß vor dem Aufruf von <code>initContext()</code> geschehen.
  396. </para>
  397. <programlisting language="php"><![CDATA[
  398. $contextSwitch->setAutoJsonSerialization(false);
  399. $contextSwitch->initContext();
  400. ]]></programlisting>
  401. <para>
  402. Der Wert des Flags erhält man mit <code>getAutoJsonSerialization()</code>.
  403. </para>
  404. </listitem>
  405. <listitem>
  406. <para>
  407. <code>setSuffix($context, $suffix, $prependViewRendererSuffix)</code>: Mit
  408. dieser Methode kann ein anderer Suffix spezifiziert werden der für einen
  409. gegebenen Kontext verwendet werden soll. Das dritte Argument wird verwendet um
  410. anzuzeigen ob der aktuelle Suffix des ViewRenderers dem neuen Suffix
  411. vorangestellt werden soll oder nicht; dieses Flag ist standardmäßig aktiviert.
  412. </para>
  413. <para>
  414. Die Übergabe eines leeren Werte an den Suffix führt dazu das nur der Suffix des
  415. ViewRenderers verwendet wird.
  416. </para>
  417. </listitem>
  418. <listitem>
  419. <para>
  420. <code>addHeader($context, $header, $content)</code>: Fügt einen Antwort Header
  421. für einen gegebenen Kontext hinzu. <varname>$header</varname> ist der
  422. Headername, und <varname>$content</varname> ist der Wert der an diesen Header
  423. übergeben werden soll.
  424. </para>
  425. <para>
  426. Jeder Kontxt kann mehrere Header haben; <code>addHeader()</code> fügt
  427. zusätzliche Header in den Header Stack des Kontextes ein.
  428. </para>
  429. <para>
  430. Wenn der spezifizierte <varname>$header</varname> bereits für diesen Kontext
  431. existiert, wird eine Ausnahme geworfen.
  432. </para>
  433. </listitem>
  434. <listitem>
  435. <para>
  436. <code>setHeader($context, $header, $content)</code>: <code>setHeader()</code>
  437. funktioniert wie <code>addHeader()</code>, ausser das sie erlaubt das
  438. existierende Kontext Header überschrieben werden.
  439. </para>
  440. </listitem>
  441. <listitem>
  442. <para>
  443. <code>addHeaders($context, array $headers)</code>: Fügt einen gegebenen Kontext
  444. mehrere Header auf einmal hinzu. Entspricht <code>addHeader()</code>, was
  445. bedeutet das eine Ausnahme geworfen wird wenn der Header bereits existiert.
  446. <varname>$headers</varname> ist ein Array von Header/Kontext Paaren.
  447. </para>
  448. </listitem>
  449. <listitem>
  450. <para>
  451. <code>setHeaders($context, array $headers.)</code>: Wie
  452. <code>addHeaders()</code>, nur das es <code>setHeader()</code> entspricht und
  453. damit das Überschreiben existierender Header erlaubt.
  454. </para>
  455. </listitem>
  456. <listitem>
  457. <para>
  458. <code>getHeader($context, $header)</code>: Enpfängt den Wert eines Headers für
  459. einen gegebenen Kontext. Gibt null zurück wenn dieser nicht gefunden wird.
  460. </para>
  461. </listitem>
  462. <listitem>
  463. <para>
  464. <code>removeHeader($context, $header)</code>: Entfernt einen einzelnen Header
  465. für einen gegebenen Kontext.
  466. </para>
  467. </listitem>
  468. <listitem>
  469. <para>
  470. <code>clearHeaders($context, $header)</code>: Entfernt alle Header für einen
  471. gegebenen Kontext.
  472. </para>
  473. </listitem>
  474. <listitem>
  475. <para>
  476. <code>setCallback($context, $trigger, $callback)</code>: Setzt einen Callback
  477. bei einem gegebenen Trigger für einen gegebenen Kontext. Trigger können
  478. entweder 'init' oder 'post' sein (was zeigt das der Callback entweder bei der
  479. Initialisierung oder der Nachbearbeitung aufgerufen wird).
  480. <varname>$callback</varname> sollte ein gültiger PHP Callback sein.
  481. </para>
  482. </listitem>
  483. <listitem>
  484. <para>
  485. <code>setCallbacks($context, array $callbacks)</code>: Setzt mehrere Callbacks
  486. für einen gegebenen Kontext. <varname>$callbacks</varname> sollte ein
  487. Trigger/Callback Paar sein. Aktuell sind die meisten Callbacks die registriert
  488. werden können zwei, einer für Initialisierung und einer für die
  489. Nachbearbeitung.
  490. </para>
  491. </listitem>
  492. <listitem>
  493. <para>
  494. <code>getCallback($context, $trigger)</code>: Empfängt einen Callback für einen
  495. gegebenen Trigger in einem gegebenen Kontext.
  496. </para>
  497. </listitem>
  498. <listitem>
  499. <para>
  500. <code>getCallbacks($context)</code>: Empfängt alle Callbacks für einen gegebenen
  501. Kontext. Gibt ein Array von Trigger/Callback Paaren zurück.
  502. </para>
  503. </listitem>
  504. <listitem>
  505. <para>
  506. <code>removeCallback($context, $trigger)</code>: Entfernt einen Callback für
  507. einen gegebenen Trigger und Kontext.
  508. </para>
  509. </listitem>
  510. <listitem>
  511. <para>
  512. <code>clearCallbacks($context)</code>: Entfernt alle Callbacks für einen
  513. gegebenen Kontext.
  514. </para>
  515. </listitem>
  516. <listitem>
  517. <para>
  518. <code>setContextParam($name)</code>: Setzt den Anfrageparameter der geprüft
  519. werden muß um zu entscheiden ob eine Kontextumschaltung angefragt wurde oder
  520. nicht. Der Wert ist standardmäßig 'format', aber dieser Zugriffspunkt kann
  521. verwendet werden um einen alternativen wert zu setzen.
  522. </para>
  523. <para>
  524. <code>getContextParam()</code> kann verwendet werden um den aktuellen Wert zu
  525. erhalten.
  526. </para>
  527. </listitem>
  528. <listitem>
  529. <para>
  530. <code>setAutoDisableLayout($flag)</code>: Standardmäßig sind Layouts
  531. ausgeschaltet wenn eine Kontextumschaltung erfolgt; das ist weil Layouts
  532. typischerweise dafür verwendet werden um normale Antworten darzustellen, und
  533. Sie in alternativen Kontexten keine Bedeutung haben. Wenn man trotzdem Layouts
  534. verwenden will (möglicherweise hat man ein Layout für einen neuen Kontext),
  535. kann dieses Verhalten mit der Übergabe eines false Wertes an
  536. <code>setAutoDisableLayout()</code> geändert werden. Das sollte aber
  537. <emphasis>before</emphasis> dem Aufruf von <code>initContext()</code>
  538. geschehen.
  539. </para>
  540. <para>
  541. Um den Wert dieses Flags zu erhalten, kann der Zugriffspunkt
  542. <code>getAutoDisableLayout()</code> verwendet werden.
  543. </para>
  544. </listitem>
  545. <listitem>
  546. <para>
  547. <code>getCurrentContext()</code> kann verwendet werden um festzustellen welcher
  548. Kontext erkannt wurde, wenn überhaupt. Er gibt null zurück wenn keine
  549. Kontextumschaltung stattgefunden hat, oder wenn er aufgerufen wurde bevor
  550. <code>initContext()</code> stattgefunden hat.
  551. </para>
  552. </listitem>
  553. </itemizedlist>
  554. </sect4>
  555. <sect4 id="zend.controller.actionhelpers.contextswitch.ajaxcontext">
  556. <title>AjaxContext Funktionalität</title>
  557. <para>
  558. Der <code>AjaxContext</code> Helfer erweitert <code>ContextSwitch</code>, sodas alle
  559. für <code>ContextSwitch</code> gelisteten Funktionalitäten in Ihm vorhanden sind. Es
  560. gibt trotzdem ein paar wichtige Änderungen.
  561. </para>
  562. <para>
  563. Zuerst, verwendet es eine andere Action Kontroller Eigenschaft
  564. <varname>$ajaxable</varname> um Kontexte festzustellen. Damit kann man verschiedene
  565. Kontexte verwenden für AJAX gegenüber normalen HTTP Anfragen. Die verschiedenen
  566. <code>*ActionContext*()</code> Methoden von <code>AjaxContext</code> schreiben in diese
  567. Eigenschaft.
  568. </para>
  569. <para>
  570. Zweitens, wird nur dann getriggert wenn ein XmlHttpRequest stattgefunden hat, was durch
  571. die <code>isXmlHttpRequest()</code> Methode den Anfrageobjektes festgestellt wird.
  572. Deshalb wird, wenn der Kontextparameter ('format') in der Anfrage übergeben wird, aber
  573. die anfrage nicht als XmlHttpRequest gemacht wurde, keine Kontextumschaltung
  574. getriggert.
  575. </para>
  576. <para>
  577. Drittens, fügr der <code>AjaxContext</code> einen zusätzlichen, HTML, Kontext hinzu. In
  578. diesem Kontext setzt er den Suffix auf 'ajax.phtml' um diesen Kontext von einer
  579. normalen Anfrage zu unterscheiden. Es werden keine zusätzlichen Header zurückgegeben.
  580. </para>
  581. <example id="zend.controller.actionhelpers.contextswitch.ajaxcontext.example">
  582. <title>Aktionen erlauben auf Ajax Anfragen zu antworten</title>
  583. <para>
  584. In dem folgenden Beispiel erlauben wir Anfragen auf die Aktionen 'view', 'form' und
  585. 'process' auf AJAX Anfragen zu antworten. In den ersten zwei Fällen, 'view' und
  586. 'form' wird ein HTML Teilstück zurückgegeben mit dem die Seite aktualisiert werden
  587. soll; im letzteren wird JSON zurückgegeben.
  588. </para>
  589. <programlisting language="php"><![CDATA[
  590. class CommentController extends Zend_Controller_Action
  591. {
  592. public function init()
  593. {
  594. $ajaxContext = $this->_helper->getHelper('AjaxContext');
  595. $ajaxContext->addActionContext('view', 'html')
  596. ->addActionContext('form', 'html')
  597. ->addActionContext('process', 'json')
  598. ->initContext();
  599. }
  600. public function viewAction()
  601. {
  602. // Ein einzelnes Kommentar holen um es anzuzeigen.
  603. // Wenn AjaxContext erkannt wurde, verwendet es das
  604. // comment/view.ajax.phtml View Skript.
  605. }
  606. public function formAction()
  607. {
  608. // Stellt die "add new comment" Form dar.
  609. // Wenn AjaxContext erkannt wurde, verwendes es das
  610. // comment/form.ajax.phtml View Skript.
  611. }
  612. public function processAction()
  613. {
  614. // Bearbeitet einen neuen Kommentar
  615. // Gibt das Ergebnis als JSON zurück; fügt die Ergebnisse einfach als
  616. // View Variablen hinzu, und JSON wird zurückgegeben.
  617. }
  618. }
  619. ]]></programlisting>
  620. <para>
  621. Auf der Seite des Clients, wird die JAX Bibliothe einfach die Endpunkte
  622. '/comment/view', '/comment/form', und '/comment/process' anfragen, und den
  623. 'format' Parameter übergeben: '/comment/view/format/html',
  624. '/comment/form/format/html', '/comment/process/format/json'. (Oder der Parameter
  625. kann über GET übergeben werden: z.B. , "?format=json".)
  626. </para>
  627. <para>
  628. Angenommen die Bibliothek übergibt den 'X-Requested-With: XmlHttpRequest'
  629. Header, dann werden diese Aktionen das richtige Antwortformat zurückgeben.
  630. </para>
  631. </example>
  632. </sect4>
  633. </sect3>
  634. <!--
  635. vim:se ts=4 sw=4 et:
  636. -->