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

    <para>
        Les réponses <acronym>JSON</acronym> sont les réponses de choix dans une architecture de type <acronym>AJAX</acronym> qui
        attend des données structurées. <acronym>JSON</acronym> peut être immédiatement interprété du coté du client,
        ce qui rend la tâche plus simple et plus rapide.
    </para>

    <para>L'aide d'action <acronym>JSON</acronym> effectue plusieurs traitements&#160;:</para>

    <itemizedlist>
        <listitem>
            <para>Désactive les layouts si elles sont activées.</para>
        </listitem>
        <listitem>
            <para>
                Optionnellement, un tableau d'options en second argument de
                <methodname>Zend_Json::encode()</methodname>. Ce tableau d'options permet l'activation des
                layouts et l'encodage en utilisant <classname>Zend_Json_Expr</classname>.
            </para>
            <programlisting language="php"><![CDATA[
$this->_helper->json($data, array('enableJsonExprFinder' => true));
]]></programlisting>
        </listitem>
        <listitem>
            <para>Désactive le ViewRenderer s'il est activé.</para>
        </listitem>
        <listitem>
            <para>Envoie à la réponse un en-tête 'Content-Type' à 'application/json'.</para>
        </listitem>
        <listitem>
            <para>
                Par défaut, retourne immédiatement la réponse, sans attendre la fin de
                l'exécution de l'action.
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Son utilisation est toute simple, appelez le depuis le gestionnaire d'aides (Broker),
        ou appelez une de ses méthodes <methodname>encodeJson()</methodname> ou <methodname>sendJson()</methodname>&#160;:
    </para>

    <programlisting language="php"><![CDATA[
class FooController extends Zend_Controller_Action
{
    public function barAction()
    {
        // Effectue des traitements ici ...
        // Envoie la réponse JSON :
        $this->_helper->json($data);

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

        // ou retourne la chaine json:
        $json = $this->_helper->json->encodeJson($data);
    }
}
]]></programlisting>

    <note>
        <title>Conserver les Layouts</title>
        <para>
            Si vous avez besoin des layouts, pour par exemple générer vos réponses <acronym>JSON</acronym> dans
            un contexte particulier, chaque méthode de l'aide <acronym>JSON</acronym> accepte un second paramètre
            booléen. A <constant>TRUE</constant>, les layouts resteront activées (par défaut à
            <constant>FALSE</constant>)&#160;:
        </para>
        <programlisting language="php"><![CDATA[
$this->_helper->json($data, true);
]]></programlisting>

        <para>
            Optionally, you can pass an array as the second parameter. This
            array may contain a variety of options, including the
            <code>keepLayouts</code> option:
        </para>

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

    <note>
        <title>Activer l'encodage en utilisant Zend_Json_Expr</title>
        <para>
            <methodname>Zend_Json::encode()</methodname> permet l'encodage des expressions <acronym>JSON</acronym> natives en
            utilisant des objets <classname>Zend_Json_Expr</classname>. Cette option est désactivée par
            défaut. Pour l'activer, fournissez la valeur booléenne <constant>TRUE</constant> à l'option
            <code>enableJsonExprFinder</code>&#160;:
        </para>
        <programlisting language="php"><![CDATA[
$this->_helper->json($data, array('enableJsonExprFinder' => true);
]]></programlisting>

        <para>
            Si vous souhaitez faire ceci, vous <emphasis>devez</emphasis> un tableau en tant que
            second argument. Ceci vous permet aussi de combiner avec les autres options, comme
            l'option <code>keepLayouts</code>. Toutes ces options sont alors fournies à
            <methodname>Zend_Json::encode()</methodname>.
        </para>

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