Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Langage, bibliothèques et fonctions > [DOMXML] Flux RSS de news > Lecture du tutoriel

[DOMXML] Flux RSS de news

Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Avatar
Auteur : Bougie
Note : 16 / 20 (15 votes)
Visualisations : 17 398


Plus d'informations Plus d'informations
Hello, hello ! :)

Vous voulez créer votre propre flux RSS des news de votre site vous-mêmes ?
Vous voulez utiliser une lib XML pour avoir un code plus joli, plus propre, mais vous ne trouvez aucun tuto sur ce sujet sur Google ?

J'ai celui qu'il vous faut. ^^
Sommaire du tutoriel :
Icône du chapitre

Quelques notions utiles

Pour commencer, on va d'abord voir les bases qui me semblent nécessaires pour pouvoir comprendre la suite du tuto, et surtout le fonctionnement de la lib XML.
Elle n'est vraiment pas difficile à comprendre (c'est bien pour ça que je l'utilise :-° ), mais sans quelques mots de vocabulaire, il me semble difficile de la comprendre ;) .

Prenons par exemple un fichier XML au hasard (bon : pas trop, parce qu'on s'en resservira plus tard :-° ).
Code : XML
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="ISO-8859-15" ?>
<rss version="2.0">
        <channel>
                <description>une description</description>
                <link>un lien</link>
                <title>ho, un titre :D</title>
        </channel>
</rss>

"<channel>" est appelée balise. Comme vous le savez, les balises vont par "paires". C'est-à-dire qu'il y a une balise ouvrante, et une balise fermante.
Dans cette exemple avec "<channel>", la balise ouvrante est "<channel>", et la balise fermante est "</channel>".
Sans les "", bien évidemment. :D
Il y a aussi les balises auto-fermantes comme "<img />", mais elles nous intéressent pas dans cet article.
Une balise peut aussi prendre un (ou plusieurs) arguments ; par exemple, "version" est un argument de la balise "<rss>" qui a pour valeur "2.0".

Si vous voulez en savoir plus au sujet du XML, un excellent article écrit par un Zéro.

Maintenant, voyons un peu la lib que nous allons utiliser pour parser le fichier XML afin de créer notre flux RSS. ^^
On va utiliser DomXML pour PHP4 comme lib ;) .
Pour la doc officiel, c'est par ici.
Avec cette doc et de la logique, vous pouvez faire énormément de choses. ;)

Voyons un semblant de vocabulaire pour comprendre un peu le nom des fonctions de DomXML. ^^
Dans notre fichier XML, la balise "<channel>" est aussi appelée "node" (noeud, en français). Elle fait partie d'un noeud root (noeud parent), ici "<rss>". On dit aussi que "<channel>" est une balise fille ou un fils (child) de "<rss>".
Donc si vous avez compris, vous avez sans doute trouvé que les balises "<description>", "<link>" et "<title>" sont des enfants de "<channel>".

En résumé, on a :
La balise "<channel>" est elle-même un child de "<rss>". Et ceci peut marcher récursivement pour toutes les balises. ;)

Structure du document XML

Après avoir vu un peu de vocabulaire utile pour la compréhension du tuto, on va maintenant s'intéresser à la structure que devra avoir le fichier XML pour être lisible par un lecteur de flux RSS.

Prenons comme exemple celui du SdZ. :-°

Structure du début du fichier
Code : XML
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="ISO-8859-15" ?>
<rss version="2.0">
        <channel>
                <description>Description du site</description>
                <link>lien vers le site</link>
                <title>titre du site</title>
        </channel>
</rss>

C'est la base d'un fichier XML pour être lu par un lecteur de flux RSS. Bien sûr, vous pouvez ajouter des éléments.
Le lien que j'ai sous les yeux à ce moment. :D
A présent, voyons la structure d'un élément (dans notre cas, une news) qui est à mettre entre les balises <channel></channel> du fichier XML vu au dessus. ;)
Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<item>
        <title>titre de la news</title>
        <link>lien vers la news en entier</link>
        <description>description de la news, le mieux c'est de mettre le contenu 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 c'est de mettre le titre de la news</guid>
        <source>source d'où provient la news</source>
</item>


Quelques explications :
Le noeud "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 :
Code : XML
1
2
3
4
5
6
7
8
9
<item>
<!-- titre, lien, etc. de la premiere news -->
</item>
<item>
<!-- titre, lien, etc. de la deuxieme news -->
</item>
<item>
<!-- etc. -->
</item>


Voilà : avec cette structure, vous aurez un flux RSS assez complet ; bien sûr, vous pouvez rajouter encore plus de choses. ;)

Récupérer les news

Une fois qu'on connaît la manière dont est construit le document XML, il est temps de savoir comment récupérer le contenu à lui insérer. :D

Bah, allons-y. ^^

Tout d'abord, voyons la structure de la table news servant de modèle pour ce tuto.
Code : SQL
1
2
3
4
5
6
7
8
CREATE TABLE `news` (
  `nws_id` smallint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  `nws_pseudo` varchar(255) NOT NULL DEFAULT '0',
  `nws_titre` varchar(255) NOT NULL DEFAULT '',
  `nws_contenu` text NOT NULL,
  `nws_date` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY `id` (`nws_id`),
) TYPE=InnoDB COMMENT='Contient les news' AUTO_INCREMENT=59 ;

Cette table n'a rien d'exceptionnel ^^ .
Si vous ne la comprenez pas, vous n'avez pas suivi les cours de M@teo correctement. :-°

Tournons-nous du côté de la requête pour sélectionner les différents éléments.
Code : SQL
1
SELECT nws_id, nws_pseudo, nws_titre, nws_contenu, nws_date FROM news WHERE ORDER BY nws_date DESC LIMIT 0 OFFSET 10


Maintenant, il ne nous reste plus qu'à envoyer la requête au serveur mysql. ;)
Code : PHP
1
2
3
4
mysql_connect("localhost", "root", "mdp");
mysql_select_db("votre_table");
 
$nws = mysql_query("SELECT nws_id, nws_pseudo, nws_titre, nws_contenu, nws_date FROM news WHERE ORDER BY nws_date DESC LIMIT 0 OFFSET 10");

On sélectionne les 10 dernières news. Libre à vous d'en sélectionner plus ou moins.
Et voilà, ces 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 ;) .

Créer le fichier XML

Voilà : on est presque arrivé au bout.
Encore quelques minutes d'attention, et vous aurez enfin votre flux RSS. ^^

Voyons la ligne pour initialiser le fichier XML.
Code : PHP
1
$xml_file = domxml_new_doc("1.0");

On crée juste un fichier XML temporaire en mémoire et on lui indique la version XML du fichier (ici : version 1.0).

A présent, voyons comment créer le noeud maître "rss", puis un noeud fils "channel".
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function &init_news_rss(&$xml_file)
{
        $root = $xml_file->create_element("rss"); //création de l'element
        $root->set_attribute("version", "2.0"); //on lui ajout un attribut
        $root = $xml_file->append_child($root); //on l'insère dans le noeud parent (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 tout genre"); //on insère du texte entre les balises <description></description>
        $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.info");
        $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, on n'a pas une copie de l'élément, mais bien l'élément créé lui-même. ;)

A ce niveau-là, vous avez un fichier XML (toujours en mémoire) qui devrait ressembler à ceci :

Code : XML
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="ISO-8859-15" ?>
<rss version="2.0">
        <channel>
                <description>Partage de connaissances en tout genre</description>
                <link>http://www.bougiemind.info</link>
                <title>Bougie'S mind</title>
        </channel>
</rss>


Maintenant, voyons la partie la plus difficile à comprendre, mais simple quand même :p .
La création des items (correspondent aux différentes news).
La fonction prend comme argument :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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 fonction ne vous est inconnue, elles ont été décrites plus haut. ;)

Voilà à quoi ressemble le bout du fichier xml que vous venez de créer.
J'ai fabriqué une news au hasard. ;)

Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<item>
    <title>Flux RSS des news en place</title>
    <link>http://www.bougiemind.info/rss_news56.html</link>
    <description>Voila, le flux RSS des news est en place</description>
    <comments>http://www.bougiemind.info/news-11-56.html</comments>
    <author>bougie</author>
    <pubDate>24/04/2006 12:42</pubDate>
    <guid>http://www.bougiemind.info/rss_news56.html</guid>
    <source>http://www.bougiemind.info</source>
</item>


Souvenez-vous que le noeud "item" est un fil du news "channel", donc que les "item" se trouvent entre les balises "<channel></channel>".


Il nous reste plus qu'à créer 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. ^^
Code : PHP
1
2
3
4
while($news = mysql_fetch_assoc($nws))
        {
                add_news_node($xml_file, $channel, $news["nws_id"], $news["nws_pseudo"], $news["nws_titre"], $news["contenu"], date("d/m/Y H:i", $news["nws_date"]));
        }


Le paramètre de la fonction "add_news_node" $channel est l'objet retourné par la fonction "init_news_rss".

Voilà : à présent, il ne reste plus qu'à enregistrer le fichier XML sur le disque dur. ^^
Code : PHP
1
$xml_file->dump_file("news_FR_flux.xml");


Vous devriez désormais avoir un flux RSS qui fonctionne.

Faciliter l'utilisation

Maintenant qu'on a vu comment faire un flux RSS, on va essayer d'arranger un peu mieux le code qui se balade un peu partout. :-°

Pour faciliter son utilisation lorsque cela sera nécessaire, on va tout regrouper dans un fichier flux_rss.php.

On va ensuite créer une fonction qui s'occupera de mettre à jour le flux RSS. On va simplement y regrouper les bouts de code qui traînaient un peu partout.
Ce que devrait au final ressemblé à ceci :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
function rebuild_rss()
{
        //On se connecte à la BDD
        mysql_connect("localhost", "root", "mdp");
        mysql_select_db("votre_table");
 
        //On récupère les news
        $nws = mysql_query("SELECT nws_id, nws_pseudo, nws_titre, nws_contenu, nws_date FROM news WHERE ORDER BY nws_date DESC LIMIT 0 OFFSET 10");
 
        //On crée le fichier XML
        $xml_file = domxml_new_doc("1.0");
 
        //On ajoute chaque news au fichier RSS
        while($news = mysql_fetch_assoc($nws))
        {
                add_news_node($xml_file, $channel, $news["nws_id"], $news["nws_pseudo"], $news["nws_titre"], $news["contenu"], date("d/m/Y H:i", $news["nws_date"]));
        }
        
        //On écrit le fichier
        $xml_file->dump_file("news_FR_flux.xml");
}

Voilà : vous avez une fonction qui, à chaque fois que vous l'appellerez, reconstruira votre flux RSS. ;)

Si on récapitule, vous devriez avoir un fichier flux_rss.php comme celui-ci :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
function &init_news_rss(&$xml_file)
{
        $root = $xml_file->create_element("rss"); //création de l'element
        $root->set_attribute("version", "2.0"); //on lui ajoute un attribut
        $root = $xml_file->append_child($root); //on l'insère dans le noeud parent (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 tout genre"); //on insère du texte entre les balies <description></description>
        $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.info");
        $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;
}
 
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);
}
 
function rebuild_rss()
{
        //On se connecte à la BDD
        mysql_connect("localhost", "root", "mdp");
        mysql_select_db("votre_table");
 
        //On récupère les news
        $nws = mysql_query("SELECT nws_id, nws_pseudo, nws_titre, nws_contenu, nws_date FROM news WHERE ORDER BY nws_date DESC LIMIT 0 OFFSET 10");
 
        //On crée le fichier XML
        $xml_file = domxml_new_doc("1.0");
 
        //On initialise le fichier XML pour le flux RSS
        $channel = init_news_rss($xml_file);
 
        //On ajoute chaque news au fichier RSS
        while($news = mysql_fetch_assoc($nws))
        {
                add_news_node($xml_file, $channel, $news["nws_id"], $news["nws_pseudo"], $news["nws_titre"], $news["contenu"], date("d/m/Y H:i", $news["nws_date"]));
        }
       
        //On écrit le fichier
        $xml_file->dump_file("news_FR_flux.xml");
}

Voilà, il vous suffira à présent de rajouter 2 lignes de code pour que votre flux RSS soit reconstruit :
Code : PHP
1
2
require('flux_rss.php');
rebuild_rss();


Il ne vous reste plus qu'à indiquer au navigateur que votre site possède un flux RSS.
Une simple ligne en xHTML suffit. :)
Code : HTML
1
<link rel="alternate" type="application/rss+xml" title="{Titre du flux RSS}" href="{Lien vers le flux RSS}" />

{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. ;)

Ce n'est plus DOMXML le nom de la lib XML, mais simplement DOM.
Un lien vers la doc.

Je ne vais pas recopier le code en changeant tout, parce que le code est quand même très répétitif. ;)

La fonction "create_element" est à remplacer par "createElement".
La fonction "set_attribute" est à remplacer par "setAttribute".
La fonction "append_child" est à remplacer par "appendChild".
La fonction "create_text_node" est à remplacer par "createTextNode".

Ce qui nous donnerait par exemple pour la fonction &init_news_rss(&$xml_file) :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 noeud parent (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 tout genre"); //on insère du texte entre les balies <description></description>
        $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;
}

A vous ensuite de modifier les autres fonctions. Je vous fais confiance. ;)

Les dernières modifications vont se faire au niveau de la création du fichier XML et de sa sauvegarde.

Dans notre code PHP4, on avait :
Code : PHP
1
$xml_file = domxml_new_doc("1.0");

En PHP5, il faut faire comme ça :
Code : PHP
1
$xml_file = new DOMDocument("1.0");


Et pour sauvegarder le fichier XML...
En PHP4 :
Code : PHP
1
$xml_file->dump_file("news_FR_flux.xml");

En PHP5 :
Code : PHP
1
$xml_file->save("news_FR_flux.xml");


Voilà : vous avez 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 doc. ;)

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. :-°
Retour en haut Retour en haut


Créé : le 06/05/2006 à 20:00:56
Modifié : le 22/08/2008 à 16:09:53
Avancement : 90%
Licence : Copie non autorisée

48 commentaires

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 136 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0468s (0.0365s)