Bonjour,
je suis en train de bosser sur une plate-forme de traduction, mais je rencontre un souci quand je veux mettre à jour un élément...
comme vous verrez dans le xml ci-après, je veux changer "stuff" (enfant de xmldata#misc) en une autre valeur...
en effet, j'ai le droit à une jolie exception NotFound quand j'essaye de remplacer l'ancien noeud de traduction par le nouveau... (quand il s'agit seulement de créer un nouveau noeud, le problème ne pose pas...)
cela signifie donc que l'ancien noeud n'est pas le fils du noeud appelant replaceChild...
bref, je vous copie-colle un minibout de fichier XML :
et la fonction qui est chargée de mettre à jour un élément de traduction (ou l'ajouter s'il n'existe pas encore dans la langue spécifiée)... (j'ai laissé volontairement un var_dump traîner)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE language SYSTEM "../config/lang/xmldoctype.dtd"> <language> <xmldata id="misc"> <translation lang="fr">truc</translation> <translation lang="en">stuff</translation> </xmldata> <xmldata id="test"> <translation lang="fr">test</translation> </xmldata> </language>
Le pire est que le test $item->lastChild == $oldTrans renvoie true alors que le replaceChild retourne une exception à cause de l'ancien noeud...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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<?php class Translator_Store_Xml extends Translator_Store{ [...] public function update($itemID, $lang, $newContent){ $manager = new XmlManager(); $manager->load($this->filename); $domfile = $manager->getDomFile(); $item = $domfile->getElementById($itemID); //check of the item existence if(is_null($item)) { throw new Exception("The id ".$itemID." is not existing - update cannot be done"); } //if the translation is already existing => update of the content $newTrans = $domfile->createElement('translation', ''); $newTrans->setAttribute('lang', $lang); $newTrans->nodeValue = Sydonie_Io::recodeText($newContent); if(!is_null($oldTrans = $this->read($itemID,$lang))) { var_dump($item->lastChild == $oldTrans); $item->replaceChild($newTrans,$oldTrans); } //otherwise, the translation is created else { $item->appendChild($newTrans); } //save of the changes $manager->update($domfile); $manager->save(); } [...] }
J'y perds un peu mon latin, donc si vous avez des idées...
Merci d'avance,
Rolf IV
PS : la classe XmlManager est pas standard mais faite maison...







Répondre avec citation

Partager