Interface de gestion de flux RSS 2.0 en PHP 5

Mathieu Fernandez

Ce tutoriel explique comment mettre en place une interface de gestion de flux RSS 2.0 en PHP 5.
Il ne s'adresse pas à des personnes ayant des sites énormes où des dizaines de nouvelles RSS sont diffusées chaque jour, mais plutôt à ceux qui souhaitent créer des flux RSS occasionnellement sans rentrer dans le code XML.
Cette interface vous permettra de créer, modifier et supprimer un flux RSS ou une news contenue dans un flux.

- Titre : Interface de gestion de flux RSS 2.0 en PHP 5

- Auteur : Mathieu Fernandez

- Parution : 22 novembre 2007

- Mise à jour : 10 décembre 2019

- Licence : Copyright ® 2007 Mathieu Fernandez. 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- I-A. Remerciements

- I-B. Préambule

- II. La base de données MySQL

- III. L'organisation des dossiers et fichiers

- III-A. L'arborescence

- III-B. La définition des constantes

- IV. L'interface

- IV-A. Formulaire de création d'un flux

- IV-B. Formulaire de création d'une nouvelle

- IV-C. Formulaire de suppression d'un flux

- IV-D. Formulaire de suppression ou modification d'une nouvelle

- IV-E. Le traitement des formulaires

- V. Traitement des formulaires

- V-A. Création d'un nouveau flux RSS

- V-B. Création d'une nouvelle

- V-C. Suppression d'un flux

- V-D. Suppression d'une nouvelle

- V-E. Modification d'une nouvelle

- VI. Affichage d'un flux

- VII. Conclusion

- VIII. Téléchargements

I - Introduction

I-A - Remerciements

Je souhaiterais, avant toute chose, remercier toute l'équipe Web/PHP pour leur soutien et leur aide dans la rédaction de cet article ainsi qu'à wichtounet pour m'avoir permis de reprendre son tutoriel et à Aspic pour la correction orthographique ;).

I-B - Préambule

Ce tutoriel repose en partie sur celui de wichtounet : Création d'un système RSS pour vos news avec PHP 4 et 5.
Il n'est donc pas fait pour vous apprendre à créer un flux RSS 2.0, les flux et les nouvelles qu'ils contiennent.
Nous allons voir, ensemble, comment créer une interface de gestion de flux RSS 2.0 en PHP 5 afin de faciliter la création, la modification et la suppression de flux RSS.
Dans ce tutoriel, nous faisons appel à des styles CSS et des scripts JavaScript qui sont disponibles dans le code source à la fin du tutoriel sous forme d'archive RAR et ZIP.

II - La base de données MySQL

Dans un premier temps, nous allons avoir besoin de créer une base de données MySQL. Ici, nous utilisons une base de données MySQL et les fonctions PHP associées, mais vous pouvez évidemment utiliser n'importe quel autre SGBD.
Cette BD, extrêmement simple, va nous permettre de conserver les flux et les nouvelles contenues dans ceux-ci.
Nous appelons cette BD db_rss.

Script de génération de la base de données MySQL db_rss

/*==============================================================*/
/* Suppression des tables existantes                */
/*==============================================================*/
drop table if exists TJ_CHANNEL_ITEM;
drop table if exists T_ITEM;
drop table if exists T_CHANNEL;

/*==============================================================*/
/* Création des tables                         */
/*==============================================================*/
CREATE TABLE T_ITEM (
IT_ID int(4) NOT NULL auto_increment,
IT_TITRE varchar(255) NOT NULL,
IT_DESC text NOT NULL,
IT_LIEN varchar(255) default NULL,
IT_DATE int(12) NOT NULL default '0',
IT_AUTEUR varchar(100) NOT NULL default '',
PRIMARY KEY  (IT_ID)
)
TYPE=InnoDB AUTO_INCREMENT=1;

CREATE TABLE T_CHANNEL (
CH_ID varchar(100) NOT NULL,
CH_TITRE varchar(255) NOT NULL,
CH_DESC text NOT NULL,
PRIMARY KEY  (CH_ID)
)
TYPE=InnoDB;

CREATE TABLE TJ_CHANNEL_ITEM (
CI_CH_ID varchar(100) NOT NULL,
CI_IT_ID int(4) NOT NULL,
PRIMARY KEY  (CI_CH_ID,CI_IT_ID)
)
TYPE=InnoDB;

/*==============================================================*/
/* Index sur TJ_CHANNEL_ITEM                                    */
/*==============================================================*/
create index IT_CH_FK on TJ_CHANNEL_ITEM (CI_IT_ID);
create index CH_IT_FK on TJ_CHANNEL_ITEM (CI_CH_ID);

/*==============================================================*/
/* Définition des contraintes                    */
/*==============================================================*/
alter table TJ_CHANNEL_ITEM
add constraint FK_CH_IT foreign key (CI_CH_ID) references T_CHANNEL (CH_ID),
add constraint FK_IT_HC foreign key (CI_IT_ID) references T_ITEM (IT_ID);

Description des tables

- T_ITEM : listes des news. Une news a un identifiant, un titre, une description, un lien vers la page pointée, une date et un auteur.

- T_CHANNEL : liste des flux RSS. Un flux RSS a un identifiant, un titre et une description générale.

- TJ_CHANNEL_ITEM : table de liaison entre une news et un flux.

III - L'organisation des dossiers et fichiers

III-A - L'arborescence

Pour notre exemple, nous utilisons une arborescence de fichiers particulière afin de séparer les styles CSS, les images, les fonctions utilisées pour faire des traitements particuliers, les fichiers PHP gérant les flux RSS et enfin le dossier contenant les fichiers XML des flux RSS.
Vous pouvez, bien entendu, adapter l'arborescence des fichiers en fonction de vos besoins.

Arborescence des dossiers et fichiers

- gestion_flux.php : script PHP générant l'interface de gestion des flux RSS.

- affichage_flux.php : script PHP qui génère la page affichant les flux RSS créés et permettant de s'abonner à un flux RSS.

- constant.inc.php : script PHP définissant les constantes ainsi que les fichiers à inclure.

- flux_rss : dossier contenant les flux RSS au format XML.

- fonctions : dossier contenant les fonctions utilisées pour faire des traitements quelconques.

- fonctions_gestion_rss : dossier contenant les fonctions nécessaires à la gestion des flux RSS.

- images : dossier contenant les images à afficher dans vos flux RSS.

- styles : dossier contenant les styles CSS de la page gestion_flux.php.

Les dossiers sont en gras, les fichiers en italiques.

III-B - La définition des constantes

Les constantes sont définies dans le fichier constant.inc.php.
Si vous utilisez l'arborescence décrite ci-dessus, voici le code à mettre dans le fichier constant.inc.php :

Contenu de constant.inc.php

<?php
//déclaration de toutes les constantes, il suffit de modifier ce fichier si on fait un changement
//------liens physiques--------//
define ('MAIN_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);//racine physique du site
define ('FONCTIONS_PATH', MAIN_PATH.'fonctions'.DIRECTORY_SEPARATOR);//dossier contenant les script PHP
define ('FONCTIONS_RSS_PATH', MAIN_PATH.'fonctions_gestion_rss'.DIRECTORY_SEPARATOR);//dossier contenant les scripts PHP nécessaires à la gestion du RSS
define ('PHY_RSS_PATH', MAIN_PATH.'flux_rss'.DIRECTORY_SEPARATOR);//dossier contenant les fichiers XML des flux RSS

//------liens virtuels------//
define ('SITE_URL', 'http://'.$_SERVER['HTTP_HOST'].'/tuto_gestion_rss/');//racine web du site
define ('VIR_RSS_PATH', SITE_URL.'flux_rss/');//dossier contenant les fichiers XML des flux RSS
define ('FONCTIONS_URL', SITE_URL.'fonctions/');//lien vers les fonctions (liens JavaScript)
define ('CSS_URL', SITE_URL.'styles/');//lien vers la feuille de style CSS
define ('IMAGES_URL', SITE_URL.'images/');//lien vers le dossier des images

//paramètres de connexion à la BD
$host='localhost';    //hôte de la BD
$user='root';        //nom utilisateur
$pwd='pwd';    //mot de passe utilisateur
$db='db_rss';        //nom base de données

//connexion à la BD RSS
require_once (FONCTIONS_PATH.'connection_bd_rss.php');

//inclusion du fichier gérant les flux RSS
require_once (FONCTIONS_RSS_PATH.'gestion_xml_rss.php');

//inclusion de la fonction quote_smart
require_once (FONCTIONS_PATH.'quote_smart.php');

//inclusion de la fonction fichier_existant
require_once (FONCTIONS_PATH.'fichier_existant.php');

//inclusion de la fonction de formatage d'une chaine
require_once (FONCTIONS_PATH.'format_string.php');
?>

Vous l'aurez compris, ce fichier permet de définir l'endroit où se situe tel ou tel fichier en fonction de la racine physique ou virtuelle du site.
Ceci permet de migrer le site très facilement, car les seules choses à modifier sont l'URL du site et les identifiants de connexion à la BD si ces derniers changent.

IV - L'interface

L'interface est très simple et très intuitive. Nous l'appellerons gestion_flux.php dans notre tutoriel.
Elle permet, en une seule page, de créer ou de supprimer un flux RSS ainsi que de créer, modifier ou supprimer une nouvelle.
Elle est, en fait, constituée de quatre formulaires HTML qui permettent, chacun, de réaliser une action.

Les quatre formulaires

- Création d'un nouveau flux RSS.

- Création d'une nouvelle.

- Suppression d'un flux.

- Suppression ou modification d'une nouvelle.

IV-A - Formulaire de création d'un flux

Ce formulaire permet de créer un document XML vide respectant le format RSS 2.0.
Il suffit, pour cela, de spécifier un nom au fichier qui sera créé, un titre et une description au flux.

Formulaire de création d'un flux

<div class="paragraphe">
<h2 onclick="affiche('gestion1')"  onmouseover="this.style.color='#06c'; this.style.cursor='pointer';"
onmouseout="this.style.color='#600'; this.style.cursor='default';">Création d'un nouveau flux RSS</h2>
<form action="gestion_flux.php" method="post" id="gestion1">
<input type="hidden" name="type" value="new_flux" />
<input type="hidden" name="new" value="1" />
Nom du fichier :<br /><input type="text" name="filename" class="input_text" /><br /><br />
Titre du flux (channel) :<br /><input type="text" name="channel_title" class="input_text" /><br /><br />
Description du flux (channel) :<br /><textarea name="channel_description" rows="10" cols="102"></textarea>
<br /><br />
<input type="submit" value="OK" />
<input type="reset" value="Tout effacer" />
</form>
</div>

IV-B - Formulaire de création d'une nouvelle

Ce formulaire permet de créer une nouvelle dans un flux RSS que vous aurez créé auparavant.
Il suffit, pour cela, d'indiquer le flux visé par le biais d'une liste déroulante, de donner un titre à la nouvelle et d'en faire une description.
Si vous le souhaitez, vous pouvez aussi faire un lien vers l'article visé sur votre site et indiquer le mail de l'auteur.

Formulaire de création d'une nouvelle

<div class="paragraphe">
<h2 onclick="affiche('gestion2')" onmouseover="this.style.color='#06c'; this.style.cursor='pointer';"
onmouseout="this.style.color='#600'; this.style.cursor='default';">Création d'une nouvelle</h2>
<form action="gestion_flux.php" method="post" id="gestion2">
<input type="hidden" name="type" value="new_item" />
<?php
$query="SELECT CH_ID, CH_TITRE FROM T_CHANNEL";
$result=mysql_query($query) or die('Erreur lors de la sélection des flux :'.mysql_error());
if (mysql_num_rows($result)>0)
{
echo 'Flux visé : <select name="filename" style="width:300px;">';
while($tab_result = mysql_fetch_array($result))
echo '<option value="'.$tab_result['CH_ID'].'">'.$tab_result['CH_TITRE'].'</option>';
echo '</select>
<br /><br />
Titre :<br /><input type="text" name="title" class="input_text" /><br /><br />
Contenu :<br /><textarea name="description" rows="10" cols="102"></textarea><br /><br />
Lien vers l\'article :<br /><input type="text" name="lien" class="input_text" value="http://"/><br /><br />
Adresse mail de l\'auteur :<br /><input type="text" name="author" class="input_text"/><br /><br />
<input type="submit" value="OK" />
<input type="reset" value="Tout effacer" />';
}
else echo 'Il n\'existe pas de flux pour le moment donc vous ne pouvez pas créer de nouvelle.';
?>
</form>
</div>

IV-C - Formulaire de suppression d'un flux

Ce formulaire permet de supprimer un flux RSS 2.0 créé auparavant grâce à cette interface.
Il suffit, pour cela, de sélectionner le flux dans une liste déroulante.

Formulaire de suppression d'un flux

<div class="paragraphe">
<h2 onclick="affiche('gestion3')" onmouseover="this.style.color='#06c'; this.style.cursor='pointer';"
onmouseout="this.style.color='#600'; this.style.cursor='default';">Suppression d'un flux</h2>
<form action="gestion_flux.php" method="post"  id="gestion3">
<input type="hidden" name="type" value="suppr_flux" />
<?php
if (mysql_num_rows($result)>0)
{
echo 'Flux visé : <select name="filename" style="width:300px;">';
$query="SELECT CH_ID, CH_TITRE FROM T_CHANNEL";
$result=mysql_query($query) or die('Erreur lors de la sélection des flux :'.mysql_error());

while($tab_result = mysql_fetch_array($result))
echo '<option value="'.$tab_result['CH_ID'].'">'.$tab_result['CH_TITRE'].'</option>';
echo '</select><br /><br />
<input type="submit" value="OK" />';
}
else echo 'Il n\'existe pas de flux pour le moment vous ne pouvez donc pas en supprimer un.';
?>
</form>
</div>

IV-D - Formulaire de suppression ou modification d'une nouvelle

Ce formulaire permet soit de modifier, soit de supprimer une nouvelle.
Il suffit, pour cela, de spécifier une nouvelle dans une liste déroulante.

Formulaire de suppression ou modification d'une nouvelle

<div class="paragraphe">
<h2 onclick="affiche('gestion4')"  onmouseover="this.style.color='#06c'; this.style.cursor='pointer';"
onmouseout="this.style.color='#600'; this.style.cursor='default';">Suppression ou modification d'une nouvelle</h2>
<form action="gestion_flux.php" method="post" id="gestion4">
<input type="hidden" name="type" value="suppr_item" />
<?php
$query="SELECT IT_ID, IT_TITRE FROM T_ITEM ORDER BY IT_DATE DESC";
$result=mysql_query($query) or die('Erreur lors de la sélection des nouvelles :'.mysql_error());
if (mysql_num_rows($result)>0)
{
echo 'Nouvelle visée (ordonnées par date d\'insertion) : <br /><select name="item">';
while($tab_result = mysql_fetch_array($result))
echo '<option value="'.$tab_result['IT_ID'].'">'.$tab_result['IT_TITRE'].'</option>';

//fermeture de la connexion à la BD RSS
mysql_close();

echo '</select><br /><br />
<input type="submit" name="action" value="Supprimer" />
<input type="submit" name="action" value="Modifier" />';
}
else echo 'Il n\'y a aucune nouvelle de créée';
?>
</form>
</div>

IV-E - Le traitement des formulaires

Comme vous l'avez sûrement constaté, les quatre formulaires font appel au fichier gestion_flux.php qui est la page sur laquelle ils se trouvent.
En fait, il faut rajouter du code PHP au début de cette page afin d'inclure tel ou tel script PHP en fonction du formulaire rempli par l'utilisateur.
Cela permet en une seule page de faire les modifications voulues sur tous les flux RSS que vous aurez créés sans changer de page (permet d'éviter les allers-retours entre pages).

Traitement des formulaires

<?php
if (isset($_POST['type']) && isset($_POST['action']) && isset($_POST['item']) && $_POST['action']=='Modifier')
{
header('Status: 301 Moved Permanently', false, 301);
header('Location: http://localhost/tuto_gestion_rss/fonctions_gestion_rss/interface_modif_item.php?item='.$_POST['item']);
exit();
}

require_once 'constant.inc.php';

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*ICI : Définition du DOCTYPE, des entêtes HTML, inclusion des JavaScript et CSS */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

if (isset($_POST['type']))
{
//inclusion de la fonction quote_smart
require_once (FONCTIONS_PATH.'quote_smart.php');
//inclusion de la fonction de formatage d'une chaine
require_once (FONCTIONS_PATH.'format_string.php');

$type=$_POST['type'];
switch ($type)
{
//Lorsque l'utilisateur souhaite créer un nouveau flux
case 'new_flux' :
//new est à 1 quand on crée un nouveau flux par le biais de l'interface.
//lorsque new_flux.php est appelé par suppr_item.php, new est à 0, car ne souhaite pas
//créer un nouveau flux, mais simplement réactualiser l'ancien
if (isset($_POST['new'])) $new=$_POST['new'];
if (isset($_POST['filename'])) $filename=$_POST['filename'];
if (isset($_POST['channel_title'])) $channel_title=$_POST['channel_title'];
if (isset($_POST['channel_description'])) $channel_description=$_POST['channel_description'];
require_once (FONCTIONS_RSS_PATH.'new_flux.php');
break;

//Lorsque l'utilisateur souhaite créer un nouvel item
case 'new_item' :
if (isset($_POST['filename'])) $filename=$_POST['filename'];
if (isset($_POST['title'])) $title=$_POST['title'];
if (isset($_POST['description'])) $description=$_POST['description'];
if (isset($_POST['lien']))
{
if (empty($_POST['lien']) || $_POST['lien']=='http://')$lien=SITE_URL;
else $lien=$_POST['lien'];
}
if (!empty($_POST['author'])) $author=$_POST['author'];
else $author='forum@redaction-developpez.com';
require_once (FONCTIONS_RSS_PATH.'new_item.php');
break;

//Lorsque l'utilisateur souhaite supprimer un flux
case 'suppr_flux' :
if (isset($_POST['filename'])) $filename=$_POST['filename'];
require_once (FONCTIONS_RSS_PATH.'suppr_flux.php');
break;

//Lorsque l'utilisateur souhaite supprimer un item (une nouvelle)
case 'suppr_item' :
if (isset($_POST['item']))
{
$item=$_POST['item'];
require_once (FONCTIONS_RSS_PATH.'suppr_item.php');
}
break;

//Lorsque l'utilisateur souhaite modifier une nouvelle
case 'modif_item' :
if (isset($_POST['item'])) $item=$_POST['item'];
if (isset($_POST['title'])) $title=$_POST['title'];
if (isset($_POST['description'])) $description=$_POST['description'];
if (isset($_POST['lien']))
{
if (empty($_POST['lien']) || $_POST['lien']=='http://')$lien=SITE_URL;
else $lien=$_POST['lien'];
}
if (!empty($_POST['author'])) $author=$_POST['author'];
else $author='forum@redaction-developpez.com';
require_once (FONCTIONS_RSS_PATH.'modif_item.php');
break;

//Lorsque l'on arrive sur la page la première fois
default :
break;
}
}
?>

Ce code mis au début de la page gestion_flux.php permet de gérer les différentes options sans pour autant quitter la page, ce qui permet à l'utilisateur d'enchaîner les actions sans naviguer de page en page.
Ce qui se trouve au-dessus de la définition du DOCTYPE XHTML sert à faire une redirection au cas où la personne souhaiterait modifier une nouvelle.
Ceci permet d'afficher une page avec les champs d'une nouvelle remplis comme il l'ont été la dernière fois et de modifier cette nouvelle.

Ce qui se trouve en dessous de la définition du DOCTYPE XHTML permet d'inclure les fichiers qui vont gérer les données saisies par l'utilisateur.
En fonction du formulaire rempli et soumis, le fichier à inclure sera différent. Nous allons voir dans la section suivante quels sont les fichiers inclus ainsi que leur rôle.

V - Traitement des formulaires

Les scripts PHP qui suivent utilisent des fonctions définies dans le tutoriel de witchounet (voir le lien en intro) auxquelles j'ai rajouté quelques modifications.
Ils sont également disponibles dans les archives téléchargeables à la fin de cours.

V-A - Création d'un nouveau flux RSS

Nom du fichier utilisé : new_flux.php

Ce script est appelé, pour ainsi dire, tout le temps, car c'est lui qui permet de construire le flux RSS.
Autrement dit, c'est avec ce script que l'on crée le document XML qui est interprété par le navigateur ou par un lecteur de flux RSS.
Le principe de ce script est de récupérer dans la base de données les nouvelles, appartenant à un flux visé, dans l'ordre antéchronologique et de créer (ou réécrire) le document XML. Attention : sur certains systèmes (Linux par exemple), il faut avoir les droits d'écrire sur le dossier pointé sinon cela va retourner une erreur type « Permission denied ».

new_flux.php

<?php
//Si un champ n'est pas renseigné et que le flux est un nouveau flux, on affiche un message d'erreur
if ($new==1 && (empty($filename) || empty($channel_title) || empty($channel_description))) echo 'Vous avez oublié de renseigner un champ';
else
{
//formatage de la chaine de caractères afin qu'elle ne contienne pas d'espace ou de caractère accentué
$filename=formatage_chaine($filename);

//Création du document XML ayant comme nom $filename.xml
$memoryfile = createNewXML($filename, $channel_title, $channel_description);

//si on souhaite créer un nouveau flux
if ($new==1)
{
$query="SELECT COUNT(*) FROM T_CHANNEL WHERE CH_TITRE=".quote_smart($channel_title);
$result = mysql_query($query) or die('Erreur sélection item : '.mysql_error());
if(mysql_result($result, 0)<1)
{
//Création du channel dans la base de données
mysql_query("INSERT INTO T_CHANNEL VALUES ('".$filename."',".quote_smart($channel_title).",".quote_smart($channel_description).")")
or die('Erreur insertion channel : '.mysql_error());
echo 'Création du flux effectuée.';
}
else echo 'Un flux portant ce nom existe déjà.';
}
//si le flux existe déjà, mais que l'on souhaite juste le màj
else
{
//sélection de tous les items du channel
$query="SELECT * FROM T_ITEM INNER JOIN TJ_CHANNEL_ITEM ON IT_ID=CI_IT_ID WHERE CI_CH_ID='".$filename."' ORDER BY IT_DATE DESC";
$query_item = mysql_query($query) or die('Erreur sélection item : '.mysql_error());

while($data_item = mysql_fetch_array($query_item))
addOneNews($memoryfile, $data_item['IT_TITRE'], $data_item['IT_DESC'], $data_item['IT_LIEN'], $data_item['IT_DATE'], $data_item['IT_AUTEUR'], $data_item['IT_ID']);
saveXML($memoryfile, $filename);
}
}
?>

V-B - Création d'une nouvelle

Nom du fichier utilisé : new_item.php

Ce script permet de créer une nouvelle. Il insère les informations passées par l'utilisateur dans la base de données puis appelle le fichier new_flux.php afin qu'il reconstruise le nouveau document XML avec la nouvelle ajoutée.

new_item.php

<?php
if(empty($filename)) echo 'Vous n\'avez pas encore créé de flux RSS';
else
{
if(empty($title) || empty($description))
echo 'Vous avez oublié de donner un titre à la nouvelle ou d\'en faire une description.';
else
{
date_default_timezone_set('Europe/Paris');//définit le fuseau horaire
$timestamp=date('r');

$description=nl2br($description);

//pour avoir une adresse conforme
if (substr($lien,0,7)!='http://') $lien='http://'.$lien;

//Ajout de l'item dans la base de données
mysql_query("INSERT INTO T_ITEM VALUES (NULL, ".quote_smart($title).",".quote_smart($description).",'".$lien."','".$timestamp."','".$author."')")
or die('Erreur insertion item :'.mysql_error());

//Correspondance item-channel
mysql_query("INSERT INTO TJ_CHANNEL_ITEM VALUES ('".$filename."','".mysql_insert_id()."')") or die('Erreur insertion channel item :'.mysql_error());

$query="SELECT CH_TITRE, CH_DESC FROM T_CHANNEL WHERE CH_ID='".$filename."'";
$result=mysql_query($query) or die('Erreur sélection channel-item: '.mysql_error());

$channel_title=mysql_result($result,0,0);//titre du flux
$channel_description=mysql_result($result,0,1);//description du flux
$new=0;//,car on ne souhaite pas créer de nouveau flux

//reconstruction du document XML
require_once(FONCTIONS_RSS_PATH.'new_flux.php');

echo 'Création de l\'item effectuée.';
}
}
?>

V-C - Suppression d'un flux

Nom du fichier utilisé : suppr_flux.php

Ce script supprime un flux RSS c'est-à-dire qu'il supprime le document XML ainsi que les informations se trouvant dans la base de données.

suppr_flux.php

<?php
if (!empty($filename))
{
//sélection des items correspondant au channel à supprimer
$query="SELECT CI_IT_ID FROM TJ_CHANNEL_ITEM WHERE CI_CH_ID='".$filename."'";
$result=mysql_query($query) or die('Erreur sélection channel-item: '.mysql_error());

//suppression des associations channel-item avant item et channel sinon non respect des contraintes d'intégrité
$delete_assoc="DELETE FROM TJ_CHANNEL_ITEM WHERE CI_CH_ID='".$filename."'";
mysql_query($delete_assoc) or die('Erreur suppression channel : '.mysql_error());

if (mysql_num_rows($result)!=0)//s'il y a au moins un item à supprimer
{
//création de la requête
$delete_items="DELETE FROM T_ITEM WHERE";
while ($row = mysql_fetch_row($result)) $delete_items.=" IT_ID='".$row[0]."' OR";
$delete_items=substr($delete_items, 0, -3);

//suppression des items correspondant au channel supprimé
mysql_query($delete_items) or die('Erreur suppression item : '.mysql_error());
}

//suppression du channel
$delete_flux="DELETE FROM T_CHANNEL WHERE CH_ID='".$filename."'";
mysql_query($delete_flux) or die('Erreur suppression channel : '.mysql_error());

unlink (PHY_RSS_PATH.$filename.'.xml');
echo 'Suppression du flux effectuée.';
}
?>

V-D - Suppression d'une nouvelle

Nom du fichier utilisé : suppr_item.php

Ce script assure la suppression d'une nouvelle dans un flux RSS.
En fait la nouvelle est effacée de la base de données puis le script de création d'un flux est appelé afin de reconstruire le flux RSS sans la nouvelle.

suppr_item.php

<?php
if (!empty($item))
{
//sélection des items correspondant au channel à supprimer
$query="SELECT CH_ID, CH_TITRE, CH_DESC
FROM TJ_CHANNEL_ITEM INNER JOIN T_ITEM ON CI_IT_ID=IT_ID INNER JOIN T_CHANNEL ON CI_CH_ID=CH_ID
WHERE CI_IT_ID='".$item."'";
$result=mysql_query($query) or die('Erreur sélection channel-item: '.mysql_error());

//suppression des items correspondant au channel supprimé
$delete_assoc="DELETE FROM TJ_CHANNEL_ITEM WHERE CI_IT_ID='".$item."'";
mysql_query($delete_assoc) or die('Erreur suppression item : '.mysql_error());

//suppression des items correspondant au channel supprimé
$delete_item="DELETE FROM T_ITEM WHERE IT_ID='".$item."'";
mysql_query($delete_item) or die('Erreur suppression item : '.mysql_error());

$filename=mysql_result($result,0,0);//nom du fichier
$channel_title=mysql_result($result,0,1);//titre du flux
$channel_description=mysql_result($result,0,2);//description du flux
$new=0;//,car on ne souhaite pas créer de nouveau flux

//reconstruction du document XML avec la news sélectionnée supprimée
require_once(FONCTIONS_RSS_PATH.'new_flux.php');

echo 'Suppression de l\'item effectuée.';
}
?>

V-E - Modification d'une nouvelle

Nom des fichiers utilisés : modif_item.php et interface_modif_item.php

La modification fait appel à deux pages, la première étant interface_modif_item.php.
Ce n'est rien d'autre qu'un formulaire prérempli avec les anciennes valeurs de la nouvelle sélectionnée.

interface_modif_item.php

<?php
require_once ('../constant.inc.php');
?>
<head>
<!--inclusion de la feuille de style pour le pied de page spécial-->
<link rel="stylesheet" href="<?php echo CSS_URL; ?>form.css" type="text/css" />
<style type="text/css" media="screen" title="Style Interface RSS">
@import url(<?php echo CSS_URL; ?>interface_rss.css) ;
</style>
</head>
<body>
<div id="centrer">
<div id="contenu">
<h2>Modification d'un flux RSS</h2>
<?php
if (isset($_GET['item'])) $item=$_GET['item'];
$query="SELECT IT_TITRE, IT_DESC, IT_LIEN, IT_AUTEUR FROM T_ITEM WHERE IT_ID='".$item."'";
$result=mysql_query($query) or die('Erreur sélection item: '.mysql_error());
?>
<form action="../gestion_flux.php" method="post">
<input type="hidden" name="type" value="modif_item" />
<input type="hidden" name="item" value="<?php echo $item; ?>" />
Titre :<br /><input type="text" name="title" class="input_text" value="<?php echo mysql_result($result,0,0);?>"/><br /><br />
Contenu :<br /><textarea name="description" rows="10" cols="102"><?php echo mysql_result($result,0,1);?></textarea><br /><br />
Lien vers l'article :<br /><input type="text" name="lien" class="input_text" value="<?php echo mysql_result($result,0,2);?>"/><br /><br />
Adresse mail de l'auteur :<br /><input type="text" name="author" class="input_text" value="<?php echo mysql_result($result,0,3);?>"/><br /><br />
<input type="submit" value="OK" />
</form>
</div>
</div>
</body>
</html>

La seconde page est celle qui fait le traitement : elle met à jour la base de données avec les nouvelles valeurs entrées par l'utilisateur et reconstruit le flux RSS (le document XML) en appelant le script new_flux.php :

modif_item.php

<?php
$query="UPDATE T_ITEM
SET IT_TITRE=".quote_smart($title).", IT_DESC=".quote_smart($description).", IT_LIEN='".$lien."', IT_AUTEUR='".$author."'
WHERE IT_ID='".$item."'";
$result=mysql_query($query) or die('Erreur maj item: '.mysql_error());

//on récupère le channel auquel appartient l'item
$query="SELECT CH_ID, CH_TITRE, CH_DESC FROM T_CHANNEL INNER JOIN TJ_CHANNEL_ITEM ON CH_ID=CI_CH_ID
INNER JOIN T_ITEM ON CI_IT_ID=IT_ID
WHERE IT_ID='".$item."'";
$result=mysql_query($query) or die('Erreur sélection channel-item: '.mysql_error());

//le flux $filename créer n'est pas nouveau
$new=0;
$filename=mysql_result($result,0,0);
$channel_title=mysql_result($result,0,1);
$channel_description=mysql_result($result,0,2);

//reconstruction du document XML
require_once(FONCTIONS_RSS_PATH.'new_flux.php');

echo 'Voici les nouvelles valeurs pour cette nouvelle :<br /><br />
<strong>Titre</strong> : '.$title.'<br /><br />
<strong>Description</strong> : '.$description.'<br /><br />
<strong>Lien</strong> : '.$lien.'<br /><br />
<strong>Auteur</strong> : '.$author.'<br /><br />';

echo 'Modification de l\'item effectuée.';
?>

VI - Affichage d'un flux

Cette page est simplement un exemple de l'utilisation de la fonction detect_rss.php.
Cette fonction est à placer entre les balises head du code HTML.
Elle regarde dans le dossier défini dans constant.inc.php comme étant le répertoire contenant les flux RSS s'il y a des flux RSS et s'il y en a, il crée une balise meta pour chacun d'entre eux.

<?php require_once 'constant.inc.php';?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--définition du DOCTYPE et de la méthode de sortie : XHTML-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<!--/\/\/\/\/\/\/\/\/\/\-->
<!--    page Flux RSS    -->
<!--\/\/\/\/\/\/\/\/\/\/-->
<head>
<title>Page de flux RSS</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<?php
//inclusion du fichier détectant les flux RSS
require_once (FONCTIONS_PATH.'detect_rss.php');
?>
</head>
<body>
Page d'exemple contenant des flux RSS
</body>
</html>

VII - Conclusion

Vous l'aurez compris, ce petit tuto est un ensemble de scripts qui, mis bout à bout, pourront vous permettre de gérer facilement vos flux RSS.
Bien évidemment, comme dit en introduction, ce tuto ne s'adresse qu'à des personnes ayant des sites de petite, voire moyenne taille générant peu de flux RSS.
Dans le cas contraire, il faudrait mettre en place un système créant automatiquement les flux RSS en fonction des nouvelles pages créées sur un site… dans un prochain tuto peut-être :)

VIII - Téléchargements

Voici donc le tutoriel complet disponible en téléchargement par FTP ou bien par HTTP.