Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
FORUM XML FAQ XML TUTORIELS XML SOURCES XML LIVRES XML

Création et lecture de flux RSS 2.0 en PHP

Date de publication : 01/02/2006 , Date de mise à jour : 05/02/2006

Par Pierre Ricadat (ghostdogpr)
 

Le but de cet article est de montrer l'utilisation possible des flux RSS à travers 2 exemples concrets : la création d'un fichier RSS à partir d'une base de données mySQL contenant des news, et l'affichage mis en forme du contenu d'un fichier RSS, cela grâce à PHP.

I. Principe général
I-1. Objet de l'article
I-2. RSS 2.0
I-3. Lier une page
I-4. Lecteurs de flux
II. Création d'un flux RSS à partir d'une base de données mySQL
III. Affichage du contenu d'un flux RSS
III-1. Lecture du fichier XML
III-2. Affichage des informations
IV. Améliorations
V. Téléchargements


I. Principe général


I-1. Objet de l'article

Un flux RSS ou fil RSS ("RSS Feed" en anglais) est un format de syndication de contenu Web.
C'est un fichier XML dynamique dont votre lecteur RSS affiche le contenu qui est mis à jour en permanence.
Posséder un flux RSS sur votre site permettra aux visiteurs intéressés d'être informés dès qu'il y aura du nouveau.

Le but de cet article est de montrer l'utilisation possible des flux RSS à travers 2 exemples concrets : la création d'un fichier RSS à partir d'une base de données mySQL contenant des news, et l'affichage mis en forme du contenu d'un fichier RSS, cela grâce à PHP.


I-2. RSS 2.0

Je présente ici uniquement les principales composantes d'un fichier RSS 2.0.

  • En-tête : Tous les fichiers RSS doivent être conformes à la spécification XML 1.0. On spécifie également le jeu de caractères à utiliser. Pour un site en français, on utilise généralement ISO-8859-1, qui permet de coder les langues d'Europe occidentale et donc accepte les lettres et accents que nous utilisons. Il existe également ISO-8859-15, qui contient des symboles plus récents dont notamment le signe €. UTF-8 et UTF-16 utilisent le standard Unicode et permettent de représenter des milliers de caractères de toutes sortes de langues, dont bien sur les caractères spécifiques français.
<?xml version="1.0" encoding="iso-8859-1" ?>
warning Attention : si l'on construit le fichier XML à partir d'une base de données, l'encodage utilisé doit respecter l'encodage de la base (si l'on passe d'une base en ISO à un XML en UTF, les accents vont générer des erreurs). On peut utiliser des fonctions PHP comme utf8_encode() et utf8_decode() pour convertir une chaîne d'un format à l'autre.
  • Channel : A la racine du document RSS, on trouve un élément <rss>, avec un attribut obligatoire "version", qui spécifie la version de RSS à laquelle le document est conforme. Ensuite, on trouve un élément unique <channel>, qui contient des informations à propos du channel (métadonnées) et de ses contenus.
<rss version="2.0">
	<channel>
		<title>Titre du channel</title> 
		<link>http://www.monsite.com</link>
		<description>Description du channel</description>

		items...

	</channel>
</rss>
Liste de tous les éléments pouvant se trouver dans la balise <channel>
Balise Description
title Titre du channel
link URL du site contenant le channel
description Description du channel
language Langue du channel
copyright Info sur le copyright du channel
managingEditor Mail de la personne responsable du contenu
webMaster Mail du webmaster
pubDate Date de publication
lastBuildDate Date de la dernière publication
category Catégorie à laquelle le channel appartient
generator Programme utilisé pour générer le channel
docs Lien vers la documentation du format utilisé dans le fichier RSS
cloud Permet à un programme de s'enregistrer pour être notifié des modifications de ce channel
ttl Time to live, avant le prochain rafraîchissement
image Image affichée avec le channel
rating note PICS
textInput Ajouter une zone de saisie de texte
skipHours Heures que les agrégateurs peuvent ignorer
skipDays Jours que les agrégateurs peuvent ignorer
  • Items : Un channel peut contenir n'importe quel nombre d'items. Chaque item répresente un article, une news et peut posséder notamment un titre, une description, un lien vers l'article en question et une date de publication.
<item>
	<title>Titre de la news</title> 
	<link>http://www.monsite.com/news.php?id=3</link> 
	<description>Description de la news</description> 
	<pubDate>Mon, 19 Dec 2005 12:00:00 GMT</pubDate>
</item>
Liste de tous les éléments pouvant se trouver dans la balise <item>
Balise Description
title Titre de l'item
link URL de l'item
description Description de l'item
author Mail de l'auteur de l'item
category Catégorie à laquelle l'item appartient
comments Lien vers une page de ccommentaires sur l'item
enclosure Objet media attaché à l'item
guid Texte qui identifie de manière unique cet item
pubDate Date de publication
source Channel auquel l'item appartient

I-3. Lier une page

Pour lier une page à votre flux RSS, il suffit d'ajouter ceci entre les balises <head></head> de votre page :
<link rel="alternate" type="application/rss+xml" href="http://www.monsite.com/flux.xml" />

I-4. Lecteurs de flux

Voici quelques-uns des nombreux lecteurs de flux RSS disponibles :


II. Création d'un flux RSS à partir d'une base de données mySQL

On suppose que les news sont stockées dans une base de données mySQL contenant pour chaque news les champs suivants : titre, lien, description et date.

Tout d'abord on crée une chaîne de caractères qui va contenir le contenu du fichier XML, dans laquelle on écrit la balise d'en-tête, ainsi que les informations sur le channel.
<?php

// édition du début du fichier XML
$xml = '<?xml version="1.0" encoding="iso-8859-1"?><rss version="2.0">';
$xml .= '<channel>'; 
$xml .= '<title>Titre du channel</title>';
$xml .= '<link>http://www.monsite.com</link>';
$xml .= '<description>Description du channel</description>';
On se connecte à la base en utilisant les variables $host, $pwd et $base préalablement définies. Puis on sélectionne les 5 dernières news triées par date de la plus récente à la plus vieille.
// connexion a la base
@mysql_connect($host,$user,$pwd) or die("Connexion impossible");
@mysql_select_db($base) or die("Echec de selection de la base");

// selection des 5 dernieres news
$res=mysql_query("SELECT * FROM news ORDER BY date DESC LIMIT, 5");
On récupère les valeurs de chacun des champs, puis on les ajoute au contenu du fichier, entourées des balises XML correspondantes.
// extraction des informations et ajout au contenu
while($tab=mysql_fetch_array($res)){   
	$titre=$tab[titre];
	$lien=$tab[lien];
	$description=$tab[description];
	$date=$tab[date];
	$date2=date("D, d M Y H:i:s", strtotime($date));

	$xml .= '<item>';
	$xml .= '<title>'.$titre.'</title>';
	$xml .= '<link>'.$lien.'</link>';
	$xml .= '<pubDate>'.$date2.' GMT</pubDate>'; 
	$xml .= '<description>'.$description.'</description>';
	$xml .= '</item>';	
}
Puis on ajoute les balises de fermeture du channel et du RSS. Enfin on ouvre le fichier en écriture et on y copie le contenu de la variable $xml.
// édition de la fin du fichier XML
$xml .= '</channel>';
$xml .= '</rss>';

// écriture dans le fichier
$fp = fopen("flux.xml", 'w+');
fputs($fp, $xml);
fclose($fp);
@mysql_close();

?>
idea Et voila, notre flux RSS est créé. On peut par exemple exécuter ce script à chaque fois qu'une news est ajoutée dans la base de données, pour que le flux soit mis à jour en même temps.

III. Affichage du contenu d'un flux RSS


III-1. Lecture du fichier XML

On va créer une fonction qui parcourt le fichier XML à la recherche des objets donnés en paramètre (les composants de chaque item). Cette fonction retourne un tableau contenant les valeurs de ces composants pour chaque item.
function lit_rss($fichier,$objets) {

	// on lit tout le fichier
	if($chaine = @implode("",@file($fichier))) {

		// on découpe la chaine obtenue en items
		$tmp = preg_split("/<\/?"."item".">/",$chaine);

		// pour chaque item
		for($i=1;$i<sizeof($tmp)-1;$i+=2)

			// on lit chaque objet de l'item
			foreach($objets as $objet) {

				// on découpe la chaine pour obtenir le contenu de l'objet
				$tmp2 = preg_split("/<\/?".$objet.">/",$tmp[$i]);

				// on ajoute le contenu de l'objet au tableau resultat
				$resultat[$i-1][] = @$tmp2[1];
			}

		// on retourne le tableau resultat
		return $resultat;
	}
}
idea Ainsi le simple appel ci-dessous renverra un tableau contenant, pour chaque item, les valeurs des champs "title","link","description" et "pubDate".
$rss = lit_rss("flux.xml",array("title","link","description","pubDate"));

III-2. Affichage des informations

On va parcourir le tableau obtenu $rss, et pour chaque item $tab, afficher les informations.
foreach($rss as $tab) {
  echo '<div class="news_box">
           <div class="news_box_title">'.$tab[0].'</div>
           <div class="news_box_date">posté le '.date("d/m/Y",strtotime($tab[3])).'</div>
           '.$tab[2].' <a href="'.$tab[1].'">Lire tout l\'article</a>
        </div>';
}
info Visionner le résultat

IV. Améliorations

De nombreuses améliorations sont bien évidemment possibles : on peut ajouter des éléments dans chaque item, changer la CSS ou encore l'affichage des données.
Il convient à chacun d'adapter ces 2 scripts selon ses besoins et selon les informations qu'il désire offrir dans son flux RSS. A noter qu'en PHP5, grâce au module SimpleXML, il suffit de charger le fichier XML et on peut accéder encore plus facilement aux informations (voir fr http://php.net/simplexml) L'exemple précédent devient beaucoup plus simple :
<?php 
$rss = simplexml_load_file('flux.xml'); 
foreach ($rss->channel->item as $item) { 
  echo '<div class="news_box">
           <div class="news_box_title">'.$item->title.'</div>
           <div class="news_box_date">posté le '.date("d/m/Y",strtotime($item->pubDate)).'</div>
           '.$item->description.' <a href="'.$item->link.'">Lire tout l\'article</a>
        </div>';
} 
?>

V. Téléchargements

Télécharger les fichiers exemples :

Je remercie grandement l'équipe XML et notamment GrandFather pour son aide précieuse. Merci aussi à khayyam90 pour la relecture et les conseils.



Valid XHTML 1.1!Valid CSS!

Copyright © 2006 Pierre Ricadat. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsables bénévoles de la rubrique XML : Grégory Dumas et Mathieu Lemoine - Contacter par EMail :
Vos questions techniques : forum d'entraide XML - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.