Partage
  • Partager sur Facebook
  • Partager sur Twitter

Passer du xml en variable javascript

Avec AJAX en bonus !

Sujet résolu
    11 mars 2010 à 0:25:56

    Bonsoir à tous !

    Toujours dans l'optique d'apprendre et de comprendre, j'ai trouvé une nouvelle idée (idée à la .. je vous laisse deviner la suite :p)
    Alors comme d'habitude, je m'entraîne sur ce tutoriel

    L'idée du jour consiste à récupérer une variable php de la transformer en variable javascript et après d'afficher son résultat sous la forme d'un alert(maVaR);

    Alors, le début se passe bien par contre l'affichage c'est une autre histoire ! Je vous montre :

    Tout d'abord le fichier.php qui génère le xml de la requête AJAX :

    <?php
    
    header("Content-Type: text/xml");
    echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    echo "<list>";
    
    $idEditor = (isset($_POST["IdEditor"])) ? htmlentities($_POST["IdEditor"]) : NULL;
    
    if ($idEditor) {
    	mysql_connect($hote, $login, $m_d_p);
    	mysql_select_db($bdd);
    	
    	$query = mysql_query("SELECT * FROM ajax_example_softwares WHERE idEditor=" . mysql_real_escape_string($idEditor) . " ORDER BY name");
    	while ($back = mysql_fetch_assoc($query)) {
    		echo "<item id=\"" . $back["id"] . "\" name=\"" . $back["name"] . "\" />";
    	}
    }
    
    echo "</list>";
    


    Alors pour le fun j'ai envie de récupérer la variable $back["name"].
    Donc je fais :

    var test = "<?php echo $back01["name"]; ?>";
    alert(test);
    


    Et le problème arrive ! J'ai essayé de mettre ce code sur la page .html affichée, ou encore dans le .js appelant la requête xmlhttprequest et formatant les données xml. Mais au final je ne reçois pas mon alert ! Alors je vous demande, s'il vous plaît, où dois-je le placer pour que ça fonctionne?=)

    Merci par avance !
    • Partager sur Facebook
    • Partager sur Twitter
      11 mars 2010 à 0:58:15

      Alors je pense que si ta page est en ".html" c'est normale que sa fonctionne pas puisqu'il faut que ta page soit en ".php" pour pouvoir y mettre du code php et donc ici "<?php echo $back01["name"]; ?>"
      • Partager sur Facebook
      • Partager sur Twitter
      $2b||!$2b
        11 mars 2010 à 1:23:01

        Ouaip désolé je me suis mal exprimé ma page résultante est bien en .php pardon :)

        En fait, je me rends compte que ce que je veux faire n'est pas possible comme je l'ai décrit plus haut, donc pour retourner la question autrement.
        J'aimerai mettre dans une variable Javascript la valeur de <item name =""> voilà :)
        • Partager sur Facebook
        • Partager sur Twitter
          11 mars 2010 à 3:36:21

          Citation : skuti

          Alors je pense que si ta page est en ".html" c'est normale que sa fonctionne pas puisqu'il faut que ta page soit en ".php" pour pouvoir y mettre du code php


          Mon dieu... Ne sort pas des bêtises pareilles x)
          Apache (une fois configuré) sait très bien envoyer au module PHP le code de la page même si l'extension est en .html.


          Gravite -> On répète bien trop souvent sur ce forum comment on transmet le contenu des variables PHP aux variables JS, y'a une fonction recherche et elle n'est pas là pour rien.

          Bref, avec le code PHP ça donne ceci :

          <?php $maVariablePHP = 'test'; ?>
          
          <script type="text/javascript">
            var maVariableJS = '<?php echo $maVariablePHP ?>';
          </script>
          


          Une fois le PHP exécuté tu obtiens ceci :

          <script type="text/javascript">
            var maVariableJS = 'test';
          </script>
          


          Ce qui affecte bien la valeur 'test' à ta variable JS.
          • Partager sur Facebook
          • Partager sur Twitter
            11 mars 2010 à 3:52:17

            Nes' t'as oublié les guillemets autour de la chaîne JS ;)


            var maVariableJS = "<?php echo $maVariablePHP ?>";
            • Partager sur Facebook
            • Partager sur Twitter
              11 mars 2010 à 3:54:54

              Woops, effectivement, merci :) .
              • Partager sur Facebook
              • Partager sur Twitter
                11 mars 2010 à 3:58:37

                Allez va te coucher maintenant :)
                • Partager sur Facebook
                • Partager sur Twitter
                  11 mars 2010 à 8:17:05

                  Et vous avez oublié le addslashes :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 mars 2010 à 9:41:16

                    @Nesquik69 : en fait si tu regardes bien mon premier post, tu constateras que j'ai déjà écrit un code pour transmettre une variable php en javascript.

                    Néanmoins, en relisant ce que j'ai écrit (et après quelques recherches et lumières !), je me suis rendu compte que mon problème est ailleurs, donc je vais tâcher de réexpliquer.

                    Lors de la requête en AJAX je fais appel à un fichier.php (que l'on peut voir dans le premier post), celui-ci a pour but de me générer une page xml (et c'est tout là le problème). Etant donné que ça me génère une page.xml je ne peux pas sortir de variables php pour les traduire en javascript.

                    Ensuite la fonction readData en javascript :

                    function readData(oData) {
                    	var nodes   = oData.getElementsByTagName("item");
                    	var oSelect = document.getElementById("softwaresSelect");
                    	var oOption, oInner;
                    	
                    	oSelect.innerHTML = "";
                    	for (var i=0, c=nodes.length; i<c; i++) {
                    		oOption = document.createElement("option");
                    		oInner  = document.createTextNode(nodes[i].getAttribute("name"));
                    		oOption.value = nodes[i].getAttribute("id");
                    		
                    		oOption.appendChild(oInner);
                    		oSelect.appendChild(oOption);
                    	}
                    }
                    


                    Elle traite ce xml et me permet alors de l'intégrer sous la forme de mon choix (ici un menu select). Cependant, j'aimerai pouvoir récupérer sous la forme d'une variable javascript une valeur contenue dans un attribut XML (par exemple l'attribut que j'ai appelé name).

                    J'espère que c'est plus clair :/ J'avais mal sondé mon problème initial j'en suis désolé.

                    Comment pourrais-je faire cela? :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 mars 2010 à 10:29:10

                      var test; // au début, pour la mettre en variable globale (hors de toutes les fonctions)
                      
                      //Dans la fonction readData
                      test = node.getAttribute("name"); // assigne la valeur de l'attribut à la variable test disponible ensuite hors de la fonction
                      
                      
                      alert(test); // après avoir exécuté la fonction
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 mars 2010 à 10:51:58

                        Merci, cependant je n'obtiens rien après l'ajout de ce code.

                        J'ai placé var test; au tout début de requestdatas.js (qui lui-même est inséré dans ma page principale menu.php par :

                        <script type="text/javascript" src="requestdatas.js"></script>
                        


                        J'ai donc ensuite mis :

                        test = node.getAttribute("name");
                        


                        Dans la fonction readData contenue dans le fichier requestdatas.js
                        Puis j'ai essayé de placer le alert(test); dans ma page principale mais sans grand succès.
                        Le alert apparaît, mais il est vide (enfin je me tape undefined) Et pourtant il me semble être exécuté après la requête AJAX renvoyant les données avec ma fonction ReadData.

                        Où est-ce que j'ai encore merdé? :p

                        Edit : après quelques essais à droite et à gauche. Je suis tenté de croire que la ligne :

                        test = node.getAttribute("name");
                        


                        Eh ben il lui manque un truc où j'y applique mal quelque chose :/
                        Il y a déjà la ligne :

                        oInner  = document.createTextNode(nodes[i].getAttribute("name"));
                        


                        Est-ce que ça ne fait pas conflit par hasard? Enfin j'ai tenté de chaner le nom de l'attribut et donc d'en ajouter dans mon fichier.php générant le xml mais sans résultat positif ^^

                        Second edit : ma console d'erreur indique :

                        Erreur : nodes.getAttribute is not a function
                        Fichier Source : http://localhost/Liag%20Web/requestdatagame.js
                        Ligne : 35

                        Voilà mon code :

                        function readData(oData) {
                        	var nodes   = oData.getElementsByTagName("item");
                        	var oSelect = document.getElementById("game");
                        	var oOption, oInner;
                        	
                        	oSelect.innerHTML = "";
                        	for (var i=0, c=nodes.length; i<c; i++) {
                        		oOption = document.createElement("option");
                        		oInner  = document.createTextNode(nodes[i].getAttribute("name"));
                        		oOption.value = nodes[i].getAttribute("class");
                        		
                        		oOption.appendChild(oInner);
                        		oSelect.appendChild(oOption);
                        	}
                        	test = nodes.getAttribute("testt");
                        }
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          11 mars 2010 à 23:02:32

                          Citation : Golmote

                          Allez va te coucher maintenant :)


                          Je fais ce que je veux d'abord §
                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 mars 2010 à 23:07:49

                            Arrête de flooder !

                            Arrête de jouer à Battle-je-sais-pas-quoi, 'spèce de gamer ! :o

                            Viens jouer à osuuuu! :D
                            • Partager sur Facebook
                            • Partager sur Twitter
                              11 mars 2010 à 23:16:33

                              Nan, je reste sur Battlefield Bad Company 2 là :D !
                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 mars 2010 à 0:09:55

                                Me revoilà !

                                Après diverses recherches (qui m'ont mené plus ou moins dans le mur !:p), je bloque sur l'erreur retournée par la console (Erreur : nodes.getAttribute is not a function) et je suis incapable de comprendre ce qu'il me dit !

                                J'ai essayé diverses tentatives mais toutes ont été infructueuses, pourtant je parie que c'est tout con (ou ptête pas finalement !).

                                Si quelqu'un pouvait m'orienter sur une piste ou un bout de solution sur ce que j'ai mal fait dans ce que birdy42 m'a conseillé de faire, je lui en serai reconnaissant, merci :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  12 mars 2010 à 0:33:30

                                  nodes, c'est un tableau d'éléments...

                                  Tu ne peux pas faire un getAttribute() sur un tableau.

                                  Mais tu peux surement le faire sur les éléments de ce tableau...
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    12 mars 2010 à 1:46:54

                                    Ah c'est cool j'avance petit à petit ! :)

                                    Ca marche enfin (grand cri de joie ^^). Une fois de plus c'est un bout de code misérable qui me fait la misère !

                                    test = nodes[i].getAttribute("name");
                                    


                                    Bon maintenant il faut que je comprenne, comment faire en sorte de récupérer la bonne valeur et non pas la dernière de la liste ahem =)

                                    Un node pour ce que j'en ai compris ça fonctionne comme un array, donc ça débute à 0, ainsi si j'ai trois données a, b et c node [0] = a et ainsi de suite. Je me suis dis, bhaa je vais récupérer la value de <option> comment ça, ça va attribuer la bonne valeur de l'attribut :

                                    var searchtypegame = document.getElementById("game");
                                    var option_selectionnee = searchtypegame.options[searchtypegame.selectedIndex];
                                    var name = option_selectionnee.value;
                                    	test = nodes[name].getAttribute("name");
                                    


                                    Mais je me rends compte après l'avoir tapé que c'est très bête vu que la value, ne vaut pas forcément le numéro adéquat et puis ça ne semble pas fonctionner.
                                    L'idéal ça serait que quand on sélectionne une option ça lui affecte la valeur qui la concerne. Enfin que j'arrive à déterminer le numéro node[] qui lui est attaché, mais alors là je suis de nouveau parti à la pêche :D

                                    PS : en tout cas merci déjà pour la piste au-dessus, j'ai avancé déjà beaucoup rien qu'avec ta phrase comparé au temps que j'ai passé à chercher lol :(

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      12 mars 2010 à 10:49:13

                                      Citation : Gravite

                                      Bon maintenant il faut que je comprenne, comment faire en sorte de récupérer la bonne valeur et non pas la dernière de la liste ahem =)



                                      Tu peux être plus précis là-dessus et illustrer avec un code ?

                                      Ca pue le problème de closure, mais je préfèrerais vérifier.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        12 mars 2010 à 13:01:09

                                        à première vue il met le truc dans la boucle. Du coup, ça met à la variable test la dernière valeur (évidemment)
                                        Donc faut mettre une condition dans la boucle quand c'est la bonne valeur ! \o/
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          12 mars 2010 à 15:36:52

                                          En effet mon problème semble concerner les closures. Je ne connaissais pas du tout ça, j'ai donc commencé à me documenter sur le sujet et ça semble pouvoir réaliser ce que je désire mais je n'ai pas de solutions encore, donc je posterai le code que j'aurai trouvé par la suite :)

                                          Pour faire simple en terme d'exemple là : j'ai une liste déroulante générée par cette fonction :
                                          function readData(oData) {
                                          	var nodes   = oData.getElementsByTagName("item");
                                          	var oSelect = document.getElementById("game");
                                          	var oOption, oInner;
                                          	
                                          	oSelect.innerHTML = "";
                                          	for (var i=0, c=nodes.length; i<c; i++) {
                                          		oOption = document.createElement("option");
                                          		oInner  = document.createTextNode(nodes[i].getAttribute("name"));
                                          		oOption.value = nodes[i].getAttribute("class");
                                          		test = nodes[i].getAttribute("testt");
                                          		oOption.appendChild(oInner);
                                          		oSelect.appendChild(oOption);
                                          	}
                                          	
                                          }
                                          


                                          Sachant que j'ai déclaré var test =''; en globale. Mon but est de récupérer la valeur de l'attribut testt en fonction de l'option sélectionnée.
                                          Bien entendu, comme quand en PhP on fait une boucle avec un $test = mysql_fetch_array($selectbdd); et qu'on tente de récupérer la valeur de $test[''], on obtient alors la dernière valeur qu'aura reçu la variable. Or là il faut que je puisse déterminer le numéro node[] de l'option que l'on sélectionne pour garder sa valeur (et non pas que la boucle continue à tourner jusqu'à me refiler la dernière valeur).

                                          Je pense que les closures sont la solution, mais je dois capter un peu plus comment ça fonctionne avant de poser d'autres questions stupides (désolé :p). Enfin ça se trouve je trouverai la solution par moi-même.

                                          @Birdy42 : pour la boucle c'est ptête une idée, mais je ne vois pas exactement comment encore :)

                                          Par contre, là je viens de réaliser quelque chose d'impensable ! Le code que j'ai fait fonctionner hier soir, ne fonctionne plus (elle est pas mal celle-là non? :p). En fait je me rends compte que le navigateur a fumé (FireFox), car je teste sous un autre navigateur (IE haha :s) et la résultat reste toujours correct. En fait j'ai remarqué que des fois il y a des erreurs comme ça, or le code est bon mais ça indique que non et ça fait douter, vous sauriez d'où ça peut venir?

                                          Sachant que la seule soluce reste de redémarrer FireFox (bon ce n'est pas très grave), mais ça reste assez troublant de penser que ça ne fonctionne plus, alors que c'est le cas mais pour une raison inconnue il me dit le contraire.

                                          Une fois de plus merci pour vos commentaires qui me sont très profitables :)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            12 mars 2010 à 16:12:55

                                            Est-ce que tu as une erreur dans la console d'erreurs ? (Outils > Console d'erreurs dans Firefox; Clic sur le petit triangle jaune en bas à gauche > Détails dans IE)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              12 mars 2010 à 17:03:23

                                              @birdy : tu la génères automatiquement cette phrase ? ^^

                                              @Gravite : Alors si j'ai bien compris, c'est pas un problème de closure en fait.

                                              Tu veux que la variable test prenne la valeur du name de l'option sélectionnée, à chaque fois qu'on sélectionne une autre option, quoi ? Si c'est le cas, il faut utiliser l'événement onchange sur le select. (Y'aura bien une closure d'utilisée, mais la façon de faire est quand même différente...)
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                12 mars 2010 à 17:12:39

                                                @Birdy42 En fait, IE ne me renvoyait rien dans sa console et Firefox m'indiquait une erreur avec un code source qui n'était plus présent (comme un problème de conserver mon code source en mémoire et de ne plus l'actualiser en fait).

                                                @Golmote : En effet, je désire faire ça comme tu as dit avec l'évènement onchange, j'ai lu un peu le net. J'ai matté le tuto de Darkodam sur le SdZ, mais pour l'instant je suis toujours en grande réflexion de comment que je vais bien pouvoir faire ça :p

                                                J'ai besoin de pouvoir récupérer des données précises dans ma bdd et les générer sous forme d'attribut = 'valeur' en xml par le biais d'une page.php (ça c'est fait).
                                                La requête AJAX récupère donc mon XML puis ma fonction readData permet de former le formulaire select avec les options adéquates.

                                                Je cherchai donc le moyen de récupérer sous formes de variables Javascript les valeurs de mes attributs (ça c'est presque fait ! :p),

                                                test = nodes[i].getAttribute("testt");
                                                


                                                C'est un succès à la seule exception que j'arrive à récupérer que la dernière valeur uniquement, normal la boucle exécute toute ma liste d'options. Et donc je n'ai pas encore trouvé comment lui faire comprendre que je voudrais la valeur d'un attribut d'une option spécifique (quand l'utilisateur le choisi donc l'évènement onchange en effet).

                                                Je propose un petit exemple histoire que je puisse éclaircir mon problème :

                                                j'ai placé dans ma bdd un champ qui a pour nom champbidon ce champ va par exemple contenir uniquement 1 ou 0. Ensuite quand je vais faire ma page.php générant mon xml ça va donner ça :

                                                echo "<item testt=\"" . $back01["champbidon"] . "\" class=\"" . $back01["id"] . "\" name=\"" . $back01["jeu"] ."\" />";
                                                


                                                Du coup ma fonction Javascript readData va me former un joli formulaire de type select (j'arrive à récupérer à l'heure actuelle uniquement la dernière valeur générée).
                                                Je cherche à récupérer la valeur contenue dans l'attribut testt pour une option donnée (onchange). J'espère que c'est plus clair ainsi :)

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  12 mars 2010 à 17:48:59

                                                  Bon bah si c'est un onchange que tu veux, c'est comme ça :

                                                  function readData(oData) {
                                                      var nodes = oData.getElementsByTagName("item");
                                                      var oSelect = document.getElementById("game");
                                                      var oOption, oInner;
                                                  
                                                      oSelect.innerHTML = "";
                                                      oSelect.onchange = function () {
                                                          test = nodes[this.selectedIndex].getAttribute("testt");
                                                      };
                                                      for (var i = 0, c = nodes.length; i < c; i++) {
                                                          oOption = document.createElement("option");
                                                          oInner = document.createTextNode(nodes[i].getAttribute("name"));
                                                          oOption.value = nodes[i].getAttribute("class");
                                                          oOption.appendChild(oInner);
                                                          oSelect.appendChild(oOption);
                                                      }
                                                  }
                                                  


                                                  Normalement ta variable test aura constamment la valeur de l'attribut "testt" du noeud correspondant à l'option sélectionnée.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    12 mars 2010 à 17:55:38

                                                    Un grand merci à toi ! C'est parfait ! :) (dire que c'était aussi simple (enfin un code court mais efficace) bhouu ^^)

                                                    Bon j'espère ne plus revenir vous embêter avant un bout de temps !
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      13 mars 2010 à 1:21:45

                                                      >>@birdy : tu la génères automatiquement cette phrase ? ^^

                                                      évidemment :p c'était un des conneries d'user scripts à xavierm ;)
                                                      Du coup, même si y a besoin que de la moitié dans le topic je mets tout :D
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        13 mars 2010 à 2:34:29

                                                        Citation : birdy42

                                                        évidemment :p c'était un des conneries d'user scripts à xavierm ;)



                                                        C'est quel userscript ? :-°
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          13 mars 2010 à 20:17:39

                                                          Je l'ai pas sur ce PC mais je te le MP dès que je l'ai (lundi si tout se passe bien ^^ )
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            14 mars 2010 à 0:41:33

                                                            Nan parce que si c'est le Menu des Fainéants... c'est pas une connerie de xav, c'est une des miennes :-°
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Passer du xml en variable javascript

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown