Fantomas’side

Weblog open-source

Génération de flux RSS en PHP

RSS pour Really Simple Syndication, est une des récentes technologies qui popularisent le web 2.0. Le format RSS est un flux de données XML regroupant diverses informations sur des ressources accessibles depuis le réseau.

Dans le cas d'un site d'actualités, les flux RSS du site regrouperont les nouveaux articles publiés et les commentaires récents qui permettront aux utilisateurs de voir l'évolution du site sans avoir besoin de s'y connecter en permanence.

Générer un flux RSS 2.0 à l'heure actuelle peut rester facile pour n'importe quel développeur. Cependant, générer de multiples flux devient vite une tâche fastidieuse. J'ai donc décidé d'écrire un jeu de classes PHP, pour me simplifier la production de flux de type RSS.

Un exemple concret de construction de flux à partir de ces classes vous montrera la marche à suivre. Notre exemple se base sur le listage d'un répertoire distant, à travers un flux RSS.

<?php
include('myrss.class.php');

$rss = new RSS('Contenu du répertoire', 'http://url.du.repertoire', 'Description du répertoire');

if ($handle = opendir('.')) {
  while (false !== ($file = readdir($handle)))
    if ($file != "." && $file != "..") {
      $file_info = stat($file);
      $desc = is_dir($file) ? 'Dossier créé ' : 'Fichier de '.round(
      $file_info['size'] / (1024 * 1024), 2).' Mo';
      $desc .= strftime('le %A %d/%m/%Y à %H:%M:%S', $file_info['atime']);
      $date = strftime('%D');
      // Remplissage du flux
      $item = new Item($file, 'http://url.du.repertoire/'.$file, $desc, $date);
      $rss->add($item);
    }
  closedir($handle);
}
print $rss->publish();
?>

Et voilà comment en moins de 20 lignes de codes on construit notre flux. Le travail du développeur se concentre sur la création des données à afficher, et non sur la gestion du format en lui même.

La création du flux se fait l'instanciation de la classe RSS prenant en paramètres comme indiqué dans l'exemple, un titre, une url, une description, et éventuellement la locale du flux, pratique pour la gestion des dates de publication.

Les éléments constituant le flux, se crées dans la classe Item. Elle se compose aussi d'un titre, d'une url, d'une description, et optionnellement d'une date de création. Une fois l'instance de d'Item créée, on l'ajoute dans notre objet RSS par la méthode add. Une fois tous les éléments ajoutés dans l'objet RSS, on affiche le retour de la méthode publish.

Et voila le tour est joué !

Maintenant on pourrait aussi créer un service générique qui regroupe plusieurs type de flux. Pour cela, on va utiliser la class Service décrite dans un article précèdent. Notre service regroupera 2 fonctions, les derniers articles, et les derniers commentaires. Les requêtes en base de donnée, seront fictives, mais illustreront la démonstration.

< ?php
include('myrss.class.php');
include('mysqlDB.class.php');
include('service.class.php');

class RSSFeedService extends Service{
  var $db;
  var $rss;
  var $site_url;
  var $site_name;

  function RSSFeedService($source='articles') {
    parent::Service($source);
    $this->site_name = 'Mon site';
    $this->site_url  = 'http://mon.site.com';

    //Connecteur de base de donnée
    $this->db = new mysqlDB('name', 'host',
     'user', 'password');
    if ($this->run())
      print $this->rss->publish();
  }
  // Commentaires
  function comments() {
    $this->rss = new RSS('Commentaires '.$this->site_name, $this->site_url, 'Derniers commentaires sur '.$this->site_name);
$this->db->query('SELECT id, posted_on, comment, user_id, username, titre, titre_url FROM comments'); while ($this->db->data()) { $item = new Item(date_fr($this->db->elem['posted_on']).' par '. $this->db->elem['username'].' ('.$this->db->elem['titre'].')', $this->site_url.'/articles/'.$this->db->elem['titre_url'].'.html', $this->db->elem['comment'], date('r', $this->db->elem['posted_on'])); $this->rss->add($item); } } function articles() { $this->rss = new RSS('Articles '.$this->site_name, $this->site_url, 'Derniers articles sur '.$this->site_name); $this->db->query('SELECT id, titre, titre_url, text, time FROM articles'); while ($this->db->data()) { $item = new Item(cleanText($this->db->elem['titre']), $this->site_url.'/articles/'.$this->db->elem['titre_url'].'.html', $this->db->elem['text'], date('r', $this->db->elem['time'])); $this->rss->add($item); } } } new RSSFeedService($_GET['type']); ?>

L'instanciation de notre Service RSS avec un paramètre passé dans l'url, suffit à générer le flux. Chaques flux sera une méthode de la class RSSFeedService. Simple et rapide a implémenter, le travail est facilité pour la création des prochains flux. Que demander de plus ?

Le code de la classe peut-être : Rss.class.php