Académique Documents
Professionnel Documents
Culture Documents
com/informatique/tutoriels/domxml-flux-rss-de-news)
Vous voulez créer votre propre flux RSS de news pour votre site ?
Vous voulez utiliser une librairie (lib) XML pour avoir un code plus joli, plus propre, mais vous ne
trouvez aucun tutoriel à ce sujet sur Google ?
<channel>, appelée « node » dans la lib XML. C'est le node root de <description> ;
La balise <channel> est elle-même un child de <rss>. Et ceci est récursivement valable pour
toutes les balises. ;)
C'est la base d'un fichier XML pouvant être lu par un lecteur de flux RSS. Bien sûr, vous pouvez ajouter
des éléments.
À présent, étudions la structure d'un élément (dans notre cas, une news) qui est à mettre entre les
balises <channel></channel> du fichier XML vu précédemment. ;)
<item>
<title>Titre de la news</title>
<link>Lien vers la news en entier</link>
<description>Description de la news, le mieux étant de mettre le conte
nu de la news</description>
<comments>Un lien vers des commentaires de news</comments>
<author>Auteur de la news</author>
<pubDate>Date de publication de la news</pubDate>
<guid>Texte qui identifie de manière unique la news, le mieux étant de
mettre le titre de la news</guid>
<source>Source dont est tirée la news</source>
</item>
Quelques explications s’imposent. Le nœud item va correspondre à une news dans la liste des news
du fichier XML, c'est-à-dire qu'une fois votre fichier XML construit, vous aurez sans doute quelque
chose ressemblant à ceci :
<item>
<!-- Titre, lien, etc. de la première news -->
</item>
<item>
<!-- Titre, lien, etc. de la deuxième news -->
</item>
<item>
<!-- etc. -->
</item>
Voilà, cette structure vous permettra d'obtenir un flux RSS assez complet ; bien sûr, vous pouvez
ajouter encore plus de choses. ;)
:
Récupérer les news
Une fois que l'on connaît la manière dont doit être construit le document XML, il est temps de savoir
comment récupérer le contenu qu'il faut y insérer. :D
Tout d'abord, jetons un œil à la structure de la table news servant de modèle pour ce tuto.
Cette table n'a rien d'exceptionnel ; si vous ne la comprenez pas, c’est que vous n'avez pas suivi les
cours de M@teo correctement. :-°
Intéressons-nous à la requête destinée à sélectionner les di!érents éléments.
<?php
mysql_connect("localhost", "root", "mdp");
mysql_select_db("nom_bdd");
Ici, on sélectionne les dix dernières news. Libre à vous de modifier cette valeur.
Et voilà. Ces quelques lignes de code ne devraient pas vous surprendre si vous avez lu le tuto depuis
le début. :)
Il ne vous reste plus qu'à vous souvenir que $nws contient la liste des news que vous voulez mettre
dans votre flux RSS.
<?php
$xml_file = domxml_new_doc("1.0");
?>
Cette ligne crée simplement un fichier XML temporaire en mémoire dans lequel on indique la version
XML utilisée (ici : version 1.0).
À présent, voyons comment créer le nœud maître rss puis un nœud fils channel.
<?php
function &init_news_rss(&$xml_file)
{
$root = $xml_file->create_element("rss"); // création de l'élément
$root->set_attribute("version", "2.0"); // on lui ajoute un attribut
$root = $xml_file->append_child($root); // on l'insère dans le nœud pa
rent (ici root, qui est "rss")
$channel = $xml_file->create_element("channel");
$channel = $root->append_child($channel);
$desc = $xml_file->create_element("description");
$desc = $channel->append_child($desc);
$text_desc = $xml_file->create_text_node("Partage de connaissances en
tous genres"); // on insère du texte entre les balises <description></descript
ion>
$text_desc = $desc->append_child($text_desc);
$link = $xml_file->create_element("link");
$link = $channel->append_child($link);
$text_link = $xml_file->create_text_node("http://www.bougiemind.inf
o");
$text_link = $link->append_child($text_link);
$title = $xml_file->create_element("title");
$title = $channel->append_child($title);
$text_title = $xml_file->create_text_node("Bougie'S mind");
$text_title = $title->append_child($text_title);
return $channel;
}
?>
Cette fonction retourne une référence : ainsi n'obtient-on pas une simple copie de l'élément, mais
bien l'élément lui-même. ;)
:
À présent, vous avez un fichier XML (toujours en mémoire) qui devrait ressembler à ceci :
Maintenant, nous allons passer à la partie la plus di!icile à comprendre (je vous rassure, elle est
quand même tout à fait abordable) : la création des items (chaque item correspond à une news
di!érente).
La fonction prend comme arguments :
$id, ID de la news ;
<?php
function add_news_node(&$parent, $root, $id, $pseudo, $titre, $contenu, $date)
{
$item = $parent->create_element("item");
$item = $root->append_child($item);
$title = $parent->create_element("title");
$title = $item->append_child($title);
$text_title = $parent->create_text_node($titre);
$text_title = $title->append_child($text_title);
$link = $parent->create_element("link");
$link = $item->append_child($link);
$text_link = $parent->create_text_node("http://www.bougiemind.info/rss
_news".$id.".html");
$text_link = $link->append_child($text_link);
$desc = $parent->create_element("description");
:
$desc = $item->append_child($desc);
$text_desc = $parent->create_text_node($contenu);
$text_desc = $desc->append_child($text_desc);
$com = $parent->create_element("comments");
$com = $item->append_child($com);
$text_com = $parent->create_text_node("http://www.bougiemind.info/news
-11-".$id.".html");
$text_com = $com->append_child($text_com);
$author = $parent->create_element("author");
$author = $item->append_child($author);
$text_author = $parent->create_text_node($pseudo);
$text_author = $author->append_child($text_author);
$pubdate = $parent->create_element("pubDate");
$pubdate = $item->append_child($pubdate);
$text_date = $parent->create_text_node($date);
$text_date = $pubdate->append_child($text_date);
$guid = $parent->create_element("guid");
$guid = $item->append_child($guid);
$text_guid = $parent->create_text_node("http://www.bougiemind.info/rss
_news".$id.".html");
$text_guid = $guid->append_child($text_guid);
$src = $parent->create_element("source");
$src = $item->append_child($src);
$text_src = $parent->create_text_node("http://www.bougiemind.info");
$text_src = $src->append_child($text_src);
}
?>
Normalement, aucune de ces fonctions ne vous est inconnue : elles ont été décrites plus haut. ;)
Voici à quoi ressemble le bout de fichier XML que vous venez de créer.
Souvenez-vous que le nœud item est un fils de channel, donc que les item se trouvent entre
les balises <channel></channel>.
Il ne nous reste plus qu'à élaborer une boucle sur la fonction add_news_node afin de créer un
élément item à chaque fois qu'il y a une news. Je vous laisse réfléchir. ;)
…
Vous avez réfléchi ? Bon, je ne vous fais pas patienter plus longtemps. ^^
<?php
while($news = mysql_fetch_assoc($nws))
{
add_news_node($xml_file, $channel, $news["nws_id"], $news["nws
_pseudo"], $news["nws_titre"], $news["nws_contenu"], date("d/m/Y H:i", $news["
nws_date"]));
}
?>
À présent, il ne reste plus qu'à enregistrer le fichier XML sur le disque dur. ^^
<?php
$xml_file->dump_file("news_FR_flux.xml");
?>
Faciliter l'utilisation
:
Maintenant que l'on a vu comment faire un flux RSS, on va essayer de mettre un peu d'ordre dans ce
code qui, pour le moment, est assez brouillon : on va tout regrouper dans un fichier flux_rss.php.
Nous allons également créer une fonction qui s'occupera de mettre à jour le flux RSS :
<?php
function rebuild_rss()
{
// on se connecte à la BDD
mysql_connect("localhost", "root", "mdp");
mysql_select_db("votre_table");
// on écrit le fichier
$xml_file->dump_file("news_FR_flux.xml");
}
?>
Vous avez maintenant une fonction qui reconstruira votre flux RSS à chaque fois que vous
l'appellerez. ;)
Si on récapitule, vous devriez avoir un fichier flux_rss.php comme celui-ci :
<?php
function &init_news_rss(&$xml_file)
{
$root = $xml_file->create_element("rss"); // création de l'élément
$root->set_attribute("version", "2.0"); // on lui ajoute un attribut
$root = $xml_file->append_child($root); // on l'insère dans le nœud pa
rent (ici root qui est "rss")
$channel = $xml_file->create_element("channel");
:
$channel = $root->append_child($channel);
$desc = $xml_file->create_element("description");
$desc = $channel->append_child($desc);
$text_desc = $xml_file->create_text_node("Partage de connaissances en
tous genres"); // on insère du texte entre les balises <description></descript
ion>
$text_desc = $desc->append_child($text_desc);
$link = $xml_file->create_element("link");
$link = $channel->append_child($link);
$text_link = $xml_file->create_text_node("http://www.bougiemind.inf
o");
$text_link = $link->append_child($text_link);
$title = $xml_file->create_element("title");
$title = $channel->append_child($title);
$text_title = $xml_file->create_text_node("Bougie'S mind");
$text_title = $title->append_child($text_title);
return $channel;
}
$title = $parent->create_element("title");
$title = $item->append_child($title);
$text_title = $parent->create_text_node($titre);
$text_title = $title->append_child($text_title);
$link = $parent->create_element("link");
$link = $item->append_child($link);
$text_link = $parent->create_text_node("http://www.bougiemind.info/rss
_news".$id.".html");
$text_link = $link->append_child($text_link);
$desc = $parent->create_element("description");
$desc = $item->append_child($desc);
$text_desc = $parent->create_text_node($contenu);
$text_desc = $desc->append_child($text_desc);
$com = $parent->create_element("comments");
:
$com = $item->append_child($com);
$text_com = $parent->create_text_node("http://www.bougiemind.info/news
-11-".$id.".html");
$text_com = $com->append_child($text_com);
$author = $parent->create_element("author");
$author = $item->append_child($author);
$text_author = $parent->create_text_node($pseudo);
$text_author = $author->append_child($text_author);
$pubdate = $parent->create_element("pubDate");
$pubdate = $item->append_child($pubdate);
$text_date = $parent->create_text_node($date);
$text_date = $pubdate->append_child($text_date);
$guid = $parent->create_element("guid");
$guid = $item->append_child($guid);
$text_guid = $parent->create_text_node("http://www.bougiemind.info/rss
_news".$id.".html");
$text_guid = $guid->append_child($text_guid);
$src = $parent->create_element("source");
$src = $item->append_child($src);
$text_src = $parent->create_text_node("http://www.bougiemind.info");
$text_src = $src->append_child($text_src);
}
function rebuild_rss()
{
// on se connecte à la BDD
mysql_connect("localhost", "root", "mdp");
mysql_select_db("votre_table");
// on écrit le fichier
$xml_file->dump_file("news_FR_flux.xml");
}
?>
Et voilà le travail ! Il vous su!it à présent d'ajouter deux lignes de code pour que votre flux RSS soit
reconstruit :
<?php
require('flux_rss.php');
rebuild_rss();
?>
Il ne vous reste plus qu'à indiquer au navigateur que votre site possède un flux RSS, et pour cela une
simple ligne en XHTML su!it.
{Titre du flux RSS} et {Lien vers le flux RSS} sont bien sûr à remplacer par ce que vous voulez. :)
Ce lien vers le fichier du flux RSS est à placer entre les balises <head><head> de votre fichier
XHTML. ;)
Passage à PHP5
Pour ceux qui souhaitent utiliser mon code avec PHP5, il y a quelques trucs à changer (c'est
principalement le nom des méthodes qui change).
Le nom de la lib XML n'est plus DOMXML mais simplement DOM.
Un lien vers la documentation (http://fr.php.net/manual/fr/ref.dom.php).
Je ne vais pas recopier le code modifié car il est, à peu de choses près, identique (et puis c’est assez
répétitif ;) ).
<?php
function &init_news_rss(&$xml_file)
{
$root = $xml_file->createElement("rss"); // création de l'élément
$root->setAttribute("version", "2.0"); // on lui ajoute un attribut
$root = $xml_file->appendChild($root); // on l'insère dans le nœud par
ent (ici root qui est "rss")
$channel = $xml_file->createElement("channel");
$channel = $root->appendChild($channel);
$desc = $xml_file->createElement("description");
$desc = $channel->appendChild($desc);
$text_desc = $xml_file->createTextNode("Partage de connaissances en to
us genres"); // on insère du texte entre les balises <description></descriptio
n>
$text_desc = $desc->appendChild($text_desc);
$link = $xml_file->createElement("link");
$link = $channel->appendChild($link);
$text_link = $xml_file->createTextNode("http://www.bougiemind.info");
$text_link = $link->appendChild($text_link);
$title = $xml_file->createElement("title");
$title = $channel->appendChild($title);
$text_title = $xml_file->createTextNode("Bougie'S mind");
$text_title = $title->appendChild($text_title);
return $channel;
}
?>
<?php
$xml_file = domxml_new_doc("1.0");
?>
:
En PHP5, il faut faire comme cela :
<?php
$xml_file = new DOMDocument("1.0");
?>
<?php
$xml_file->dump_file("news_FR_flux.xml");
?>
En PHP5 :
<?php
$xml_file->save("news_FR_flux.xml");
?>
Vous avez désormais un code qui fonctionnera sur un serveur avec PHP5 !
Et n'oubliez pas : tout ce que je vous ai dit ici, je l'ai trouvé dans la documentation. ;)
Vous devriez maintenant être capables de coder votre propre flux RSS des news de votre site en vous
servant d'une lib XML.
Merci de m'avoir lu, et à bientôt pour de nouvelles aventures. :-°
P.-S. — À ceux qui souhaitent finaliser le tuto en ajoutant ce qui a été dit dans les commentaires,
envoyez-moi un MP. ;)
: