Zend_Controller-ActionHelpers-ContextSwitch.xml 32 KB

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