Accueil Boite à Outils Syndication de contenu Syndication de contenu - Archives Un lecteur RSS pour votre site 1/2

Publié le : 28 janvier 2005
Imprimer Imprimer cet article

Auteur :
Alain Sichel

Alain Sichel
Un lecteur RSS pour votre site 1/2
Présentation d’un lecteur RSS utilisable par vos visiteurs

Cet article a été publié le 28 janvier 2005, il est actuellement dépassé et n’a plus qu’un intérêt "historique". Pour présenter un lecteur de fichiers de syndication sur votre site, je vous conseille plutôt de voir Lecteur RSS/Atom pour votre site 1/2 et 2/2.

Cet article fait suite à la présentation de La syndication de contenu RSS et de l’Utilisation de la classe easyRSS. Il propose de réaliser un lecteur permettant aux visiteurs d’afficher le fichier de syndication de leur choix [1].

Les choix pour ce lecteur

MagpieRSS est un lecteur permet la lecture de fichiers de syndication au format RSS 0.91, 1.0, 2.0 ou ATOM, il dispose également d’un système de cache, il sera le lecteur proposé par défaut.

Il m’a semblé utile d’avoir la possiblité d’utiliser EasyRSS [2], car bien qu’actuellement il se limite au format RSS 0.91, il donne parfois un meilleur résultat et accepte mieux que MagpieRSS quelques erreurs dans le code des fichiers.

J’ai souhaité un lecteur simple d’emploi pour le visiteur, avec simplement un formulaire pour saisir l’adresse du fichier de syndication à afficher et un bouton radio pour sélectionner le choix du script (MagpieRSS ou EasyRSS).

Je demande au script d’afficher le titre du site (avec un lien), le logo du site, les 20 derniers articles publiés (il ne présentera que ceux qui ont été trouvés si le fichier de syndication contient moins de 20 articles), et pour chaque article d’indiquer (si ces données sont disponibles) :
- la date de publication,
- l’auteur,
- le titre de l’article (avec lien),
- la catégorie de l’article,
- la description de l’article (pour simplifier l’affichage, les images sont supprimées).

Le code complet [3]

Voici le code de ce lecteur RSS à installer dans une de vos pages [4] :

<?php
if(($_POST["parseur"])=="magpie") {
require_once 'magpierss/rss_fetch.inc';
if(isset($_POST["adresse"])) {
$adresse = ($_POST["adresse"]);
if (preg_match("#^http://.([\w./-]+)$#i",$adresse,$ret)) {
$fichier_xml = $ret[0];
$nombre_element = 20;

$rss = fetch_rss($fichier_xml);

if(($rss -> channel['link'])=="") {echo '<a name="retour3"></a><p class="red">L\'analyse de '.$fichier_xml." ne permet pas d'afficher un fil de syndication. Faites un nouvel essai, en cas d'échec, voyez la note en bas de page<sup>[<a href=\"#note4\">4</a>]</sup>.</p><br />\n"; }

        else {
        echo '<table width="100%" border="0"><tr><td width="50%"><h4 align="center"><a href="'.$rss -> channel['link'].
                '" target="_blank">'.$rss -> channel['title']."</a></h4></td>\n<td>";
        if(isset($rss -> image['url'])) { echo "<center><a href=\"".$rss -> image['link'].'" target="_blank"><img src="'
                .$rss -> image['url'].'" width="'.$rss -> image['width'].'" height="'.$rss -> image['height'].'" border="0" alt="'
                .$rss -> image['title']."\"></a></center>"; }
        echo "</td></tr></table>\n<ul>\n";

if (is_array($rss->items))

   {
   $liste = array_slice($rss->items, 0, $nombre_element);
       
   foreach ($liste as $item ) {

       $title = $item[title];
                $url = $item[link];
       $pubdate = $item[pubdate];
                if ($item[pubdate]=="") {$pubdate = $item[date];}
                $author = $item[author];
       $category = $item[category];
                $description = $item[description];
                $avant = array ("'<img.*?>'si","'<p.*?>'si","'</p>'si","'&.*?;'si","'<br.*?>'si");
                $apres = array (" "," "," ","&.*?;"," ");
                $description = preg_replace($avant,$rapres,$description);
       $date = date("d/m/Y", strtotime($pubdate));
       echo "<li>";
                if ($pubdate!="") { echo '<b>'.$date.'&nbsp;:</b> '; }
                if ($author!="") { echo '<span class="vert">'.$author.'&nbsp;:</span> '; }
                echo '<a href="'.$url.'">'.$title."</a>";
                if ($category!="") { echo " <b>($category)</b>"; }
                if ($description!="") { echo '&nbsp;:<br />'.$description; }
                echo "</li>\n";
       }
        echo "</ul>\n";
   }
}
}
else {echo "<p class=\"red\">L'adresse indiquée n'est pas valide, essayez à nouveau&nbsp;:</p>\n<br />";}
}
}
if(($_POST["parseur"])=="easy") {
include('easyrss/easyRSS.inc.php');
if(isset($_POST["adresse"])) {
$url = ($_POST["adresse"]);
if (preg_match("#^http://.([\w./-]+)$#i",$adresse,$ret)) {
$fil = $ret[0];

$rss = new easyRSS();
$rss -> parsefile($fil, 20);

if ($rss -> exist_image()) {
        echo '<table width="100%" border="0"><tr><td width="50%"><h4 align="center"><a href="'.$rss -> get_channel_link().
                '" target="_blank">'.$rss -> get_channel_title()."</a></h4></td>\n<td><center><a href=\""
                .$rss -> get_image_link().'" target="_blank"><img src="'.$rss -> get_image_url().
                '" width="'.$rss -> get_image_width().'" height="'.$rss -> get_image_height().'" border="0" alt="'
                .$rss -> get_image_title()."\"></a></center></td></tr></table>\n"; }
else { echo '<h4 align="center"><a href="'.$rss -> get_channel_link().'" target="_blank" title="Lien externe">'.$rss -> get_channel_title()."</a></h4>\n"; }

// nombre d'items    
$nbnews = $rss -> get_num_items();
$news_title = $rss -> get_items_title();
$news_link = $rss -> get_items_link();

if($nbnews==0) {echo "<p class=\"red\">L'analyse du fichier ".$fil." ne permet pas d'afficher un fil de syndication. Il ne s'agit pas d'un fichier au format RSS 0.91 ou il contient des erreurs.</p><br />\n"; }
else {
// récupération de l'auteur des articles
$news_author = $rss -> get_items_author();

// récupération des descriptions des articles
$news_description = $rss -> get_items_description();

// on remplace les caractères &lt; et &gt; par < et > ainsi que &quot; par
$search = array ("/&lt;/","/&gt;/","/&quot;/");
$replace = array ('<','>','"');
$news_description=preg_replace($search,$replace,$news_description);

// on redonne un code d'affichage correct à certains caractères spéciaux

// si on supprime les images
$avant = array ("'<img.*?>'si","'<p.*?>'si","'</p>'si","'&.*?;'si","'<br.*?>'si");
$apres = array (" "," "," ","&.*?;"," ");

// si on ne les supprime pas
/** $avant = array ("'<p.*?>'si","'</p>'si","'&.*?;'si");
$apres = array (" "," ","&.*?;"); **/

$news_description = preg_replace($avant,$rapres,$news_description);
$news_date = $rss -> get_items_date();
echo "\n<ul>\n";

for($i = 1; $i <= $nbnews; $i++) { $date[$i]=strftime("%d/%m/%Y", strtotime($news_date[$i]));
        echo '<li>';
        if ($news_date[$i]!="") { echo '<b>'.$date[$i].'&nbsp;:</b> '; }
        if ($news_author[$i]!="") { echo '<span class="vert">'.$news_author[$i].'&nbsp;:</span> '; }
        echo '<a href="'.$news_link[$i].'" target="_blank">'.$news_title[$i].'</a>';
        if ($news_description[$i]!="") { echo "&nbsp;:<br />\n".$news_description[$i]; }
        echo "</li>\n";
}

echo "</ul>";
   
if($rss -> exist_textinput()) {
        echo '<form  method="get" action="'.$rss -> get_textinput_link().'">'.
                $rss -> get_textinput_description().'&nbsp;
                <input type="text" name="'.$rss -> get_textinput_name().
                '"size="10" maxlength="10">&nbsp;<input type="submit" name="Submit"
                value="'.$rss -> get_textinput_title().'">
                </form>'; }
}
}
else {echo "<p class=\"red\">L'adresse indiquée n'est pas valide, essayez à nouveau&nbsp;:</p>\n<br />";}
}
}
?>
<br /><form action="<?=$PHP_SELF ?>" method="post"><center>
     <table border="1" cellspacing="0" cellpadding="10">
       <tr class="unite">
         <td colspan="2">Adresse du fichier de syndication&nbsp;:
         <input type="text" name="adresse" size="50" value="<? if(isset($_POST["adresse"])) {echo $fichier_xml;
          $nouv="<p>Pour lire un nouveau fichier de syndication, tapez son adresse ci-dessus.</p>";}
          else {echo "Accès clavier touche ,";} ?>" onfocus="this.value='http://'" accesskey="," /></td>
         </tr>
       <tr class="unite">
         <td><center><input type="radio" name="parseur" value="magpie" <? if(($_POST["parseur"])!="easy") {echo 'checked="checked"';} ?> /> MagpieRSS<sup>[<a href="#note2">2</a>]</sup>&nbsp;
         <input type="radio" name="parseur" value="easy" <? if(($_POST["parseur"])=="easy") {echo 'checked="checked"';} ?> /> EasyRSS<sup>[<a href="#note3">3</a>]</sup>
         </center></td>
          <td><center><input type="submit" name="Submit" value="Envoi" alt="Envoi" title="Envoi" /></center></td>
         </tr>
       </table></center></form><? echo $nouv ?>

Avec en plus en bas de page les notes :

<a name="note1"></a><p>[<a href="#retour1">1</a>] Pour plus d'explications, voir la page <a href="http://www.cyes.info/aide/syndication.php">Syndication de contenu</a>.<br />
L'affichage de cette page est différent selon les informations disponibles dans le fichier de syndication&nbsp;:<br />

&nbsp;&nbsp;- l'image du logo du site n'est parfois pas présente,<br />
&nbsp;&nbsp;- certains sites n'indiquent pas toujours la date de publication, l'auteur et la description de l'article.</p>

<a name="note2"></a><p>[<a href="#retour2">2</a>] <a href="http://magpierss.sourceforge.net/" target="_blank">MagpieRSS</a> permet la lecture de fichiers de syndication au format RSS 0.91,  1.0, 2.0 ou ATOM.</p>
<a name="note3"></a><p>[<a href="#retour3">3</a>] EasyRSS affiche mieux certains caractères accentués que MagpieRSS, mais il ne dispose pas de cache et ne reconnait que le format RSS 0.91. Pour plus d'informations, voir <a href="http://www.phpspirit.com/" target="_blank">PHPSPIRIT</a> et <a href="http://www.mmt-fr.org/article114.html" target="_blank">Utilisation de la classe easyRSS</a>.</p>
<a name="note4"></a><p>[<a href="#retour4">4</a>] En cas de difficulté, il est possible que le fichier ne soit pas conforme. Pour le vérifier, voyez <a href="http://feedvalidator.org/" target="_blank">Feed Validator</a> ou <a href="http://rss.scripting.com/" target="_blank">RSS Validator</a>.<br />
Vous pouvez également essayer de lire ce fichier avec easyRSS qui accepte mieux certaines erreurs.</p>

Ce script est simple à mettre en œuvre, il est prêt à fonctionner, à condition de ne pas oublier :

- qu’il s’agit d’une page PHP [3],
- le code indiqué suppose que la page est à la racine de votre site [5],
- les dossiers magpierss et easyrss doivent être placés à la racine du site (attention aux noms de ces répertoires et aux caractères minuscules) [6].

Voilà, vous avez tout pour que cela fonctionne, maintenant, si vous voulez savoir comment çà fonctionne et comment l’adapter à vos choix personnels de présentation, cela mérite un second article.


 

 

[1] Ce script a été mis au point pour le site du CYES, il peut être testé sur la page Lecteur RSS. La page choix techniques présente aux webmestres les différentes techniques mises en œuvre pour ce site.

[2] Voir l’article Utilisation de la classe easyRSS qui permet de télécharger les fichiers de la version 1.3 modifiés comme indiqué dans l’article.

[3] Ce script a été modifié le 1/04/05 afin d’éviter l’affichage d’espaces insécables &nbsp; dans le champ "Description".

[4] Bien sûr, pour que ce script fonctionne il faut le mettre sur une page avec l’extension .php ou .php3, elle-même placée sur un serveur interprétant le PHP.

[5] Sinon, il faut modifier les liens vers les dossiers magpierss et easyrss.

[6] Comme indiqué plus haut, ces scripts peuvent être téléchargés librement :
- pour MagpieRSS sur SourceForge,
- pour EasyRSS sur Utilisation de la classe easyRSS.


Document joint à l'article

Télécharger le script

Cliquez ici pour réagir à cet article

Imprimer Imprimer cet article


Réactions à l'article :