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 tutorial et à Aspic pour la correction orthographique ;).

I-B. Préambule

Ce tutorial repose en partie sur celui de wichtounet : Création d'un système RSS pour vos news avec PHP 4 et 5Cré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 tutorial, nous faisons appel à des styles CSS et des scripts Javascript qui sont disponibles dans le code source à la fin du tutorial 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
Sélectionnez
/*==============================================================*/
/* 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 :

 
Sélectionnez
Contenu de constant.inc.php
Sélectionnez
<?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 script 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 feuilles de style CSS
define ('IMAGES_URL', SITE_URL.'images/');//lien vers le doosier 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'un 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 tutorial.
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 4 formulaires HTML qui permettent, chacun, de réaliser une action.

Les 4 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
Sélectionnez
<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
Sélectionnez
<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
Sélectionnez
<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
Sélectionnez
<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éer';		
    ?>  	
  </form>
</div>

IV-E. Le traitement des formulaires

Comme vous l'avez sûrement constaté, les 4 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éé sans changer de page (permet d'éviter les allers-retours entre pages).

Traitement des formulaires
Sélectionnez
<?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'un 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 par 
      //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 tutorial 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ème (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
Sélectionnez
<?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ère afin qu'elle ne contiennent pas d'espace ou de caractères accentuées
  $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
Sélectionnez
<?php 
if(empty($filename)) echo 'Vous n\'avez pas encore créer de flux RSS';
else
{
  if(empty($title) || empty($description)) 
    echo 'Vous avez oublier 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
Sélectionnez
<?php
if (!empty($filename))
{
  //sélection des item 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 item 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
Sélectionnez
<?php
if (!empty($item))
{
  //sélection des item 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 item 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 item 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 à 2 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
Sélectionnez
<?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
Sélectionnez
<?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.

 
Sélectionnez
<?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 tutorial complet disponible en téléchargement par FTP ou bien par HTTP.