Créer des flux RSS facilement et rapidement

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Créer des flux RSS facilement et rapidement

  • Par Emacs
  • 8 commentaires
  • 26436 lectures
  • RSS -  Atom

Ce tutoriel présente une manière simple, rapide et efficace de concevoir des flux RSS au moyen d'une classe PHP5. Afin de rendre ce cours moins théorique, nous partirons d'un exemple pratique et concret. Nous simulerons la génération d'un flux RSS d'un module d'actualités issues d'une base de données. Nous utiliserons une base de données MySQL mais il revient à vous de l'adapter à vos besoins si votre application repose sur un autre SGBDR.

Pré-requis de base

Pour cet exemple, nous estimerons que vous maîtrisez les bases essentielles suivantes :

  • Création d'une base / table de données
  • Utilisation de l'ordre SELECT de base
  • Connaissances minimales de la programmation orientée objet

La maîtrise des bases de la programmation orientée objet est essentielle pour suivre ce cours puisque tout reposera sur la manipulation d'objet. En effet, nous implémenterons un package de classes qui nous permettront de concevoir le flux RSS. N'allons pas trop vite et définissons d'abord ce qu'est un flux RSS.

Qu'est-ce-qu'un flux RSS ?

RSS est l'acronyme de « Really Simple Syndication ». Il s'agit d'un format standard d'échange de données reposant sur la technologie XML qui permet de structurer un contenu au moyen d'un balisage de l'information. Ainsi, cela permet de donner du sens au contenu syndiqué grâce aux balises XML adéquates mais également de pouvoir le stocker en brut et sans mise en forme particulière. L'avantage de ça est bien entendu de pouvoir le porter sur un support complètement différent que son support original.

Le package de classes RSSFeed - OpenSource

Tout notre flux RSS sera construit à partir d'un package de classes écrites en PHP5. Pourquoi donc utiliser de tels outils ? Il y'a plusieurs raisons à implémenter des objets pour construire notre flux.

La première et certainement la plus évidente est de se rendre complètement indépendant de la technologie XML. L'utilisation des objets RSSFeed et RSSFeedtem permettent d'abstraire complètement la couche XML. De ce fait, nous n'aurons pas à nous préoccupper de la syntaxe d'un fichier XML RSS.

Le seconde avantage concerne le code produit. En utilisant une approche orientée objet, le code PHP sera structuré et d'une longueur réduite. Si une maintenance évolutive est à prévoir dans le code, alors elle pourra être menée sans difficulté.

Notez au passage que cette API gère l'intégralité des balises que l'on peut trouver dans un flux RSS. Ainsi tous les types de flux RSS sont possibles, c'est-à-dire allant du plus minimaliste au plus complexe possible.

Construction du schéma de la base de données

Il est temps maintenant de s'intéresser au schéma de la base de données. Notre flux RSS final contiendra les informations des actualités présentes dans la base de données. Nous aurons donc besoin d'une table actualite dans laquelle nous enregistrerons chacune des news. Sa structure est définie ci-dessous.

Structure de la table " actualite "
CREATE TABLE IF NOT EXISTS actualite
(
id INT(7) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
categorie_id INT(4) NOT NULL,
titre VARCHAR(200) NOT NULL,
corps TEXT NOT NULL,
auteur VARCHAR(30) NOT NULL,
email VARCHAR(60),
creation DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
edition DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
publication TINYINT(1) DEFAULT 0
);
Structure de la table " categorie "
CREATE TABLE IF NOT EXISTS categorie
(
id INT(7) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
libelle VARCHAR(100) NOT NULL
);

Exécutez ces codes SQL dans votre utilitaire d'administration de base de données (PHPMyAdmin, MySQL Query Browser...) afin de créer les tables et remplissez les de quelques enregistrements. Vous aurez un jeu de données de test qui vous permettront de vérifier que le code fonctionne correctement.

La table categorie et actualite sont en relation grâce à la clé étrangère categorie_id qui pointe sur le champ id de la table categorie.

Passons à présent au code PHP de génération du flux RSS.

Programme PHP de génération du flux RSS

Présentation du fichier

Ce programme est extrêmement simple. Il suivra pas à pas l'algorithmique suivant :

  1. Connexion sur la base de données à partir d'un objet PDO
  2. Récupération des 10 dernières actualités publiées
  3. Instanciation d'un objet RSSFeed
  4. Enregistrement de chaque actualité dans le flux RSS
  5. Sauvegarde du flux sur le serveur web dans un fichier XML
  6. Affichage du flux XML sur la sortie standard

Tout le code du programme est commenté et vous disposez de la documentation complète de l'API RSSFeed pour vous aider (voir plus haut).

Fichier de configuration

Listing du fichier de configuration news-config.inc.php
<?php
/**
* Constantes d'accès à la base de données
* et de configuration des news
**/
// Adresse du serveur de base de données
define('DB_SERVEUR', 'localhost');
// Login
define('DB_LOGIN','root');
// Mot de passe
define('DB_PASSWORD','root');
// Nom de la base de données
define('DB_NOM','APTutoriels');
// Nom des tables utiles
define('DB_ACTUALITE_TABLE','actualite');
define('DB_CATEGORIE_TABLE','categorie');
// Driver correspondant à la BDD utilisée
define('DB_DSN','mysql:host='. DB_SERVEUR .';dbname='. DB_NOM);
// Nombre de news maximum par flux
define('MAX_NEWS_PAR_FLUX', 10);
// URL du site
define('URL_SITE','http://www.votresite.com');
// Informations du webmaster
define('WEBMASTER_NOM','John DOE');
define('WEBMASTER_EMAIL','johndoe@server.com');
?>

Programme principal

Listing du fichier rss-news.php
<?php
/**
* Programme principal
* Construit le flux RSS
***/
// Import du fichier de configuration
require(dirname(__FILE__).'/news-config.inc.php');
// Import de la classe RSSFeed
require(dirname(__FILE__).'/RSSFeed/RSSFeed.class.php');
/**
* Déclaration des variables globales
***/
// Objets de connexion et de manipulatin de la BDD
$oPDO = null;
$oPDOStatement = null;
// Objets de manipulation du fichier RSS
$oRssFeed = null;
$oRssItem = null;
// Tableau stockant les news issues de la bdd
$aDernieresNews = array();
// Variable stockant l'email issu de la BDD
$sEmail = '';
try
{
// Connexion sur la BDD
$oPDO = new PDO(DB_DSN, DB_LOGIN, DB_PASSWORD);
$oPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Récupération des dernières news valides
$oPDOStatement = $oPDO->query
(
"SELECT
actu.id,
actu.categorie_id,
actu.titre,
actu.corps,
actu.auteur,
actu.email,
actu.creation,
cat.libelle
FROM ". DB_ACTUALITE_TABLE ." AS actu,". DB_CATEGORIE_TABLE ." AS cat
WHERE
publication=1
AND
actu.categorie_id = cat.id
ORDER BY creation DESC LIMIT 0,". MAX_NEWS_PAR_FLUX
);
// Stockage des news dans un tableau
$aDernieresNews = $oPDOStatement->fetchAll(PDO::FETCH_OBJ);
// Fermeture de la connexion SQL
$oPDO = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
// A-t-on récupéré des enregistrements ?
if(sizeof($aDernieresNews)>0)
{
// Création des entêtes du flux RSS
$oRssFeed = new RSSFeed('utf-8');
$oRssFeed->setProtectString(true);
$oRssFeed->setTitle('Flux RSS des actualités');
$oRssFeed->setDescription('Les dernières actualités directement par flux RSS');
$oRssFeed->setLink(URL_SITE .'/'. basename(__FILE__));
$oRssFeed->setPubDate('2007-12-31');
$oRssFeed->setLastBuildDate(date('Y-m-d'));
$oRssFeed->setWebMaster(WEBMASTER_EMAIL,WEBMASTER_NOM);
$oRssFeed->setManagingEditor(WEBMASTER_EMAIL,WEBMASTER_NOM);
$oRssFeed->setCopyright('(C) Copyright 2007 - VotreSite.com - Tous droits réservés - reproduction interdite');
$oRssFeed->setGenerator('Powered with RSSFeed Class by Hugo "Emacs" HAMON - http://www.apprendre-php.com');
$oRssFeed->setLanguage('fr');
// Ajout des news au flux
foreach($aDernieresNews as $oNews)
{
// Récupération de l'email
$sEmail = $oNews->email;
$oRssItem = new RSSFeedItem();
$oRssItem->setTitle($oNews->titre);
$oRssItem->setDescription($oNews->corps);
$oRssItem->setLink(URL_SITE .'/news.php?id='. $oNews->id);
$oRssItem->setGuid(URL_SITE .'/news.php?id='. $oNews->id, true);
if(!empty($sEmail))
{
$oRssItem->setAuthor($sEmail, $oNews->auteur);
}
$oRssItem->setPubDate($oNews->creation);
$oRssFeed->appendItem($oRssItem);
$oRssItem = null;
}
// Sauvegarde du flux RSS
$oRssFeed->save('rss-news.xml');
// Affichage sur la sortie standard
header('Content-Type: text/xml; charset=utf-8');
$oRssFeed->display();
}
?>

Téléchargement et licence des sources

Les fichiers sources du programme sont disponibles en téléchargement libre. Vous pouvez les modifier et les commercialiser librement.

Conclusion

Nous venons d'étudier un cas concret de génération de flux RSS à partir d'une API capable d'abstraire totalement la syntaxe XML d'un document RSS. Libre à vous à présent d'étudier la documentation de l'API RSSFeed et de la déployer sur vos applications.



Les commentaires

1. Par Xireus le 31/12/2007 17:15

Excellent tuto, dans la continuité des autres ! bravo à toi et bonne année 2008.

2. Par Kud le 05/09/2008 13:47

Très bon tuto.

Cependant, un tuto avec le Framework Zend ne serait pas de refus.

3. Par Sylvain le 15/11/2008 13:56

Très bon tuto, classes très faciles à utiliser.

Juste une petite erreur dans le fichier RSSFeed.class.php, ligne 24
s/$_feddCloud/$_feedCloud.

Merci.

4. Par Emacs le 15/11/2008 21:12

Merci Sylvain pour la remontée du bug. Je l'avais corrigée mais visiblement pas uploadée. Je fais ça tout de suite

5. Par mike974 le 16/03/2009 18:17

Super tuto très clair
j'aurais une question (peut-être) très simple pour les spécialistes : je voudrais lancer la création automatique de ce flux à chaque changement dans ma base ... Comment faire ?
Merci de vos poistes !

6. Par syl le 28/04/2009 19:53

encore un tuto qui ne fonctionne pas !
ça sert à rien de faire quelque chose pour ensuite avoir une erreur à l'arrivée.
error line 26 in RSS-News/rss-news.php

7. Par Maureka le 27/05/2009 01:35

Très bon tuto! Cependant, je rencontre des bug avec ie7 et FF3. Par contre il fonctionne bien avec Safari 4 beta!

8. Par ML le 21/08/2009 09:46

Tuto de A à Z, c'est une très bonne initiative. Très clair.