Dotclear : lire les flux rss/atom automatiquement depuis la liste des liens

Dotclear, le moteur qui fait tourner ce site est un outil magnifique que je ne cesse d'apprécier.  Je m'en sert sur ce blog, mais aussi pour le site départemental du MoDem06 pour lequel j'ai cherché le moyen de mettre en place un agrégateur des blogs militants.

Le problème portait sur la maintenance d'un tel système. En effet, dans la version précédente de l'agrégateur, chacun des flux RSS ou Atom était écrit en dur dans le source de la page de l'agrégateur, ce qui était loins d'être convivial. Je me suis dit qu'il serait préférable d'utiliser la gestion des liens incluse dans Dotclear pour tenir à jour la liste des flux. J'ai alors rencontré 2 problèmes :

  1. Avoir une page dédiée pour l'agrégateur
  2. Passer de manière dynamique les url des flux.

Voici les solutions que j'ai retenue :

Une page dédiée pour l'agrégateur

J'ai utilisé le plugins blogrollPage pour avoir une base déjà toute faite.

J'ai défini une catégorie de liens général qui est affichée avec les widgets sur la page d'accueil, et une catégorie spéciale pour la blogrollPage. Comme je n'affiche sur la page dédiée que les sites que je veux. Pour les flux RSS, je les copie dans le champs description du lien. Comme ces liens ne sont affichés que sur la page de l'agrégateur, ce n'est pas un problème.

Lecture des flux RSS ou Atom

Pour la lecture des flux, c'est facile, il suffit d'installer le plugins FeedEntries qui propose un ensemble de méthodes pour accéder aux fonctionnalités déjà incluses dans Dotclear pour la manipulation de flux RSS/Atom.

Adaptation des deux plugins

Une fois le modèle de la la blogrollPage personnalisé, j'ai rencontré le problème de passer à FeedEntries l'URL du flux que j'avais saisi dans la description du lien. En effet, les méthodes de base de FeedEntries attendent une URL en dur, pas une donnée dynamique issue d'une boucle.

Après avoir cherché un bon moment et voici la solution trouvée : j'ai modifié FeedEntries pour ajouter un nouveau paramètre "sourceName" dans lequel je peux mettre la chaine qui sera évaluée pour trouver dynamiquement la source.

Dans FeedEntry
public static function Feed($attr,$content)
{
$source = $attr['source'];
$sourceName = $attr['sourceName'];

if (!empty($source)) {
if (strpos($source,'/') === 0) {
$source = http::getHost().$source;
}

return
'feed = feedReader::quickParse("'.$source.'",DC_TPL_CACHE); '."\n".
'if ($_ctx->feed !== null) : ?>'."\n".
$content."\n".
'feed); '."\n".
'endif; ?>'."\n";
}
if (!empty($sourceName) && empty($source)) {
return
'feed = feedReader::quickParse($source,DC_TPL_CACHE); '."\n".
'if ($_ctx->feed !== null) : ?>'."\n".
$content."\n".
'feed); '."\n".
'endif; ?>'."\n";
}

return;
}

 

et donc pour la boucle de lecture dans le modèle de blogrollPage :
  <tpl:BlogrollPage>
<tpl:BlogrollPage:Links>
<h5>{{tpl:BlogrollPage:Link}}</h5>
<tpl:BlogrollPage:IfLinkDesc>
<tpl:Feed sourceName="$link['link_desc']">
<ul>
<tpl:FeedEntries lastn="4">
<li><a href="{{tpl:FeedEntryURL}}">{{tpl:FeedEntryTitle encode_html="1"}}</a></li>
</tpl:FeedEntries>
</ul>
</tpl:Feed>
</tpl:BlogrollPage:IfLinkDesc>
</tpl:BlogrollPage:Links>
</tpl:BlogrollPage>

Il y a sûrement une manière un peu plus élégante de faire, car utiliser un eval est un peu risqué, mais j'ai pas trouvé.

Le résultat est consultable sur www.mouvement-democrate06.org/index.php?blogroll/Militants

Partager Partager ce billet sur les réseaux sociaux

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet