<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jérôme Tamarelle &#187; AJAX</title>
	<atom:link href="http://jerome.tamarelle.net/blog/indice/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://jerome.tamarelle.net/blog</link>
	<description>I share so I am</description>
	<lastBuildDate>Sat, 17 Jul 2010 21:41:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Vue au format JSON sous Symfony</title>
		<link>http://jerome.tamarelle.net/blog/2009/12/vue-au-format-json-sous-symfony/</link>
		<comments>http://jerome.tamarelle.net/blog/2009/12/vue-au-format-json-sous-symfony/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 16:23:18 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Applications web]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://jerome.tamarelle.net/blog/?p=18</guid>
		<description><![CDATA[Contrairement à ce que son nom indique, l'AJAX utilise de plus en plus le format JSON pour échanger des données entre le navigateur et le serveur. Le framework PHP Symfony se déclare "Easy AJAX", il l'est pour l'intégration de JavaScript, mais la création de vues non-HTML n'est pas toujours évidente. Cet article propose deux méthodes [...]]]></description>
			<content:encoded><![CDATA[<p>Contrairement à ce que son nom indique, l'<acronym title="Asynchronous JavaScript and XML">AJAX</acronym> utilise de plus en plus le format <a title="Format JSON" href="http://www.json.org/">JSON</a> pour échanger des données entre le navigateur et le serveur. Le <a title="Framework Symfony" href="http://www.symfony-project.com/">framework PHP Symfony</a> se déclare "Easy AJAX", il l'est pour l'intégration de JavaScript, mais la création de vues non-HTML n'est pas toujours évidente. Cet article propose deux méthodes pour générer du code JSON depuis Symfony avec ou sans aide au débuggage.</p>
<p>Les usages sont multiples, par exemple :</p>
<ul>
<li>Auto-complétion d'un champ avec le plugin <a title="The sfFormExtraPlugin packages useful validators, widgets, and forms." href="http://www.symfony-project.org/plugins/sfFormExtraPlugin">sfFormExtraPlugin</a>,</li>
<li>les événements issus de la base de données à afficher dans un calendrier <a title="FullCalendar is a jQuery plugin that provides a full-sized, drag &amp; drop calendar." href="http://arshaw.com/fullcalendar/">FullCalendar</a>,</li>
<li>ou une galerie photos AJAX avec <a title="minishowcase is a small and simple php/javascript online photo gallery" href="http://minishowcase.net/">minishowcase</a>.</li>
</ul>
<p><span id="more-18"></span></p>
<span id="JSON_simplement_mais_sans_dbuggage"><h2>1. JSON simplement mais sans débuggage</h2></span>
<p>Le plus simple pour envoyer du code JSON depuis Symfony est d'inclure les lignes suivantes à la fin du contrôleur :</p>
<pre class="brush: php;">
function executeAction() {
  $data = array();
  // ... Création du tableau $data ...

  // Indispensable : définie le l'en-tête HTTP correspondant au format JSON.
  $this-&gt;getResponse()-&gt;setHttpHeader('Content-type', 'application/json');
  // Contenu transmis.
  $this-&gt;getResponse()-&gt;setContent(json_encode($data));
  // N'affiche aucune vue.
  return return sfView::NONE;
}
</pre>
<p>Simple à mettre en œuvre, cette méthode peut poser problème pour le débuggage de l'application.</p>
<ul>
<li>Le contenu JSON transmis n'est pas visualisable dans le navigateur à cause du content-type non reconnu.</li>
<li>Si l'on laisse le content-type par défaut, le texte JSON transmis est parasité par la debug toolbar.</li>
</ul>
<span id="JSON_avec_dbuggage"><h2>2. JSON avec débuggage</h2></span>
<p>Pour rendre visible le format JSON au développeur, il faut adapter la réponse au contexte d'exécution de la page. Les données ne doivent être affichées lisiblement que lorsque le développeur affiche la page en mode débug, mais pas lorsqu'elle est appelée depuis JavaScript, même en mode débug. Pour cela, la méthode <a title="API Symfony" href="http://www.symfony-project.org/api/1_4/sfWebRequest#method_isxmlhttprequest"><code>sfWebRequest::isXmlHttpRequest()</code></a> est bien pratique.</p>
<p>Un petit aperçu du rendu dans le navigateur en mode débug, lorsque la page est appelée directement depuis la barre d'adresse du navigateur.</p>
<div id="attachment_26" class="wp-caption aligncenter" style="width: 310px"><a href="http://jerome.tamarelle.net/blog/wp-content/uploads/2006/03/json-symfony-template.png"><img class="size-medium wp-image-26" title="json-symfony-template" src="http://jerome.tamarelle.net/blog/wp-content/uploads/2006/03/json-symfony-template-300x217.png" alt="Template JSON" width="300" height="217" /></a><p class="wp-caption-text">Aperçu du rendu JSON en mode débug.</p></div>
<p><strong>1/3</strong> Créez le composant JSON. Fichier app/<em>app_name</em>/modules/<em>module_name</em>/actions/jsonComponent.class.php</p>
<pre class="brush: php;">
class jsonComponent extends sfComponent
{
  function execute($request)
  {
    if (sfConfig::get('sf_debug') &amp;&amp; !$this-&gt;getRequest()-&gt;isXmlHttpRequest())
    {
      $this-&gt;setVar('data', $this-&gt;data);
    }
    else
    {
      $this-&gt;getResponse()-&gt;setHttpHeader('Content-type', 'application/json');
      $this-&gt;getResponse()-&gt;setContent(json_encode($this-&gt;data));
      return sfView::NONE;
    }
  }
}
</pre>
<p><strong>2/3</strong> Créez ensuite la vue associée. Fichier app/<em>app_name</em>/modules/<em>module_name</em>/templates/_json.php</p>
<pre class="brush: php;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;
&lt;head&gt;&lt;title&gt;JSON response&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
  &lt;h2&gt;JSON&lt;/h2&gt;
  &lt;?php echo json_encode($sf_data-&gt;getRaw('data')); ?&gt;
  &lt;h2&gt;Data structure&lt;/h2&gt;
  &lt;pre&gt;&lt;?php print_r($sf_data-&gt;getRaw('data')); ?&gt;&lt;/pre&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>3/3</strong> Enfin appelez le composant depuis votre contrôleur. Fichier app/<em>app_name</em>/modules/<em>module_name</em>/actions/actions.class.php</p>
<pre class="brush: php;">
function executeAction() {
  $data = array();
  // ... Création du tableau $data ...

  // Transmet la responsabilité de l'affichage au composant JSON
  return $this-&gt;renderComponent('module_name', 'json', array('data'=&gt;$data));
}
</pre>
<p>Le composant peut être créé dans un module spécifique et appelé depuis un autre module.</p>
<p>Reste plus qu'à en faire un plugin ...</p>
<p><strong>Deux articles pour aller plus loin :</strong></p>
<ul>
<li><a title="AJAX and JSON" href="http://trac.symfony-project.org/wiki/AjaxAndJSON">AJAX and JSON</a></li>
<li><a title="JSON" href="http://librosweb.es/symfony_1_2_en/capitulo11/json.html">Symfony 1.2 The definitive guide | JSON</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://jerome.tamarelle.net/blog/2009/12/vue-au-format-json-sous-symfony/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
