I. Principe général▲
I-A. 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-B. 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" ?>
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 chaine d'un format à l'autre.
- Channel : à 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 représente 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 commentaires 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-C. 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-D. Lecteurs de flux▲
Voici quelques-uns des nombreux lecteurs de flux RSS disponibles :
- Multiplateformes : extension Sage pour Firefox, Lektora ;
- Windows : RSS Xpress, Yoono, Feedreader ;
- Linux : Liferea (Gnome), Akregator (KDE) ;
- Mac : NetNewsWire, Apple Safari.
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 chaine 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 cinq 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();
?>
Et voilà, 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-A. 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
;
}
}
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-B. Affichage des informations▲
On va parcourir le tableau obtenu $rss, et pour chaque item $tab, afficher les informations.
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 deux scripts selon ses besoins et selon les informations qu'il désire offrir dans son flux RSS. À 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 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.