Zend_Controller-ActionHelpers-ContextSwitch.xml 33 KB

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