<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect3 id="zend.controller.actionhelpers.json">
    <title>JSON</title>

    <para>
        JSON быстро становится предпочтительным форматом для использования с
        AJAX-запросами, которые подразумевают ответы с данными. Синтаксический
        разбор JSON может производиться сразу на стороне клиента, что приводит
        к большей производительности.
    </para>

    <para>
        Помощник действий JSON выполняет несколько функций:
    </para>

    <itemizedlist>
        <listitem><para>
                Отключает макеты, если они включены.
        </para></listitem>

        <listitem>
            <para>
                Опционально в качестве второго аргумента можно передавать
                массив опций для <code>Zend_Json::encode()</code>.
                Этот масив опций позволяет включать макеты и кодирование
                с использованием <classname>Zend_Json_Expr</classname>.
            </para>

            <programlisting language="php"><![CDATA[
$this->_helper->json($data, array('enableJsonExprFinder' => true));
]]></programlisting>
        </listitem>

        <listitem><para>
                Отключает ViewRenderer, если он включен.
        </para></listitem>

        <listitem><para>
                Устанавливает заголовок ответа 'Content-Type' со значением
                'application/json'.
        </para></listitem>

        <listitem><para>
                По умолчанию сразу возвращает ответ, не дожидаясь завершения
                выполнения действия.
        </para></listitem>
    </itemizedlist>

    <para>
        Использование помощника довольно простое - вызывайте его как метод
        брокера помощников или вызывайте один из его методов
        <code>encodeJson()</code> или
        <code>sendJson()</code>:
    </para>

    <programlisting language="php"><![CDATA[
class FooController extends Zend_Controller_Action
{
    public function barAction()
    {
        // произведение некоторых действий...

        // Отправка ответа JSON:
        $this->_helper->json($data);

        // или...
        $this->_helper->json->sendJson($data);

        // либо получение данных в формате json:
        $json = $this->_helper->json->encodeJson($data);
    }
}
]]>
    </programlisting>

    <note>
        <title>Использование макетов</title>

        <para>
            Если вы имеете отдельный макет для ответов JSON (возможно, для того,
            чтобы включить ответ JSON в некоторый контекст), то на этот случай
            все методы в помощнике JSON принимает второй, опциональный
            аргумент - флаг для включения/отключения макетов. Передача булевого
            значения <constant>TRUE</constant> позволит оставить макеты включенными:
        </para>

        <programlisting language="php"><![CDATA[
$this->_helper->json($data, true);
]]></programlisting>

        <para>
            Вы можете также передавать массив через второй параметр.
            Этот массив может содержать набор опций, включая опцию
            <code>keepLayouts</code>:
        </para>

        <programlisting language="php"><![CDATA[
$this->_helper->json($data, array('keepLayouts' => true);
]]></programlisting>
    </note>

    <note>
        <title>Включение кодирования через Zend_Json_Expr</title>

        <para>
            <classname>Zend_Json::encode()</classname> позволяет закодировывать
            "родные" выражения JSON с использованием объектов
            <code>Zend_Json_Expr</code>. Эта опция по умолчанию отключена.
            Для того, чтобы включить эту опцию, передавайте
            булево значение <constant>TRUE</constant> через опцию
            <code>enableJsonExprFinder</code>:
        </para>

        <programlisting language="php"><![CDATA[
$this->_helper->json($data, array('enableJsonExprFinder' => true);
]]></programlisting>

        <para>
            При использовании этой опции вы <emphasis>должны</emphasis>
            передавать массив в качестве второго параметра. Это также
            позволяет комбинировать опции друг с другом - например, с опцией
            <code>keepLayouts</code>. Все эти опции потом передаются
            <classname>Zend_Json::encode()</classname>.
        </para>

        <programlisting language="php"><![CDATA[
$this->_helper->json($data, array(
    'enableJsonExprFinder' => true,
    'keepLayouts'          => true,
));
]]></programlisting>
    </note>
</sect3>
<!--
vim:se ts=4 sw=4 et:
-->
