1- But de la manipulation :

Le site Google Webmaster Tools permet d'inscrire un ou des sites web et de savoir comment ils sont indexés dans Google.
On peut entre autres soumettre à Google des liens RSS tel que : http://emmanuelpierre.free.fr/blog/index.php?feed/rss2.
Après quelques heures, on peut consulter un rapport sur la validité du flux RSS.

En consultant le premier rapport sur mon flux RSS, il m'indique des avertissements de 2 types :

  • Date incorrecte
  • Fichier XML incorrect : nombre de balises trop important (balise <enclosure>)


Je vais donc m'efforcer de corriger ces problèmes, donc de modifier la génération du flux rss par Dotclear !

2- Analyse de la situation :

Tout d'abord on jette un coup d'œil au lien suivant : À propos des erreurs et avertissements relatifs aux sitemaps
Puis on ouvre le flux rss dans un nouvelle onglet (sans utilisé de lecteur rss). Et on regarde le code source du fichier xml généré par Dotclear.

a) Problème de date
Avec l'aide de Google on apprend que la date doit être au format ISO 8601 pour être valide. Une date qui ressemble à 2005-02-21T18:00:15+00:00 est valide. Je me rends compte, dans le xml généré, que mes dates ne sont pas du tout dans ce format (<pubDate>).

b) Problème des balises <enclosure>
Certains de mes billets comportent plusieurs fichiers attachés. Dotclear génère donc plusieurs balises <enclosure>, une pour chaque pièce jointe. A priori cela ne plait pas du tout à Google. Donc il va falloir que je limite l'affichage des pièces jointes à 1 fichier attaché par sujet.

3- Correction du problème des dates :
C'est le plus simple à régler !
Le template du flux RSS est situé dans le fichier \inc\public\default-templates\rss2.xml.
On trouve à deux reprises la balise <pubDate> :

<pubDate>{{tpl:BlogUpdateDate rfc822="1"}}</pubDate>
<pubDate>{{tpl:EntryDate rfc822="1"}}</pubDate>


Après un petit coup d'œil sur la doc de Dotclear, on se rend vite compte que l'on peut utiliser l'attribut iso8601 au lieu de rfc822.
On transforme donc nos 2 ligne en :

<pubDate>{{tpl:BlogUpdateDate iso8601="1"}}</pubDate>
<pubDate>{{tpl:EntryDate iso8601="1"}}</pubDate>


Ce qui règle le premier problème !

4- Correction du problème des balises <enclosure> :

Note : Lorsque vous testez les modifications sur un template, il faut supprimer les fichiers du cache avant. Sinon vous risquez de ne voir aucun changement !

Le problème des balises nombreuses est un peu plus compliqué !
Dans le fichier rss2.xml, on voit que la liste des fichiers attachés est gérée par ces quelques lignes :

<tpl:Attachments>
      <enclosure url="{{tpl:AttachmentURL}}"
      length="{{tpl:AttachmentSize full="1"}}" type="{{tpl:AttachmentMimeType}}" />
</tpl:Attachments>


C'est le template Attachments qui permet de boucler sur la liste des fichiers attachés.

Pour régler notre problème, nous allons créer un nouveau template à l'image du template existant, mais avec des options de filtrage...

Et pour faire ce nouveau template, je me suis inspiré de 2 choses :

  • du template originel Attachments dont le code se trouve dans inc\public\class.dc.template.php (voir public function Attachments($attr,$content) )
  • des différents billets du blog Carnet :: Franck Paul : DotClear 2 et les templates



Et voici comment j'ai procédé !

  1. On crée tout d'abord un fichier _public.php dans le répertoire de son thème. Mon thème s'appelle LoadFoo, donc je crée ce fichier dans le dossier \themes\Loadfoo
  2. On crée un nouveau template AttachmentsLimited dont voici le code :
<?php
 
class dcLoadFoo
{
 
/* Attachments ---------------------------------------- */
/*dtd
<!ELEMENT tpl:AttachmentsLimited - - -- Post Attachments loop (avec restrictions)-->
<!ATTLIST tpl:AttachmentsLimited
  size	CDATA	#IMPLIED	-- Filtre sur le nombre de fichiers attachés à afficher. si non renseigné, on affiche toute la liste
>
*/
static public function AttachmentsLimited($attr,$content)
{
 $size = -1;
 
// recuperation de la taille de la liste a afficher
if (isset($attr['size'])) {
  $size = $attr['size'];
 }
 
 $res =
 "<?php\n".
 'if ($_ctx->posts !== null && $core->media) {'."\n".
   '$tableauComplet = $core->media->getPostMedia($_ctx->posts->post_id);'."\n".
 
   //test sur le parametre size
   'if('.$size.'>-1) {'."\n".
    //reduction du tableau 
    '$output = array_slice ($tableauComplet, 0, '.$size.');'."\n".
    '} else {'."\n".
      '$output = $tableauComplet; }'."\n".
    '$_ctx->attachments = new ArrayObject($output);'."\n".
    "?>\n".
 
    '<?php foreach ($_ctx->attachments as $attach_i => $attach_f) : '.
    '$GLOBALS[\'attach_i\'] = $attach_i; $GLOBALS[\'attach_f\'] = $attach_f; ?>'.
	$content.
    '<?php endforeach; $_ctx->attachments = null; unset($attach_id); unset($attach_f); ?>'.
 
 "<?php } ?>\n";		
  return $res;
 }
}
 
// Add Flag management to the template scheme
$core->tpl->addBlock('AttachmentsLimited',
    array('dcLoadFoo','AttachmentsLimited'));
 
?>



Par rapport au template Attachments, j'ai juste ajouté la possibilité de limiter la taille de la liste en passant un paramètre size.
On peut alors modifier le fichier rss2.xml. En limitant la taille à 1 je n'ai plus de problème avec les balises <enclosure> en trop !

<tpl:AttachmentsLimited size="1">
  <enclosure url="{{tpl:AttachmentURL}}"
      length="{{tpl:AttachmentSize full="1"}}" type="{{tpl:AttachmentMimeType}}" />
</tpl:AttachmentsLimited>