Petit lecteur de rss sans prétention ...

0/5 (3 avis)

Snippet vu 7 969 fois - Téléchargée 21 fois

Contenu du snippet

Salut à tous,
Je poste juste cette petite classe de lecture de flux RSS sans prétention. Elle est sans prétention dans le sens ou elle n'est pas très fiable (si par exemple le flux est mal écrit ou si l'URL du flux est fausse, et bah ... Je ne sais pas ce qui va se passer !). Mais par contre, son point fort est qu'elle est complémètement orientée objet et ainsi très simple à faire évoluer (par exemple, la faire évoluer pour qu'elle puisse aussi écrire et générer les flux ...).

Source / Exemple :


<?php
/* -------------------- */
   function utf2iso($string, $quotes = ENT_COMPAT, $slashesstriping = TRUE, $nl2brshape = TRUE)
   {
      if ($slashesstriping)
         $string = stripslashes($string);
      
      // Contrôle le charset réel (UTF-8 -> ISO-8859-15)
      $first = (!preg_match('`é`i', mb_convert_encoding($string.'é', 'UTF-8', 'ISO-8859-15'))) ? 'UTF-8, ISO-8859-15' : 'ISO-8859-15, UTF-8';
      
      // Teste s'il y a besoin d'une transformation (Optimisation)
      if (!mb_check_encoding($string,'ASCII'))
         $string = htmlentities(strip_tags($string), $quotes, mb_detect_encoding($string,$first) );

      // Convertit les \r\n
      return ($nl2brshape) ? nl2br($string) : strtr($string,chr(10).chr(13),'');
}
/* -------------------- */
   function getTextFromNode($node)
   {
      if($node -> nodeType == 3)
      {
         $text = $node -> wholeText;
      }
      else
      {
         $childs = $node -> childNodes;
         for($i = 0; $i < $childs -> length; $i++)
         {
            $child = $childs -> item($i);
            $text .= getTextFromNode($child);
         }
      }
      return $text;
   }
/* -------------------- */
   class RssReader
   {
      private $Path = '';
      private $Content = '';
      
      private $Channels = array();
      
      public function __construct($path)
      {
         
         $this -> Path = $path;
         $this -> loadRss();
         $this -> parse();
      }
      
      private function loadRss()
      {
         $path = $this -> Path;
         if(!@$handle = fopen($path, 'r'))
            throw new Exception("Le fichier $path n'existe pas ! ");
            
         $content = &$this -> Content;
         while (!feof($handle))
         {
            $content .= fgets($handle);
         }
         
         fclose($handle);
      }
      
      private function parse()
      {
         $content = $this -> Content;
         
         $xml = new DOMDocument();
         $xml -> loadXml($content);
         
         $this -> Content = '';
         
         $rss = $xml -> getElementsByTagName('rss') -> item(0);
         
         $xml_channels = $xml -> getElementsByTagName('channel');
         
         for($i = 0; $i < $xml_channels -> length; $i++)
         {
            $xml_channel = $xml_channels -> item($i);
            
            $title = utf2iso(getTextFromNode($xml_channel -> getElementsByTagName('title') -> item(0)));
            $link = utf2iso(getTextFromNode($xml_channel -> getElementsByTagName('link') -> item(0)));
            $description = utf2iso(getTextFromNode($xml_channel -> getElementsByTagName('description') -> item(0)));
            
            $channel = new RssChannel($title, $link, $description);
            
            $xml_items = $xml_channel -> getElementsByTagName('item');
            
            for($j = 0; $j < $xml_items -> length; $j++)
            {
               $xml_item = $xml_items -> item($j);
               
               $title = utf2iso(getTextFromNode($xml_item -> getElementsByTagName('title') -> item(0)));
               $link = utf2iso(getTextFromNode($xml_item -> getElementsByTagName('link') -> item(0)));
               
               //echo '<pre>'.$link.'</pre>';
               
               $description = utf2iso(getTextFromNode($xml_item -> getElementsByTagName('description') -> item(0)));
               
               $item = new RssItem($title, $link, $description);
               
               $channel -> addItem($item);
               
            }
            
            $this -> addChannel($channel);  
         }
      }
      
      public function addChannel($channel)
      {
         $channels = &$this -> Channels;
         array_push($channels, $channel);
      }
      
      public function getChannelByNumber($i)
      {
         return $this -> Channels[$i];
      }
      
      public function getNumberOfChannels()
      {
         return count($this -> Channels);
      }
   }
/* -------------------- */
   class RssChannel
   {
      private $Title = '';
      private $Link = '#';
      private $Description = '';
      
      private $Items = array();  
      
      public function __construct($title, $link, $description)
      {
         $this -> Title = $title;
         $this -> Link = ((substr($link, 0, 7) == 'http://') ? '' : 'http://').$link;
         $this -> Description = $description;
         
         /*echo '<pre>';
         echo strip_tags($description);
         echo '</pre>';*/
      } 
      
      public function getTitle()
      {
         return $this -> Title;
      }
      
      public function getLink()
      {
         return $this -> Link;
      }
      
      public function getDescription()
      {
         return $this -> Description;
      }
      
      public function addItem($item)
      {
         $items = &$this -> Items;
         array_push($items, $item);
      }
      
      public function getNumberOfItems()
      {
         return count($this -> Items);
      }
      
      public function getItemByNumber($i)
      {
         return $this -> Items[$i];
      }
   }

/* -------------------- */
   class RssItem
   {
      private $Title = '';
      private $Link = '';
      private $Description = '';
      
      public function __construct($title, $link, $description)
      {
         $this -> Title = $title;
         $this -> Link = ((substr($link, 0, 7) == 'http://') ? '' : 'http://').$link;
         $this -> Description = $description;
      }
      
      public function getTitle()
      {
         return $this -> Title;
      }
      
      public function getLink()
      {
         return $this -> Link;
      }
      
      public function getDescription()
      {
         return strip_tags($this -> Description);
      }
   }
/* -------------------- */
?>

Conclusion :


Voilà ... Je sais que ce n'est pas très commenté, mais franchement, ce n'est pas difficile à comprendre. Si vous avez des questions, remarques, etc., n'hésitez pas !
++ !
L.S.

A voir également

Ajouter un commentaire Commentaires
opossum_farceur
Messages postés
147
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
14 novembre 2009

7 juin 2007 à 19:19
Bravo pour ce code très clean, très clair : un modèle de POO.
- Un petit bémol, cependant, certain fichiers ne sont pas correctement traités, exemple :
http://www.dicodunet.com/definitions.xml
- Un deuxième petit bémol, c'est l'aspect inachevé du script, une petite démo n'aurait pas fait de mal, et tu aurais eu davantage de retours, souvent utiles pour faire évoluer un script.
- Une question : l'emploi de la récursivité est-il vraiment nécessaire, pour parcourir un arbre dont on connait à l'avance la structure?
- A l'intention des novices en matière de DOM, un tuto utile à potasser :
Gestion du XML en PHP 5 : utiliser DOM (http://eusebius.developpez.com/php5dom/)

Amicalement.
LocalStone
Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009

5 juin 2007 à 16:19
Je pense que tu t'es trompé de source, là ...
gwadarepresent
Messages postés
4
Date d'inscription
samedi 16 septembre 2006
Statut
Membre
Dernière intervention
28 octobre 2007

5 juin 2007 à 12:29
Slt, pas mal le générateur de CSS,
Mais il y a un pti beug, en fait, tu propose de renommer le préfixe des tables de ton éditeur RSS, mais ton script PHP ne les renommes pas, et les crè avec le préfixe par défaut "rsseditor_" en revanche, il est renommé dans ton script, donc biensure, le message d'erreur est retourné :
Table 'base.RSS_config' doesn't exist

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.