Zend_Controller-ActionHelpers-ContextSwitch.xml 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. <sect3 id="zend.controller.actionhelpers.contextswitch">
  2. <title>ContextSwitch и AjaxContext</title>
  3. <para>
  4. Помощник действий <code>ContextSwitch</code> предназначен для облегчения
  5. возврата ответов в различных форматах.
  6. Помощник <code>AjaxContext</code> является специализированной версией
  7. <code>ContextSwitch</code>, которая облегчает возврат ответа на запросы,
  8. произведенные посредством XmlHttpRequest.
  9. </para>
  10. <para>
  11. Для того, чтобы включить использование какого-либо из этих помощников,
  12. нужно указать в своем контроллере, какие действия могут отвечать в каком
  13. контексте. Если входящий запрос означает допустимый контекст для данного
  14. действия, то помощник производит следующие действия:
  15. </para>
  16. <itemizedlist>
  17. <listitem><para>
  18. Выключает макеты, если они включены.
  19. </para></listitem>
  20. <listitem><para>
  21. Устанавливает альтернативный суффикс вида, это позволяет эффективно
  22. разделять скрипты видов для различных контекстов.
  23. </para></listitem>
  24. <listitem><para>
  25. Отправляет HTTP-заголовки ответа, требуемые в данном контексте.
  26. </para></listitem>
  27. <listitem><para>
  28. Опционально вызывает предопределенные функции обратного вызова для
  29. установки контекста и/или пост-обработки.
  30. </para></listitem>
  31. </itemizedlist>
  32. <para>
  33. В качестве примера рассмотрим следующий контроллер:
  34. </para>
  35. <programlisting role="php"><![CDATA[
  36. class NewsController extends Zend_Controller_Action
  37. {
  38. /**
  39. * Начальная страница, производится переход к listAction()
  40. */
  41. public function indexAction()
  42. {
  43. $this->_forward('list');
  44. }
  45. /**
  46. * Выводит список новостей
  47. */
  48. public function listAction()
  49. {
  50. }
  51. /**
  52. * Просмотр одной новости
  53. */
  54. public function viewAction()
  55. {
  56. }
  57. }
  58. ]]>
  59. </programlisting>
  60. <para>
  61. Предположим, нам нужно, чтобы действие <code>listAction()</code> было
  62. доступно и в формате XML. Вместо того, чтобы создавать новое действие,
  63. мы можем указать, что действие <code>listAction()</code> может
  64. возвращать и ответ в формате XML:
  65. </para>
  66. <programlisting role="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. ]]>
  78. </programlisting>
  79. <para>
  80. Этим будет:
  81. </para>
  82. <itemizedlist>
  83. <listitem><para>
  84. Установлен заголовок ответа 'Content-Type' со значением
  85. 'text/xml'.
  86. </para></listitem>
  87. <listitem><para>
  88. Изменено значение суффикса вида на 'xml.phtml' (или
  89. 'xml.[your suffix]', если вы используете другой суффикс вида).
  90. </para></listitem>
  91. </itemizedlist>
  92. <para>
  93. Теперь нужно создать новый скрипт вида - 'news/list.xml.phtml',
  94. в котором формируется код XML.
  95. </para>
  96. <para>
  97. Для определения того, нужно ли переключение контекста,
  98. помощник проверяет метку в объекте запроса. По умолчанию он
  99. проверяет параметр 'format', но это поведение может быть изменено.
  100. Это значит, что в большинстве случаев для того, чтобы инициировать
  101. переключение контекста, достаточно добавить параметр 'format' в
  102. запрос одним из двух способов:
  103. </para>
  104. <itemizedlist>
  105. <listitem><para>
  106. Через параметр URL: <code>/news/list/format/xml</code>
  107. (напоминаем, используемый по умолчанию механизм маршрутизации
  108. разрешает добавление произвольных пар ключ/значение после
  109. имени действия в URL)
  110. </para></listitem>
  111. <listitem><para>
  112. Через параметр GET: <code>/news/list?format=xml</code>
  113. </para></listitem>
  114. </itemizedlist>
  115. <para>
  116. <code>ContextSwitch</code> позволяет задавать любой контекст, включая
  117. используемый суффикс вида, отправляемые заголовки ответа и функции
  118. обратного вызова для инициализации и пост-обработки.
  119. </para>
  120. <sect4 id="zend.controller.actionhelpers.contextswitch.contexts">
  121. <title>Доступные по умолчанию контексты</title>
  122. <para>
  123. По умолчанию через помощник <code>ContextSwitch</code> используются
  124. два контекста: json и xml.
  125. </para>
  126. <itemizedlist>
  127. <listitem>
  128. <para>
  129. <emphasis>JSON</emphasis>. Контекст JSON устанавливает
  130. заголовок ответа 'Content-Type' в значение
  131. 'application/json' и суффикс скрипта вида в значение
  132. 'json.phtml'.
  133. </para>
  134. <para>
  135. Но по умолчанию использование скриптов вида не обязательно.
  136. Контекст просто сериализует все переменные вида и сразу
  137. возвращает ответ в формате JSON.
  138. </para>
  139. <para>
  140. Это поведение может быть отменено путем отключения
  141. автоматической сериализации JSON:
  142. </para>
  143. <programlisting role="php"><![CDATA[
  144. $this->_helper->contextSwitch()->setAutoJsonSerialization(false);
  145. ]]>
  146. </programlisting>
  147. </listitem>
  148. <listitem>
  149. <para>
  150. <emphasis>XML</emphasis>. Контекст XML устанавливает
  151. заголовок ответа 'Content-Type' в значение 'text/xml' и
  152. суффикс скрипта вида в значение 'xml.phtml'. Для этого
  153. контекста нужно создавать скрипты вида.
  154. </para>
  155. </listitem>
  156. </itemizedlist>
  157. </sect4>
  158. <sect4 id="zend.controller.actionhelpers.contextswitch.custom">
  159. <title>Создание своего контекста</title>
  160. <para>
  161. Иногда доступных по умолчанию контекстов может быть недостаточно.
  162. Например, нужно возвращать данные в формате YAML, сериализованный
  163. PHP, ленты RSS, ATOM и т.д. <code>ContextSwitch</code> позволяет
  164. добавлять новые контексты.
  165. </para>
  166. <para>
  167. Наиболее простым способом добавления нового контекста является
  168. использование метода <code>addContext()</code>. Этот метод
  169. принимает два аргумента - имя контекста и массив спецификации.
  170. Массив должен включать в себя один или более элементов
  171. из следующих:
  172. </para>
  173. <itemizedlist>
  174. <listitem>
  175. <para><emphasis>suffix</emphasis>: суффикс, который должен
  176. добавляться перед суффиксом, зарегистрированным во
  177. ViewRenderer.</para>
  178. </listitem>
  179. <listitem>
  180. <para><emphasis>headers</emphasis>: массив пар
  181. заголовок/значение, которые требуется отправлять в
  182. ответе.</para>
  183. </listitem>
  184. <listitem>
  185. <para><emphasis>callbacks</emphasis>: массив, который содержит
  186. ключи 'init' и 'post' (один из них или оба).
  187. Ключи должны указывать на действующие функции обратного вызова,
  188. которые могут использоваться для инициализации и пост-обработки
  189. контекста.</para>
  190. <para>Вызов функции инициализации производится сразу после
  191. того, как контекст определен помощником
  192. <code>ContextSwitch</code>. Вы можете использовать его для
  193. выполнения произвольной логики. Например, контекст JSON
  194. использует функцию обратного вызова для отключения
  195. ViewRenderer, если включена автоматическая сериализация
  196. JSON.</para>
  197. <para>Вызов функции пост-обработки производится во время
  198. операции <code>postDispatch()</code> и может использоваться для
  199. выполнения произвольной логики. Например, контекст JSON
  200. использует функцию обратного вызова для определения того,
  201. включена ли автоматическая сериализация JSON; если включена, то
  202. помощник сериализует переменные вида в JSON и отправляет ответ,
  203. иначе включается ViewRenderer.</para>
  204. </listitem>
  205. </itemizedlist>
  206. <para>
  207. Для взаимодействия с контекстом есть несколько методов:
  208. </para>
  209. <itemizedlist>
  210. <listitem><para>
  211. <code>addContext($context, array $spec)</code>: добавляет новый
  212. контекст. Бросает исключение, если контекст уже существует.
  213. </para></listitem>
  214. <listitem><para>
  215. <code>setContext($context, array $spec)</code>: добавляет новый
  216. контекст или переопределяет существующий. Использует ту же
  217. спецификацию, что и <code>addContext()</code>.
  218. </para></listitem>
  219. <listitem><para>
  220. <code>addContexts(array $contexts)</code>: добавляет несколько
  221. контекстов одновременно. Массив <code>$contexts</code> должен
  222. содержать пары контекст/спецификация. Если какой-либо из
  223. контекстов уже существует, то бросается исключение.
  224. </para></listitem>
  225. <listitem><para>
  226. <code>setContexts(array $contexts)</code>: добавляет новые
  227. контексты и переопределяет существующие. Использует ту же
  228. спецификацию, что и <code>addContexts()</code>.
  229. </para></listitem>
  230. <listitem><para>
  231. <code>hasContext($context)</code>: если контекст с этим именем
  232. уже существует, то метод возвращает true, иначе false.
  233. </para></listitem>
  234. <listitem><para>
  235. <code>getContext($context)</code>: возвращает контекст по его
  236. имени в виде массива, следующего спецификации, используемой
  237. в <code>addContext()</code>.
  238. </para></listitem>
  239. <listitem><para>
  240. <code>getContexts()</code>: возвращает все контексты в виде
  241. массива пар контекст/спецификация.
  242. </para></listitem>
  243. <listitem><para>
  244. <code>removeContext($context)</code>: удаляет контекст
  245. по его имени. Возвращает true в случае успеха, false - если
  246. контекст не найден.
  247. </para></listitem>
  248. <listitem><para>
  249. <code>clearContexts()</code>: удаляет все контексты.
  250. </para></listitem>
  251. </itemizedlist>
  252. </sect4>
  253. <sect4 id="zend.controller.actionhelpers.contextswitch.actions">
  254. <title>Установка контекстов для действий</title>
  255. <para>
  256. Есть два способа установки доступных для действий контекстов.
  257. Вы можете либо вручную создавать массивы в своем контроллере, либо
  258. использовать несколько методов в <code>ContextSwitch</code> для
  259. "сборки" таких массивов.
  260. </para>
  261. <para>
  262. <code>addActionContext()</code> является основным методом для
  263. добавления связей действие/контекст. Он принимает два аргумента:
  264. действие, к которому добавляется контекст, и имя контекста (либо
  265. массив контекстов). Для примера рассмотрим следующий класс
  266. контроллера:
  267. </para>
  268. <programlisting role="php"><![CDATA[
  269. class FooController extends Zend_Controller_Action
  270. {
  271. public function listAction()
  272. {
  273. }
  274. public function viewAction()
  275. {
  276. }
  277. public function commentsAction()
  278. {
  279. }
  280. public function updateAction()
  281. {
  282. }
  283. }
  284. ]]>
  285. </programlisting>
  286. <para>
  287. Предположим, что мы хотим добавить контекст XML к действию 'list',
  288. а к действию 'comments' - контексты XML и JSON. В этом случае мы
  289. можем добавить следующий код в метод <code>init()</code>:
  290. </para>
  291. <programlisting role="php"><![CDATA[
  292. class FooController extends Zend_Controller_Action
  293. {
  294. public function init()
  295. {
  296. $this->_helper->contextSwitch()
  297. ->addActionContext('list', 'xml')
  298. ->addActionContext('comments', array('xml', 'json'))
  299. ->initContext();
  300. }
  301. }
  302. ]]>
  303. </programlisting>
  304. <para>
  305. Мы можем также просто определить свойство <code>$contexts</code>
  306. в контроллере:
  307. </para>
  308. <programlisting role="php"><![CDATA[
  309. class FooController extends Zend_Controller_Action
  310. {
  311. public $contexts = array(
  312. 'list' => array('xml'),
  313. 'comments' => array('xml', 'json')
  314. );
  315. public function init()
  316. {
  317. $this->_helper->contextSwitch()->initContext();
  318. }
  319. }
  320. ]]>
  321. </programlisting>
  322. <para>
  323. Этот способ менее трудоемкий, но заключает в себе больше
  324. потенциальных ошибок.
  325. </para>
  326. <para>
  327. Следующие методы могут использоваться для построения связей
  328. действие/контекст:
  329. </para>
  330. <itemizedlist>
  331. <listitem>
  332. <para>
  333. <code>addActionContext($action, $context)</code>: помечает
  334. один или более контекстов как доступные для действия
  335. $action. Если связи уже существуют, то производится
  336. добавление к ним. <code>$context</code> может быть как
  337. одним контекстом, так и массивом контекстов.
  338. </para>
  339. <para>
  340. Если <code>$context</code> имеет значение <code>true</code>,
  341. то все доступные в <code>ContextSwitch</code> контексты
  342. помечаются как доступные для действия.
  343. </para>
  344. <para>
  345. Пустое значение аргумента <code>$context</code> отключит
  346. все контексты для данного действия.
  347. </para>
  348. </listitem>
  349. <listitem><para>
  350. <code>setActionContext($action, $context)</code>: помечает
  351. один или более контекстов как доступные для действия
  352. $action. Если связи уже существуют, то метод заменяет их
  353. указанными.
  354. <code>$context</code> может быть как одним контекстом, так и
  355. массивом контекстов.
  356. </para></listitem>
  357. <listitem><para>
  358. <code>addActionContexts(array $contexts)</code>: добавляет
  359. одновременно несколько пар действие/контекст.
  360. <code>$contexts</code> должен быть ассоциативным массивом
  361. пар действие/контекст. Использует метод
  362. <code>addActionContext()</code>, это означает, что если
  363. связи для данного действия уже существуют, то указанные в
  364. <code>$contexts</code> связи добавляются к ним.
  365. </para></listitem>
  366. <listitem><para>
  367. <code>setActionContexts(array $contexts)</code>: действует
  368. аналогично <code>addActionContexts()</code>, но
  369. переопределяет пары действие/контекст, если они уже
  370. существуют.
  371. </para></listitem>
  372. <listitem><para>
  373. <code>hasActionContext($action, $context)</code>:
  374. используется для определения того, имеет ли действие $action
  375. данный контекст.
  376. </para></listitem>
  377. <listitem><para>
  378. <code>getActionContexts($action = null)</code>: возвращает
  379. все контексты для действия $action или все пары
  380. действие/контекст.
  381. </para></listitem>
  382. <listitem><para>
  383. <code>removeActionContext($action, $context)</code>:
  384. удаляет один или более контекстов из действия $action.
  385. <code>$context</code> может быть как
  386. одним контекстом, так и массивом контекстов.
  387. </para></listitem>
  388. <listitem><para>
  389. <code>clearActionContexts($action = null)</code>: удаляет
  390. все контексты из действия $action или из всех
  391. действий с контекстами.
  392. </para></listitem>
  393. </itemizedlist>
  394. </sect4>
  395. <sect4 id="zend.controller.actionhelpers.contextswitch.initcontext">
  396. <title>Инициализация переключения контекста</title>
  397. <para>
  398. Для того, чтобы инициализировать переключение контекста, необходимо
  399. вызвать метод <code>initContext()</code> в контроллере действий:
  400. </para>
  401. <programlisting role="php"><![CDATA[
  402. class NewsController extends Zend_Controller_Action
  403. {
  404. public function init()
  405. {
  406. $this->_helper->contextSwitch()->initContext();
  407. }
  408. }
  409. ]]>
  410. </programlisting>
  411. <para>
  412. В некоторых случаях может потребоваться принудительное использование
  413. контекста - например, использовать только контекст XML, если
  414. переключение контекста включено. Вы можете осуществить это
  415. передачей контекста методу <code>initContext()</code>:
  416. </para>
  417. <programlisting role="php"><![CDATA[
  418. $contextSwitch->initContext('xml');
  419. ]]>
  420. </programlisting>
  421. </sect4>
  422. <sect4 id="zend.controller.actionhelpers.contextswitch.misc">
  423. <title>Дополнительный функционал</title>
  424. <para>
  425. Для управления помощником <code>ContextSwitch</code> могут
  426. использоваться различные методы. Эти методы включают в себя:
  427. </para>
  428. <itemizedlist>
  429. <listitem>
  430. <para>
  431. <code>setAutoJsonSerialization($flag)</code>: По умолчанию
  432. контекст JSON будет сериализовать все переменные вида
  433. согласно нотации JSON и возвращать их в качестве ответа.
  434. Если вы хотите самостоятельно формировать ответ, то должны
  435. отключить автоматическую сериализацию через данный метод;
  436. это нужно делать до вызова <code>initContext()</code>.
  437. </para>
  438. <programlisting role="php"><![CDATA[
  439. $contextSwitch->setAutoJsonSerialization(false);
  440. $contextSwitch->initContext();
  441. ]]>
  442. </programlisting>
  443. <para>
  444. Вы можете получить значение этого флага через метод
  445. <code>getAutoJsonSerialization()</code>.
  446. </para>
  447. </listitem>
  448. <listitem>
  449. <para>
  450. <code>setSuffix($context, $suffix,
  451. $prependViewRendererSuffix)</code>: Используя этот
  452. метод, вы можете задать другой суффикс для использования в
  453. контексте $context. Третий аргумент используется для
  454. указания того, добавлять ли или нет суффикс из
  455. помощника ViewRenderer к новому суффиксу; этот флаг
  456. установлен по умолчанию.
  457. </para>
  458. <para>
  459. Передача пустого значения в качестве суффикса приведет к
  460. тому, что будет использоваться только суффикс из
  461. ViewRenderer.
  462. </para>
  463. </listitem>
  464. <listitem>
  465. <para>
  466. <code>addHeader($context, $header, $content)</code>:
  467. Добавляет заголовок ответа для контекста $context.
  468. <code>$header</code> является именем заголовка, а
  469. <code>$content</code> - значением для этого заголовка.
  470. </para>
  471. <para>
  472. Любой контекст может иметь несколько заголовков.
  473. <code>addHeader()</code> добавляет дополнительные
  474. заголовки в стек заголовков для данного контекста.
  475. </para>
  476. <para>
  477. Если переданный заголовок уже существует для данного
  478. контекста, то бросается исключение.
  479. </para>
  480. </listitem>
  481. <listitem>
  482. <para>
  483. <code>setHeader($context, $header, $content)</code>:
  484. <code>setHeader()</code> действует аналогично
  485. <code>addHeader()</code> за исключением того, что позволяет
  486. переопределять существующие для данного контекста заголовки.
  487. </para>
  488. </listitem>
  489. <listitem>
  490. <para>
  491. <code>addHeaders($context, array $headers)</code>:
  492. Добавляет несколько заголовков к контексту $context.
  493. Использует <code>addHeader()</code>, поэтому
  494. если заголовок уже существует, то бросается исключение.
  495. <code>$headers</code> является массивом пар
  496. заголовок/значение.
  497. </para>
  498. </listitem>
  499. <listitem>
  500. <para>
  501. <code>setHeaders($context, array $headers.)</code>:
  502. действует аналогично <code>addHeaders()</code> за
  503. исключением того, что использует <code>setHeader()</code>,
  504. что позволяет перезаписывать существующие заголовки.
  505. </para>
  506. </listitem>
  507. <listitem>
  508. <para>
  509. <code>getHeader($context, $header)</code>: возвращает
  510. значение заголовка для данного контекста. Если заголовок
  511. не найден, то возвращается null.
  512. </para>
  513. </listitem>
  514. <listitem>
  515. <para>
  516. <code>removeHeader($context, $header)</code>: удаляет
  517. один заголовок для данного контекста.
  518. </para>
  519. </listitem>
  520. <listitem>
  521. <para>
  522. <code>clearHeaders($context)</code>: удаляет все
  523. заголовки для данного контекста.
  524. </para>
  525. </listitem>
  526. <listitem>
  527. <para>
  528. <code>setCallback($context, $trigger, $callback)</code>:
  529. устанавливает функцию обратного вызова для триггера $trigger
  530. и контекста $context. Триггерами могут быть 'init' или
  531. 'post' (выбор триггера определяет, когда будет вызвана
  532. функция - во время инициализации контекста или операции
  533. <code>postDispatch()</code>). <code>$callback</code> должен
  534. быть действующей PHP-функцией обратного вызова.
  535. </para>
  536. </listitem>
  537. <listitem>
  538. <para>
  539. <code>setCallbacks($context, array $callbacks)</code>:
  540. устанавливает несколько функций обратного вызова для
  541. данного контекста. <code>$callbacks</code> должен быть
  542. массивом пар триггер/функция обратного вызова. В
  543. действительности можно зарегистрировать максимум две
  544. функции обратного вызова, одна для инициализации, другая для
  545. пост-обработки.
  546. </para>
  547. </listitem>
  548. <listitem>
  549. <para>
  550. <code>getCallback($context, $trigger)</code>: возвращает
  551. функцию обратного вызова для триггера $trigger и контекста
  552. $context.
  553. </para>
  554. </listitem>
  555. <listitem>
  556. <para>
  557. <code>getCallbacks($context)</code>: возвращает все функции
  558. обратного вызова в виде массива пар триггер/функция
  559. обратного вызова.
  560. </para>
  561. </listitem>
  562. <listitem>
  563. <para>
  564. <code>removeCallback($context, $trigger)</code>: удаляет
  565. функцию обратного вызова для триггера $trigger и контекста
  566. $context.
  567. </para>
  568. </listitem>
  569. <listitem>
  570. <para>
  571. <code>clearCallbacks($context)</code>: удаляет все функции
  572. обратного вызова для данного контекста.
  573. </para>
  574. </listitem>
  575. <listitem>
  576. <para>
  577. <code>setContextParam($name)</code>: устанавливает параметр
  578. запроса, используемый для переключения контекста. По
  579. умолчанию установлено значение 'format', но его можно
  580. изменить с помощью данного аксессора.
  581. </para>
  582. <para>
  583. <code>getContextParam()</code> может использоваться для
  584. получения текущего значения.
  585. </para>
  586. </listitem>
  587. <listitem>
  588. <para>
  589. <code>setAutoDisableLayout($flag)</code>: По умолчанию
  590. макеты отключаются, когда производится переключение
  591. контекста. Это потому, что макеты, как правило, используются
  592. только с обычным выводом и их использование не имеет смысла
  593. для альтернативного контекста. Тем не менее, если вы хотите
  594. использовать макеты, то можете изменить это поведение,
  595. передав значение <code>false</code> методу
  596. <code>setAutoDisableLayout()</code>. Вы должны делать это
  597. <emphasis>до</emphasis> вызова <code>initContext()</code>.
  598. </para>
  599. <para>
  600. Для получения значения этого флага используйте аксессор
  601. <code>getAutoDisableLayout()</code>.
  602. </para>
  603. </listitem>
  604. <listitem>
  605. <para>
  606. <code>getCurrentContext()</code> может использоваться
  607. для определения того, какой контекст был установлен.
  608. Возвращает null, если не было переключения контекста,
  609. или метод был вызван до <code>initContext()</code>.
  610. </para>
  611. </listitem>
  612. </itemizedlist>
  613. </sect4>
  614. <sect4 id="zend.controller.actionhelpers.contextswitch.ajaxcontext">
  615. <title>Функционал AjaxContext</title>
  616. <para>
  617. Помощник <code>AjaxContext</code> наследует от
  618. <code>ContextSwitch</code>, поэтому весь функционал, описанный
  619. для <code>ContextSwitch</code>, доступен и для него. Но есть
  620. несколько ключевых отличий.
  621. </para>
  622. <para>
  623. Во-первых, он использует другое свойство контроллера для
  624. определения контекстов, а именно <code>$ajaxable</code>. Поэтому вы
  625. можете одновременно использовать различные контексты для AJAX и
  626. обычных HTTP-запросов. Все методы
  627. <code>*ActionContext*()</code> помощника <code>AjaxContext</code>
  628. будут записывать в это свойство.
  629. </para>
  630. <para>
  631. Во-вторых, он будет запускаться только тогда, когда производится
  632. запрос XmlHttpRequest. Для определения того, был ли произведен
  633. запрос XmlHttpRequest, используется метод
  634. <code>isXmlHttpRequest()</code> объекта запроса.
  635. Таким образом, если параметр контекста ('format') был передан в
  636. запросе, но сам запрос был произведен не через
  637. XmlHttpRequest, то не будет произведено переключение контекста.
  638. </para>
  639. <para>
  640. И в-третьих, <code>AjaxContext</code> добавляет дополнительный
  641. контекст - HTML. В этом контексте он устанавливает суффикс в
  642. значение 'ajax.phtml' для отделения этого контекста от обычных
  643. запросов. Дополнительные заголовки не возвращаются.
  644. </para>
  645. <example id="zend.controller.actionhelpers.contextswitch.ajaxcontext.example">
  646. <title>Установка действий для ответов на AJAX-запросы</title>
  647. <para>
  648. В следующем примере мы указываем, что действия 'view', 'form' и
  649. 'process' могут отвечать на AJAX-запросы. В действиях
  650. 'view' и 'form' мы будем возвращать куски HTML-кода для
  651. обновления страницы, в действии 'process' - данные в формате
  652. JSON.
  653. </para>
  654. <programlisting role="php"><![CDATA[
  655. class CommentController extends Zend_Controller_Action
  656. {
  657. public function init()
  658. {
  659. $ajaxContext = $this->_helper->getHelper('AjaxContext');
  660. $ajaxContext->addActionContext('view', 'html')
  661. ->addActionContext('form', 'html')
  662. ->addActionContext('process', 'json')
  663. ->initContext();
  664. }
  665. public function viewAction()
  666. {
  667. // Извлекает один комментарий для просмотра
  668. // Если определен контекст AjaxContext, то используется
  669. // скрипт вида comment/view.ajax.phtml
  670. }
  671. public function formAction()
  672. {
  673. // Рендерит форму для добавления нового комментария
  674. // Если определен контекст AjaxContext, то используется
  675. // скрипт вида comment/form.ajax.phtml
  676. }
  677. public function processAction()
  678. {
  679. // Обрабатывает новый комментарий
  680. // Возвращает результат в формате JSON. Просто присвойте значения
  681. // переменным вида и эти значения будет возвращены в формате JSON.
  682. }
  683. }
  684. ]]>
  685. </programlisting>
  686. <para>
  687. На клиентской стороне посредством AJAX-библиотеки производятся
  688. запросы к конечным точкам '/comment/view',
  689. '/comment/form', '/comment/process' и передается параметр
  690. 'format': '/comment/view/format/html',
  691. '/comment/form/format/html', '/comment/process/format/json'
  692. (можно также передавать параметр
  693. через строку запроса, например: "?format=json").
  694. </para>
  695. <para>
  696. Если ваша AJAX-библиотека передает заголовок 'X-Requested-With:
  697. XmlHttpRequest', то эти действия будут возвращать ответ в
  698. требуемом формате.
  699. </para>
  700. </example>
  701. </sect4>
  702. </sect3>
  703. <!--
  704. vim:se ts=4 sw=4 et:
  705. -->