<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1592"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1592/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1592/atom/feed</id>
  <updated>2008-07-12T12:05:16+02:00</updated>
  <entry>
    <title>Drupal - Le &quot;bug de Juillet&quot; du RSS</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1592" />
    <id>http://artisan.karma-lab.net/node/1592</id>
    <published>2008-07-12T11:58:30+02:00</published>
    <updated>2008-07-12T12:05:16+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Drupal" />
    <category term="drupalfr.org" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Article" />
    <summary type="html"><![CDATA[<p>
   Petite surprise et grosse incompréhension lorsque <a class='external' target='_blank' href='http://www.planet-libre.org' >Planet Libre</a> s'est mis à ne plus référencer mes billets. Je me suis alors dis <q>Shoula, j'ai encore trop parlé de développement, je me suis fait zappé par Sébastien pour de bon <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/></q></p>
<p>
 Et bien pas du tout, mauvaise langue que je suis, car le problème est un vilain BUG dans Drupal. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
   Petite surprise et grosse incompréhension lorsque <a class='external' target='_blank' href='http://www.planet-libre.org' >Planet Libre</a> s'est mis à ne plus référencer mes billets. Je me suis alors dis <q>Shoula, j'ai encore trop parlé de développement, je me suis fait zappé par Sébastien pour de bon <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/></q></p>
<p>
 Et bien pas du tout, mauvaise langue que je suis, car le problème est un vilain BUG dans Drupal. 
</p>
<!--break-->
<p>
  La problème est en soit assez simple. Un flux RSS est un simple fichier XML contenant des entrées <kbd>item</kbd>. Un <kbd>item</kbd> contient une entrée <kbd>pubDate</kbd> qui est la date de publication du billet.
</p>
<p>
 La structure d'un flux RSS est bien évidemment <a class='external' target='_blank' href='http://cyber.law.harvard.edu/rss/rss.html' >spécifié</a> (je ne pense pas que ce soit une norme) et dans cette spécification, il est clairement indiqué que les dates suivent la norme <a class='external' target='_blank' href='http://asg.web.cmu.edu/rfc/rfc822.html#sec-5' >RFC 822</a> sauf pour les années qui peuvent être sur 2 chiffres au lieu de 4 (même si 4 est préféré).
</p>
<p>
  Alors maintenant si l'on va jeter un oeil sur le fichier <kbd>modules/node/node.module</kbd>, on y découvre, ligne 1691, le code suivant :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="re0">$extra</span> <span class="sy0">=</span> <a target="blank" href="http://www.php.net/array_merge"><span class="kw3">array_merge</span></a><span class="br0">&#40;</span><span class="re0">$extra</span><span class="sy0">,</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">'key'</span> <span class="sy0">=&gt;</span> <span class="st0">'pubDate'</span><span class="sy0">,</span> <span class="st0">'value'</span> <span class="sy0">=&gt;</span> format_date<span class="br0">&#40;</span><span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">created</span><span class="sy0">,</span> <span class="st0">'custom'</span><span class="sy0">,</span> <span class="st0">'r'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">'key'</span> <span class="sy0">=&gt;</span> <span class="st0">'dc:creator'</span><span class="sy0">,</span> <span class="st0">'value'</span> <span class="sy0">=&gt;</span> <span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">name</span><span class="br0">&#41;</span><span class="sy0">,</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">'key'</span> <span class="sy0">=&gt;</span> <span class="st0">'guid'</span><span class="sy0">,</span> <span class="st0">'value'</span> <span class="sy0">=&gt;</span> <span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">nid</span> <span class="sy0">.</span><span class="st0">' at '</span><span class="sy0">.</span> <span class="re0">$base_url</span><span class="sy0">,</span> <span class="st0">'attributes'</span> <span class="sy0">=&gt;</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">'isPermaLink'</span> <span class="sy0">=&gt;</span> <span class="st0">'false'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<p>
  La fonction utilisée ici est <a class='external' target='_blank' href='http://api.drupal.org/api/function/format_date/6' >format_date</a> qui avec le paramètre <kbd>r</kbd> doit bien renvoyer une date au format RFC 822.</p>
<p>
 Le problème est que <kbd>format_date</kbd> va plus loin que cela, car en se basant sur la langue courante configurée dans Drupal, elle nous produit une magnifique date RFC 822 avec des jours et des mois en français !! 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="sc3"><span class="re1">&lt;pubDate<span class="re2">&gt;</span></span></span>Ven., 08 Juill. 2008 06:15:57 +0200<span class="sc3"><span class="re1">&lt;/pubDate<span class="re2">&gt;</span></span></span>
  </div>
  
  </div>
</p>
<p>
  La solution est donc de patcher le module pour utiliser plutôt la fonction PHP <a class='external' target='_blank' href='http://fr.php.net/date' >date()</a>, ce qui nous donne :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="re0">$extra</span> <span class="sy0">=</span> <a target="blank" href="http://www.php.net/array_merge"><span class="kw3">array_merge</span></a><span class="br0">&#40;</span><span class="re0">$extra</span><span class="sy0">,</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">'key'</span> <span class="sy0">=&gt;</span> <span class="st0">'pubDate'</span><span class="sy0">,</span> <span class="st0">'value'</span> <span class="sy0">=&gt;</span> <a target="blank" href="http://www.php.net/date"><span class="kw3">date</span></a><span class="br0">&#40;</span><span class="st0">'r'</span><span class="sy0">,</span> <span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">created</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">'key'</span> <span class="sy0">=&gt;</span> <span class="st0">'dc:creator'</span><span class="sy0">,</span> <span class="st0">'value'</span> <span class="sy0">=&gt;</span> <span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">name</span><span class="br0">&#41;</span><span class="sy0">,</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">'key'</span> <span class="sy0">=&gt;</span> <span class="st0">'guid'</span><span class="sy0">,</span> <span class="st0">'value'</span> <span class="sy0">=&gt;</span> <span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">nid</span> <span class="sy0">.</span><span class="st0">' at '</span><span class="sy0">.</span> <span class="re0">$base_url</span><span class="sy0">,</span> <span class="st0">'attributes'</span> <span class="sy0">=&gt;</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">'isPermaLink'</span> <span class="sy0">=&gt;</span> <span class="st0">'false'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<p>
  Voilà, rien de plus. Surtout ne pas oublier de vider les caches, soit par <kbd>?q=/admin/settings/performance</kbd>, soit par un simple <kbd>delete from cache_page</kbd>. Ensuite, à la prochaine lecture des fluxs, nous obtenons un 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="sc3"><span class="re1">&lt;pubDate<span class="re2">&gt;</span></span></span>Fri, 08 Jul 2008 06:15:57 +0200<span class="sc3"><span class="re1">&lt;/pubDate<span class="re2">&gt;</span></span></span>
  </div>
  
  </div>
</p>
<p>
  Ce qui est beaucoup plus en phase avec la norme et convient à l'évidence convient beaucoup mieux à <a class='external' target='_blank' href='http://simplepie.org/' >SimplePie</a> utilisé par Planet Libre. 
</p>
<P>
  A notre que ce problème n'est pas détecté par <a class='external' target='_blank' href='http://feedvalidator.org/' >feed validator</a>...
</p>    ]]></content>
  </entry>
</feed>
