besoin d'aide pour modification dans un fichier XML

  • Auteur de la discussion Auteur de la discussion kenshuri
  • Date de début Date de début
Nouveau WRInaute
Bonjour à tous.

Je suis arriver à un point où je butte complètement.
J'appel à l'aide ! :oops:
Je souhaite supprimer un noeud d'un fichier XML sur une page ou je récupère les éléments <title> à l'aide d une boucle. Puis grâce à un lien html j'aimerais qu'avec un onclick cela supprime l'item parent.

Pour cela j'ai:
le fichier xml qui se présente comme ca:
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rss  version="0.91">
   <channel>
      <item>
         <title>Titre de ma news 1</title>
         <description>Contenu de ma news</description>
         <link>Lien facultatif</link>
         <pubDate>Date de publication</pubDate>
       </item>

       <item>
         <title>Titre de ma news 2</title>
         <description>Contenu de ma news 2</description>
         <link>Lien facultatif</link>
         <pubDate>Date de publication</pubDate>
       </item>

       <item>
         <title>Titre de ma news 3</title>
         <description>Contenu de ma news 3</description>
         <link>Lien facultatif</link>
         <pubDate>Date de publication</pubDate>
       </item>
   </channel>
</rss>

Affin de supprimer une de ces news j'ai une bibliothèque de fonction, avec, pour la suppression, dans un fichier XML.php:

Code:
<?php
class Xml {

   //--- propriétés ---
   private $dom ;                    // objet dom pour parser le document xml
   private $noeud ;                  // nom du noeud actuellement parcouru
   private $item ;                   // item actuel
   private $num ;                    // numero de l'item correspondant au noeud parcouru
   private $eob ;                    // fin de parcourt du noeud
   private $nomficxml="" ;              //  nom du fichier xml
   private $chaineXML ;              // nom de la chaine XML
     
//--- constructeur ---
   public function Xml ($chaineXML="") {
      $this->dom = new DomDocument();
	  if ($chaineXML != "") {
	     $this->chaineXML = $chaineXML ;
	     $this->dom->loadXML($chaineXML);
	  }
   }

   //--- chargement d'un fichier XML ---
   public function recupFic ($nomficxml) {
      $this->nomficxml = $nomficxml ;
      $this->dom->load($nomficxml);
   }
   
   //--- positionnement sur le premier noeud d'un nom précis ---
   public function premier ($item) {
      $this->noeud = $this->dom->getElementsByTagName($item) ;
	  $this->num = -1 ;
	  $this->item = $item ;
	  $this->eob = false;	 
	  $this->suivant () ; 
   }
   
   //--- lecture du noeud suivant ---
   public function suivant () {
      $this->num++ ;
      $this->eob = ($this->noeud->item($this->num)==null) ;
   }
   
   //--- récupération de l'information contenue dans un noeud ---
   public function info ($noeud) {
      return $this->noeud->item($this->num)->getElementsByTagName($noeud)->item(0)->firstChild->nodeValue ;
   }

//--- enregistrement dans un fichier XML ---
   public function eob () {
      return $this->eob;
   }


//--- suppression d'un noeud ---
   public function supprimer () { 
      $element = $this->noeud->item($this->num) ;
      $result = $this->dom->documentElement->removeChild($element);
	  $this->sauve () ;
   }
   

//--- enregistre le nouveau dom dans le fichier ou le document ---
   public function sauve () { 
      if ($this->nomficxml != "") { 
         $this->dom->save($this->nomficxml) ;
      } else {
         $this->dom->saveXML($this->chaineXML) ;
	  }
   }
   
}
?>

et enfin ma page de suppression pour le moment mais je n'arrive pas à aller plus loin, tout mes tests on était des échecs... :cry:
note: - la fonction Calque créer simplement une <div>
- la fonction Remplir sert à remplir la <div>

Code:
<?php
//creation d'un calque pour afficher les news à supprimer
$supprnews = new Calque ($id="suppr_news", 
					$left=390, 
					$top=20, 
					$width=375, 
					$height=450, 
					$align="left", 
					$centre=false, 
					$image,
					$color="", 
					$deplace=false, 
					$redim=false, 
					$efface=false, 
					$visible=true
					);
		
$xmlNews = new XML("");

$xmlNews -> recupFic($ficNews);

$contenusupprnews = "<span class='normalblanc' style='display: block ;margin-left: 10px;'>";

$contenusupprnews .= "<span style='display: block ;margin: 12px 0 0 0; text-align: center; '>Supprimer une news:<br /></span>";

$xmlNews -> premier ("item");

while (!$xmlNews->eob()) {
	                        $contenusupprnews .= "<strong>".$xmlNews->info("title")."</strong>"."  -> <a href='#' onclik=''>Supprimer cette news X</a><br />" ;
				$contenusupprnews .= "<br /><br />";
				$xmlNews -> suivant ("item");
				}

$contenusupprnews .= "</span>";
$supprnews ->Remplir($contenusupprnews);
$total .= $supprnews->getComplet();
?>

Je sèche complètement ! Après moultes essaies je n'y arrive vraiement pas :cry:
Quelqu'un pourrait il m'aiguiller s'il vous plait? :aie:
Merci beaucoup de votre aide !

Kenshuri.
 
WRInaute accro
Euh... C'est quoi la question? Comment faire pour qu'un clic sur un lien supprime un noeud? Ben tu crées un nouveau script (delete.php par exemple), qui prend comme paramètre le numéro de le l'item à supprimer, et qui va charger le fichier, faire une boucle sur les items du flux RSS jusqu'à trouver le bon, le supprimer, et sauvegarder. Pas besoin d'un onclick, un simple a href suffira...

Jacques.
 
Nouveau WRInaute
C'est ce que j'ai dus faire pour rajouter des <item> mais n'y aurait il pas un moyen de faire tout ça dans une seule et même page ??

Dans le cas ou j'opte pour cette méthode, avec le href cela va me faire changer de page, il faudra que je fasse une redirection dans la page delete.php pour retourner sur le menu de suppression non?

Pour la numération des <item>, sont-il 'auto-numérotés' ? ou dois-je leur attribué une id par exemple?

Merci.

Kenshuri
 
WRInaute accro
Ben la page elle est affichée sur le poste du client, et la modif doit être faite côté serveur, donc il doit forcément y avoir un appel au serveur pour qu'il fasse la modif. Maintenant:
- tu peux le faire dans le même script avec un argument particulier qui lui dit qu'au lieu d'afficher, il doit effacer quelque chose, mais tu ne vas pas forcément y gagner en clarté
- de toutes façons il va falloir réafficher la page pour montrer le résultat de l'opération, donc les trucs genre Ajax et compagnie ça ne me paraît pas forcément utile
- mais si tu veux vraiment le faire, il va falloir à la fois faire l'appel côté serveur et modifier l'affichage sur le poste du client.
- effectivement, c'est une bonne idée après le delete de faire un redirect (plutôt que de réafficher directement dans le même script), ça évite les problèmes de reload

Vu que dans le flux il n'y a pas d'ID, la meilleure solution est probablement d'utiliser un compteur qui est incrémenté à chaque passage dans la boucle (que ce soit à l'affichage pour créer le lien ou à la suppression pour trouver celui à effacer).

Je m'interroge par contre sur la pertinence de stocker tes données dans un flux RSS? Pourquoi ne pas mettre les données en base, et générer le flux RSS dynamiquement quand c'est nécessaire? Si ton flux grandit un tant soit peu, tu vas y gagner pas mal...

Jacques.
 
Nouveau WRInaute
Bonsoir Jacques,
Merci beaucoup de toutes ces précisions, ça m'éclaire beaucoup et j'arrive a concevoir l'algorithme.

Alors en faite je désire le faire dans un fichier xml, je pense que vous l'avez comprit, pour que sur le site je puisse stocker et afficher mes news, et, en même temps qu'elles soient générées dans un flux RSS afin de n'avoir qu'une seule chose à modifier.Je fais ainsi car je suis en 1ère année de BTS info et que mon TP doit se faire comme cela afin de ce familiariser avec AJAX.

Cela dit, il est vrai qu'un stockage en base de donnée sera largement moins lourd et beaucoup plus simple à la réalisation. D'autant plus que d'après vous il semblerai que l'on soit capable depuis la base de donnée de généré un flux RSS. Ça serait bien pratique et j'en prend note. De plus l'ajout de noeud se fait toujours apparemment dans un seul sens (du plus vieux au plus récent) et donc à moins de faire un script de lecture à l'envers le nouveau noeud sera afficher en dernier. Un problème que j'éviterai avec les bases de données dans le futur.

Merci encore.
Kenshuri.
 
WRInaute accro
Ben si tu dois faire de l'Ajax on est un peu à côté, là... Ceci dit, faire de l'Ajax ne t'interdit pas de stocker les choses en BDD.

Jacques.
 
Discussions similaires
Haut