IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[DOM] Problème avec replaceChild (ou removeChild)


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 178
    Par défaut [DOM] Problème avec replaceChild (ou removeChild)
    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 :

    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>
    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
    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();
        }
    [...]
    }
    Le pire est que le test $item->lastChild == $oldTrans renvoie true alors que le replaceChild retourne une exception à cause de l'ancien noeud...

    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...

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 178
    Par défaut
    et pour ceux qui préfèrent les phrases alambiquées :

    replaceChild est appelé par le noeud parent normalement... donc s'il ne trouve pas le noeud à remplacer, ça veut dire que ce fameux noeud n'est pas le fils du noeud appelant... or dans un var_dump, je teste si le noeud à remplacer est bien le fils du noeud appelant, et ça renvoie true


    bref, si vous trouvez une info erronée dans cette phrase, c'est sûrement la source de mon problème...

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 178
    Par défaut
    sinon, quand je remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $item->replaceChild($newTrans,$oldTrans);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $oldTrans->parentNode->replaceChild($newTrans,$oldTrans);
    j'ai une erreur de type DOM_WRONG_DOCUMENT_ERR, et non plus de type DOM_NOT_FOUND.

    Il semblerait donc maintenant que ce soit le nouveau noeud qui pose problème...



    Arrrrrrrrrrrrrrrrrrrrrrrrrghement,
    Rolf IV

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 178
    Par défaut
    même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $oldTrans->parentNode->removeChild($oldTrans);
    ne modifie pas le fichier XML (après avoir enregistré les modifs via save, j'entends)...

    je n'y comprends plus riiiiiiiiiiiiieeeeeeeeeeeeeeeeeeeeeeeeen !!!

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 178
    Par défaut
    bon finalement,

    la seule solution que j'ai trouvé est de boucler de l'élément racine jusqu'à l'élément qu'on veut remplacer (plus la profondeur de l'élément est importante, plus il y a de boucles imbriquées :s)...

    ce sera sans doute pas le code de l'année, mais c'est bien la seule solution que j'aie trouvée...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JS][DOM] problème avec removeChild()
    Par Jonathan.b dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/01/2008, 11h48
  2. [DOM] Problème avec le tutoriel RSS
    Par Flashball dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 20/06/2007, 20h32
  3. [DOM] Problème avec appendChild
    Par it_bcn dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 16/02/2007, 13h12
  4. [DOM] Problèmes avec DOMDocument
    Par japey dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 23/05/2006, 13h45
  5. [DOM] problème avec replaceNode
    Par lusiole dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 17/05/2006, 12h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo