<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 24249 -->
<!-- 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' à
                <filename>application/json</filename>.
            </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 séparés pour les réponses
            <acronym>JSON</acronym>, 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&#160;:
        </para>

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

        <para>
            Optionnellement, vous pouvez fournir un tableau en tant que second paramètre.
            Ce tableau peut conftenir une variété d'options, incluant l'option
            <emphasis>keepLayouts</emphasis>&#160;:
        </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
            <emphasis>enableJsonExprFinder</emphasis>&#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 <emphasis>keepLayouts</emphasis>. 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>
