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

JavaScript Discussion :

[DOM] Menus déroulants dynamiques par groupes


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 5
    Points
    5
    Par défaut [DOM] Menus déroulants dynamiques par groupes
    Bonjour à vous!

    Je me suis basé sur le tuto d'ajax ICI MEME pour faire deux menus déroulant et dynamique.

    Je vous explique rapidement :

    Au lieu d'avoir deux tables (Livre, et Auteurs) je n'en ai qu'une : Bibliotheque

    Elle est composé des champs suivants :

    Code - NomAuteur - Livre
    ------------------
    1 - Mr A. - AAA
    2 - Mr A. - BBB
    3 - Mr A. - CCC
    4 - Mr A. - DDD
    5 - Mr B. - EEE
    6 - Mr B. - FFF
    7 - Mr B. - GGG
    8 - Mr C. - HHH


    Voici mes codes source :

    auteurs.php
    <html>
    <head>
    <title>Tutoriel Ajax (XHTML + JavaScript + XML)</title>
    <script type='text/javascript'>

    function getXhr(){
    var xhr = null;
    if(window.XMLHttpRequest) // Firefox et autres
    xhr = new XMLHttpRequest();
    else if(window.ActiveXObject){ // Internet Explorer
    try {
    xhr = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    }
    else { // XMLHttpRequest non supporté par le navigateur
    alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    xhr = false;
    }
    return xhr;
    }

    /**
    * Méthode qui sera appelée sur le click du bouton
    */
    function go(){
    var xhr = getXhr();
    // On défini ce qu'on va faire quand on aura la réponse
    xhr.onreadystatechange = function(){
    // On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    if(xhr.readyState == 4 && xhr.status == 200){
    leselect = xhr.responseText;
    // On se sert de innerHTML pour rajouter les options a la liste
    document.getElementById('livre').innerHTML = leselect;
    }
    }

    // Ici on va voir comment faire du post
    xhr.open("POST","ajaxLivre.php",true);
    // ne pas oublier ça pour le post
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    // ne pas oublier de poster les arguments
    // ici, l'id de l'auteur
    sel = document.getElementById('auteur');
    code = sel.options[sel.selectedIndex].value;
    xhr.send("Code="+code);
    }
    </script>
    </head>
    <body>
    <form>
    <fieldset style="width: 500px">
    <legend>Liste liées</legend>
    <label>Auteurs</label>
    <select name='auteur' id='auteur' onchange='go()'>
    <option value='-1' >Aucun</option>
    <?
    mysql_connect("localhost","XXXXX","XXXXXX");
    mysql_select_db("test");
    $res = mysql_query("SELECT * FROM Bibliotheque");
    while($row = mysql_fetch_assoc($res)){
    echo "<option value='".$row["Code"]."'>".$row["NomAuteur"]."</option>";
    }
    ?>
    </select>
    <label>Livres</label>
    <div id='livre' style='display:inline'>
    <select name='livre'>
    <option value='-1'>Choisir un auteur</option>
    </select>
    </div>
    </fieldset>
    </form>
    </body>
    </html>

    AjaxLivre.php
    <?php
    echo "<select name='livre'>";
    if(isset($_POST["Code"])){
    mysql_connect("localhost","XXXXXX","XXXXXXXX");
    mysql_select_db("test");
    $res = mysql_query("SELECT Livre FROM Bibliotheque
    WHERE Code=".$_POST["Code"]."") or die('Erreur SQL !<br>'.$res.'<br>'.mysql_error());
    while($row = mysql_fetch_assoc($res)){
    echo "<option value='".$row["Code"]."'>".$row["Livre"]."</option>";
    }
    }
    echo "</select>";
    ?>
    Tel Quel, le code fonctionne mais n'est pas très pratique.

    En effet, dans le premier menu j'ai plusieurs fois le même auteur et les livres sont bien associés.

    Mon soucie est le suivant.

    J'aimerais regrouper les auteurs dans mon premier menu.
    Pour cela je vais utiliser l'option GROUP BY dans mon sql

    dans auteurs.php
    $res = mysql_query("SELECT * FROM Bibliotheque GROUP BY NomAuteur");
    Mais j'aimerai aussi pouvoir afficher tous les livre de l'auteur choisis dans mon second menu déroulant.

    ex: Choisir Mr.B et voir dans mon second menu EEE - FFF - et GGG

    j'ai pensé donc remplacer la valeur de ma liste d'auteur.
    A la place d'être indexé par le "Code", je pense qu'il est préférable de le référencer par le "NomAuteur"
    j'ai donc fait ces modifs très simples :

    auteurs.php
    <html>
    <head>
    <title>Tutoriel Ajax (XHTML + JavaScript + XML)</title>
    <script type='text/javascript'>

    function getXhr(){
    var xhr = null;
    if(window.XMLHttpRequest) // Firefox et autres
    xhr = new XMLHttpRequest();
    else if(window.ActiveXObject){ // Internet Explorer
    try {
    xhr = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    }
    else { // XMLHttpRequest non supporté par le navigateur
    alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    xhr = false;
    }
    return xhr;
    }

    /**
    * Méthode qui sera appelée sur le click du bouton
    */
    function go(){
    var xhr = getXhr();
    // On défini ce qu'on va faire quand on aura la réponse
    xhr.onreadystatechange = function(){
    // On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    if(xhr.readyState == 4 && xhr.status == 200){
    leselect = xhr.responseText;
    // On se sert de innerHTML pour rajouter les options a la liste
    document.getElementById('livre').innerHTML = leselect;
    }
    }

    // Ici on va voir comment faire du post
    xhr.open("POST","ajaxLivre.php",true);
    // ne pas oublier ça pour le post
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    // ne pas oublier de poster les arguments
    // ici, l'id de l'auteur
    sel = document.getElementById('auteur');
    nomauteur = sel.options[sel.selectedIndex].value;
    xhr.send("NomAuteur="+nomauteur);
    }
    </script>
    </head>
    <body>
    <form>
    <fieldset style="width: 500px">
    <legend>Liste liées</legend>
    <label>Auteurs</label>
    <select name='auteur' id='auteur' onchange='go()'>
    <option value='-1' >Aucun</option>
    <?
    mysql_connect("localhost","XXXXX","XXXXXX");
    mysql_select_db("test");
    $res = mysql_query("SELECT * FROM Bibliotheque");
    while($row = mysql_fetch_assoc($res)){
    echo "<option value='".$row["NomAuteur"]."'>".$row["NomAuteur"]."</option>";
    }
    ?>
    </select>
    <label>Livres</label>
    <div id='livre' style='display:inline'>
    <select name='livre'>
    <option value='-1'>Choisir un auteur</option>
    </select>
    </div>
    </fieldset>
    </form>
    </body>
    </html>
    AjaxLivre.php
    <?php
    echo "<select name='livre'>";
    if(isset($_POST["NomAuteur"])){
    mysql_connect("localhost","XXXXXX","XXXXXX");
    mysql_select_db("test");
    $res = mysql_query("SELECT Livre FROM Bibliotheque
    WHERE NomAuteur=".$_POST["NomAuteur"]." ORDER BY Livre") or die('Erreur SQL !<br>'.$res.'<br>'.mysql_error());
    while($row = mysql_fetch_assoc($res)){
    echo "<option value='".$row["Code"]."'>".$row["Livre"]."</option>";
    }
    }
    echo "</select>";
    ?>
    Malheureusement cela ne fonctionne pas.

    Sauriez vous pourquoi?

    Cela fait maintenant quelques semaines que je buche dessus mais la je seche.

    Merci pour votre comprehention.

    Dari.

  2. #2
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    En fait il faudrait que, à la sélection de l'auteur tu exécutes une fonction javascript(AJAX) qui va ajouter les noms des livres dans le second SELECT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <select name='livre' onclick="getLivres()">
    Dans la page HTML ou PHP , inlcue cette ligne pour inclure la page .js contenant le code plus bas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script type="text/javascript" src="./fonction.js"></script>
    Tu crées une page (ici fonction.js) avec ce code (possible qu'il y ait des erreurs):
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <?php
     
    ?>
    <SCRIPT LANGUAGE="JavaScript">
     
    function getXhrTrap(){
    	if(window.XMLHttpRequest) // Firefox et autres
    	   var xhrT = new XMLHttpRequest();
    	else if(window.ActiveXObject){ // Internet Explorer
    	   try {
                    var xhrT = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                    var xhrT = new ActiveXObject("Microsoft.XMLHTTP");
                }
    	}
    	else { // XMLHttpRequest non support2 par le navigateur
    	   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    	   var xhrT = false;
    	}
    	return xhrT;
    }
     
    function getLivres() {
     
    //Passe le nom de l'auteur en parametre de l'url
    var arg = 'ICI_URL_DE_LA_PAGE&nomAuteur='+nomAuteur;
     
     
    	var xhrT = getXhrTrap();
     
    	xhrT.open("POST","./PAGEREQUETE.PHP",true);
    	xhrT.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhrT.send(arg);
     
    	// On defini ce qu'on va faire quand on aura la reponse
    	xhrT.onreadystatechange = function()
    	{	
    		// On ne fait quelque chose que si on a tout recu et que le serveur est ok
    		if(xhrT && xhrT.readyState == 4 && xhrT.status == 200 && xhrT.responseXML)
    		{
    			reponseT = xhrT.responseXML.documentElement;
    			var livres = reponseT.getElementsByTagName("livres");
    //la tu recuperes le select dans lequel tu veux ajouter des elements
    var selbox = document.getElementById("NOMDUSELECTDELIVRE");
     
     
    				for (var i = 0 ; i < livres.length ; i++) {
    					var srv = livres[i];
    					var nomLivres = srv.getElementsByTagName("nomAuteur")[0].firstChild.nodeValue;
     
    //La tu ajoutes les livres dans le SELECT
    new_elem = new Option(name,i);
    				selbox.options[selbox.length] = new_elem;
    				}
    		}
    	}
    	}
    }
    </SCRIPT>
    Ensuite la page php (correspond a PAGEREQUETE.PHP) qui executeras la requete et créera ton fichier xml dans le DOM.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $buffer  = '<?xml version="1.0"?>';
    	$buffer .= '<liste>';
    mysql_connect("localhost","XXXXX","XXXXXX");
    mysql_select_db("test");
    $res = mysql_query("SELECT livre FROM Bibliotheque WHERE nomAuteur ="'.$nomAuteur.'" ");
    while($row = mysql_fetch_assoc($res)){
    $buffer .='<nomAuteur>'.$row['livre'].'</nomAuteur>';
    }
    $buffer .='</liste>';

    Bonne chance pour la mise en place

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 5
    Points
    5
    Par défaut
    J'ai essayé mais visiblement soit il ne prend pas la valeur post soit la liste ne se rempli pas.

    Cela dit, je n'ai pas très bien compris votre code. dois je le fusionner avec le mien? dois je garder ma fonction go sur ma première liste (auteurs)?

    pourquoi un appel de fonction onclick sur ma seconde liste?

    je suis un peu perdu pourtant je sent que j'y suis presque, c'est assez frustrant je dois l'avouer.

    merci pour votre aide


    Edit : Dans mon premier code de mon premier poste on dirait qu'il ne prend pas en compte le fait que le value de ma liste d'auteur devienne du texte (Auteur) au lieu d'un nombre (Code)

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Les éléments de formulaires insérés avec innerHTML ne sont pas pris en compte dans le submit du formulaire, il est préférable d'utiliser les méthodes du DOM (createElement, appendChild, insertBefore...)

  5. #5
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    Il faut que tu laisse la fonction qui remplis ton premier select, tu peux enlever tous le reste.

    Et puis le OnClick , tu as raison , il faut le mettre sur le premier Select (auteur). Et puis met plutot onChange que OnClick et ca devrait marcher.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 5
    Points
    5
    Par défaut
    Je reprend donc les lignes de codes que j'ai actuellement.

    J'ai modifiés les noms pour plus de clarté.

    j'ai donc une table "bibliotheque" dans une base de donnée "test" (type Mysql).

    cette table est formée ainsi :

    "Code" -- "NomsAuteurs" -- "NomsLivres"
    ---------------------------------------
    1 - - - - - - Mr. XXX - - - - - AAAAA - -
    2 - - - - - - Mr. XXX - - - - - BBBBB - -
    3 - - - - - - Mr. YYY - - - - - CCCCC - -
    4 - - - - - - Mr. YYY - - - - - DDDDD - -
    5 - - - - - - Mr. ZZZ - - - - - EEEEE - -


    j'ai donc un premier menu déroulant avec le nom des auteurs.
    (ayant plusieurs mêmes auteurs dans ma table je les ai classé en groupe ce qui me donne chaque noms d'auteurs dans ma première liste.)

    le "value" du select de ma première liste est le nom de l'auteur à savoir :
    <option value='".$row["NomsAuteurs"]."'>

    Je cherche donc à avoir un second menu déroulant comprenant la liste des livres correspondant au choix de l'auteur, fait par mon premier menu déroulant
    (bien sur sans bouton de validation ce qui évidemment, a déjà été compris)

    ci dessous mes codes :

    pagechoixauteurs.php

    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
    31
    32
    33
    <html>
    	<head>
    		<title>Tutoriel Ajax (XHTML + JavaScript + XML)</title>
    		<script type="text/javascript" src="./fonction.js"></script>
     
    	</head>
    	<body>
    	<script type="text/javascript" src="./fonction.js"></script>
    		<form>
    			<fieldset style="width: 500px">
    				<legend>Liste liées</legend>
    				<label>Auteurs</label>
    				<select name='auteur' id='auteur' onchange='getLivres' >
    					<option value='-1' >Aucun</option>
    					<?
    						mysql_connect("localhost","XXXXXX","XXXXXX");
    						mysql_select_db("test");
    						$res = mysql_query("SELECT * FROM bibliotheque GROUP BY NomsAuteurs");
    						while($row = mysql_fetch_assoc($res)){
    							echo "<option value='".$row["NomsAuteurs"]."'>".$row["NomsAuteurs"]."</option>";
    						}
    					?>
    				</select>
    				<label>Livres</label>
    				<div id='livre' style='display:inline'>
    				<select name='livre' >
    					<option value='-1'>Choisir un livre</option>
    				</select>
    				</div>
    			</fieldset>
    		</form>
    	</body>
    </html>
    fonction.js
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    function getXhrTrap(){
    	if(window.XMLHttpRequest) // Firefox et autres
    	   var xhrT = new XMLHttpRequest();
    	else if(window.ActiveXObject){ // Internet Explorer
    	   try {
                    var xhrT = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                    var xhrT = new ActiveXObject("Microsoft.XMLHTTP");
                }
    	}
    	else { // XMLHttpRequest non supporte par le navigateur
    	   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    	   var xhrT = false;
    	}
    	return xhrT;
    }
     
    function getLivres() {
     
    //Passe le nom de l'auteur en paramètre de l'url
    var arg = 'http://localhost/XXXXX/pagechoixauteurs.php&NomsAuteurs='+NomsAuteurs;
     
     
    	var xhrT = getXhrTrap();
     
    	xhrT.open("POST","ajaxLivre.php",true);
    	xhrT.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhrT.send(arg);
     
    	// On defini ce qu'on va faire quand on aura la reponse
    	xhrT.onreadystatechange = function()
    	{	
    		// On ne fait quelque chose que si on a tout recu et que le serveur est ok
    		if(xhrT && xhrT.readyState == 4 && xhrT.status == 200 && xhrT.responseXML)
    		{
    			reponseT = xhrT.responseXML.documentElement;
    			var livres = reponseT.getElementsByTagName("NomsLivres");
    //la tu recuperes le select dans lequel tu veux ajouter des elements
    var selbox = document.getElementById("livre");
     
     
    				for (var i = 0 ; i < livres.length ; i++) {
    					var srv = livres[i];
    					var nomLivres = srv.getElementsByTagName("NomsLivres")[0].firstChild.nodeValue;
     
    //La tu ajoutes les livres dans le SELECT
    new_elem = new Option(name,i);
    				selbox.options[selbox.length] = new_elem;
    				}
    		}
    	}
    	}
    }
    ajaxLivre.php
    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
    <?php
     
    $buffer  = '<?xml version="1.0"?>';
            $buffer .= '<liste>';
     
    mysql_connect("localhost","XXXX","XXXXXX");
    mysql_select_db("test");
    $res = mysql_query("SELECT NomsLivres FROM bibliotheque WHERE NomsAuteurs = '".$NomsAuteurs."' ");
     
    while($row = mysql_fetch_assoc($res)){
    $buffer .='<NomsAuteurs>'.$row['NomsLivres'].'</NomsAuteurs>';
    }
    $buffer .='</liste>';
     
    ?>

    Voila.

    Je ne trouve pas ce qui ne va pas.
    Si quelqu'un pourait m'eguiller ce serait super!

    Merci a vous
    dari

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var arg = 'http://localhost/XXXXX/pagechoixauteurs.php&NomsAuteurs='+NomsAuteurs;
    NomsAuteurs ??? Il est défini où ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var NomsAuteurs = document.getElementById('auteurs').options[document.getElementById('auteurs').selectedIndex].value;
    var arg = 'http://localhost/XXXXX/pagechoixauteurs.php&NomsAuteurs='+NomsAuteurs;

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 5
    Points
    5
    Par défaut
    Bonjours!

    Merci pour votre aide

    J'y avait pensé.

    après avoir ajouté sur ma page pagechoixauteurs.php

    <form name="pagechoixauteurs">

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //...
     
    <body>
    	<script type="text/javascript" src="./fonction.js"></script>
    		<form name="pagechoixauteurs">                          // ICI MEME
    			<fieldset style="width: 500px">
    				<legend>Liste liées</legend>
    				<label>Auteurs</label>
    				<select name='auteur' id='auteur' onchange='getLivres' >
     
    //...
    j'ai essayé un

    var NomsAuteurs = document.pagechoixauteurs.auteur.value;

    dans mon fonction.js

    Mais ma seconde liste reste toujours vide.

    J'ai essayé avec votre ligne (toujours dans fonction.js):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var NomsAuteurs = document.getElementById('auteur').options[document.getElementById('auteur').selectedIndex].value;
    j'ai d'ailleurs mis "getElementById('auteur')" au singulier car je suppose qu'il s'agit de l'id de ma liste d'auteurs, définie dans mon select comme "auteur".

    (rectifiez moi si je me trompe. je suis pas encore très calé en javascripte.)

    Malheureusement, ma seconde liste reste toujours vide.

  9. #9
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    il faut que tu passes la valeur sélectionné du premier select en argument de la fonction getLivres

    comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getLivres(this.form.auteur.value)

    et dans fonction.js

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function getLivres(nomAuteur)

    et le tour est joué

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 5
    Points
    5
    Par défaut
    Merci a vous egalement pour votre aide.

    j'ai modifié mon code comme ceci :

    pagechoixauteurs.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //...
     
    <legend>Liste liées</legend>
    				<label>Auteurs</label>
    				<select name='auteur' id='auteur' onchange='getLivres(this.form.auteur.value)' >  //ICI MEME
     
    //...
    Et aussi dans fonction.js:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function getLivres(NomsAuteurs)
    J'ai modifier votre "nomauteur" en "NomsAuteurs" pour que cela correspondent a mes dernieres redéfinitions de noms (cf poste precedent)

    Malheureusement, le résultat est identique, la seconde liste reste vierge.

  11. #11
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Euh... il y a un truc bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function getLivres() {
     
    //Passe le nom de l'auteur en paramètre de l'url
    var arg = 'http://localhost/XXXXX/pagechoixauteurs.php&NomsAuteurs='+NomsAuteurs;
     
     
    	var xhrT = getXhrTrap();
     
    	xhrT.open("POST","ajaxLivre.php",true);
    	xhrT.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhrT.send(arg);
    Là, tu envoies http://localhost/XXXXX/pagechoixaute...9;+NomsAuteurs comme paramètre à la page ajaxLivre.php, je ne pense pas que ce soit ce que tu souhaites...

    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var NomsAuteurs = document.getElementById('auteur').options[document.getElementById('auteur').selectedIndex].value;
    var arg = 'NomsAuteurs='+NomsAuteurs;
     
     
    	var xhrT = getXhrTrap();
     
    	xhrT.open("POST","ajaxLivre.php",true);
    	xhrT.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhrT.send(arg);

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 5
    Points
    5
    Par défaut
    Quel challenge!!

    après modification, le résultat reste le même ;
    J'avais effectivement des doutes sur les données envoyées sur ajaxLivres.php
    dont voici les sources :

    ajaxLivres.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    $buffer  = '<?xml version="1.0"?>';
            $buffer .= '<liste>';
    mysql_connect("localhost","XXXX","XXXXXX");
    mysql_select_db("test");
    $res = mysql_query("SELECT NomsLivres FROM bibliotheque WHERE NomsAuteurs = '".$NomsAuteurs."' ");
    while($row = mysql_fetch_assoc($res)){
    $buffer .='<NomsAuteurs>'.$row['NomsLivres'].'</NomsAuteurs>';
    }
    $buffer .='</liste>';
     
            ?>
    Que faire? désirez vous les code sources a nouveau?
    Merci pour votre aide ca fait plaisir!

  13. #13
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    essaye plutot => $_POST['NomsAuteurs'] dans la page ajaxLivres.php plutot que $NomsAuteurs


    et met un controle supplémentaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (isset($_POST['NomsAuteurs']) {
    ....
    }

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 5
    Points
    5
    Par défaut
    voici mon fichier ajaxLivre.php

    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
    <?php
     
    if (isset($_POST["NomsAuteurs"])) {
            
    $buffer  = '<?xml version="1.0"?>';
            $buffer .= '<liste>';
    mysql_connect("localhost","XXXXXXXXX","XXXXX");
    mysql_select_db("test");
    $res = mysql_query("SELECT NomsLivres FROM bibliotheque WHERE NomsAuteurs = "$_POST['NomsAuteurs']" ");
    while($row = mysql_fetch_assoc($res)){
    $buffer .='<NomsAuteurs>'.$row['NomsLivres'].'</NomsAuteurs>';
    }
    $buffer .='</liste>';
    }
     
            ?>
    J'ai corriger l'isset en ajoutant une parenthèse ici :
    if (isset($_POST["NomsAuteurs"])) {
    L'idée est bonne merci pour l'isset, je l'avais oublié celui la.

    j'ai aussi essayé
    ".$_POST['NomsAuteurs']." au lieu de
    "$_POST['NomsAuteurs']"

    Malheureusement, même résultat :s

  15. #15
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    reponseT = xhrT.responseXML.documentElement;
    			var livres = reponseT.getElementsByTagName("NomsLivres")
    Tu n'as pas de tag NomsLivres dans ton xml ???
    désirez vous les code sources a nouveau?
    Oui, ce serait bien...

  16. #16
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    oui dans le fichier pagechoixauteurs.php, tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div id='livre' style='display:inline'>
    				<select name='livre' >
    					<option value='-1'>Choisir un livre</option>
    				</select>
    				</div>
    et tu cherches dans le fichier fonction.js :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //la tu récupérés le select dans lequel tu veux ajouter des éléments
    var selbox = document.getElementById("livre");

    Il y a un souci , tu dois pointer directement sur le SELECT.

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Tu n'as pas de tag NomsLivres dans ton xml ???
    J'aimerais comprendre. pouvez vous m'expliquer?

    revoici mes sources :

    pagechoixauteurs.php
    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
    31
    32
    33
    <html>
    	<head>
    		<title>Tutoriel Ajax (XHTML + JavaScript + XML)</title>
    		<script type="text/javascript" src="./fonction.js"></script>
     
    	</head>
    	<body>
    	<script type="text/javascript" src="./fonction.js"></script>
    		<form name="pagechoixauteurs">
    			<fieldset style="width: 500px">
    				<legend>Liste liées</legend>
    				<label>Auteurs</label>
    				<select name='auteur' id='auteur' onchange='getLivres(this.form.auteur.value)' >
    					<option value='-1' >Aucun</option>
    					<?
    						mysql_connect("localhost","XXXX","XXXX");
    						mysql_select_db("test");
    						$res = mysql_query("SELECT * FROM bibliotheque GROUP BY NomsAuteurs");
    						while($row = mysql_fetch_assoc($res)){
    							echo "<option value='".$row["NomsAuteurs"]."'>".$row["NomsAuteurs"]."</option>";
    						}
    					?>
    				</select>
    				<label>Livres</label>
    				<div id='livre' style='display:inline'>
    				<select name='livre' >
    					<option value='-1'>Choisir un livre</option>
    				</select>
    				</div>
    			</fieldset>
    		</form>
    	</body>
    </html>
    ajaxLivre.php
    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
    <?php
    if (isset($_POST["NomsAuteurs"])) {
            
    $buffer  = '<?xml version="1.0"?>';
            $buffer .= '<liste>';
    mysql_connect("localhost","XXXXX","XXXXXX");
    mysql_select_db("test");
    $res = mysql_query("SELECT NomsLivres FROM bibliotheque WHERE NomsAuteurs = '".$_POST['NomsAuteurs']."' ");
    while($row = mysql_fetch_assoc($res)){
    $buffer .='<NomsLivres>'.$row['NomsLivres'].'</NomsLivres>';
    }
    $buffer .='</liste>';
    header('Content-Type: text/xml');
            print $buffer;
    }
            ?>
    fonction.js
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    function getXhrTrap(){
    	if(window.XMLHttpRequest) // Firefox et autres
    	   var xhrT = new XMLHttpRequest();
    	else if(window.ActiveXObject){ // Internet Explorer
    	   try {
                    var xhrT = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                    var xhrT = new ActiveXObject("Microsoft.XMLHTTP");
                }
    	}
    	else { // XMLHttpRequest non support2 par le navigateur
    	   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    	   var xhrT = false;
    	}
    	return xhrT;
    }
     
    function getLivres(NomsAuteurs) {
     
    //Passe le nom de l'auteur en parametre de l'url
    var NomsAuteurs = document.getElementById('auteur').options[document.getElementById('auteur').selectedIndex].value;
    var arg = 'NomsAuteurs='+NomsAuteurs;
     
     
    	var xhrT = getXhrTrap();
     
    	xhrT.open("POST","ajaxLivre.php",true);
    	xhrT.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhrT.send(arg);
     
    	// On defini ce qu'on va faire quand on aura la reponse
    	xhrT.onreadystatechange = function()
    	{	
    		// On ne fait quelque chose que si on a tout recu et que le serveur est ok
    		if(xhrT && xhrT.readyState == 4 && xhrT.status == 200 && xhrT.responseXML)
    		{
    			reponseT = xhrT.responseXML.documentElement;
    			var livres = reponseT.getElementsByTagName("NomsAuteurs");
    //la tu recuperes le select dans lequel tu veux ajouter des elements
    var selbox = document.getElementById("livre");
     
     
    				for (var i = 0 ; i < livres.length ; i++) {
    					var srv = livres[i];
    					var nomLivres = srv.getElementsByTagName("NomsLivres")[0].firstChild.nodeValue;
     
    //La tu ajoutes les livres dans le SELECT
    new_elem = new Option(name,i);
    				selbox.options[selbox.length] = new_elem;
    				}
    		}
    	}
    	}
    bibliotheque.sql
    SET FOREIGN_KEY_CHECKS=0;
    -- ----------------------------
    -- Table structure for bibliotheque
    -- ----------------------------
    DROP TABLE IF EXISTS `bibliotheque`;
    CREATE TABLE `bibliotheque` (
    `Code` int(10) NOT NULL auto_increment,
    `NomsAuteurs` varchar(50) default NULL,
    `NomsLivres` varchar(50) default NULL,
    PRIMARY KEY (`Code`),
    KEY `Code1` (`Code`)
    ) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=latin1;

    -- ----------------------------
    -- Records
    -- ----------------------------
    INSERT INTO `bibliotheque` VALUES ('1', 'MR XXX', 'AAAA');
    INSERT INTO `bibliotheque` VALUES ('2', 'MR XXX', 'BBBB');
    INSERT INTO `bibliotheque` VALUES ('3', 'MR XXX', 'CCCC');
    INSERT INTO `bibliotheque` VALUES ('4', 'MR YYY', 'DDDD');
    INSERT INTO `bibliotheque` VALUES ('5', 'MR YYY', 'EEEE');
    INSERT INTO `bibliotheque` VALUES ('6', 'MR ZZZ', 'FFFF');

  18. #18
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    reponseT = xhrT.responseXML.documentElement;
    tu affectes à reponseT la valeur du XML généré par ajaxLivre.php, jusqu'ici, pas de problème
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    var livres = reponseT.getElementsByTagName("NomsLivres");
    tu cherches dans le xml les éléments de type <NomsLivres>, pourquoi pas...
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    if (isset($_POST["NomsAuteurs"])) {
     
    $buffer  = '<?xml version="1.0"?>';
    	$buffer .= '<liste>';
    mysql_connect("localhost","XXXXX","XXXXXX");
    mysql_select_db("test");
    $res = mysql_query("SELECT NomsLivres FROM bibliotheque WHERE NomsAuteurs = ".$_POST['NomsAuteurs']." ");
    while($row = mysql_fetch_assoc($res)){
    $buffer .='<NomsAuteurs>'.$row['NomsLivres'].'</NomsAuteurs>';
    }
    $buffer .='</liste>';
    }
    	?>
    Ton xml ne contient pas de balise <NomsLivres>, donc ta variable livres est vide !!!
    Essaye avec :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    var livres = reponseT.getElementsByTagName("NomsAuteurs");

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 5
    Points
    5
    Par défaut
    Ok j'ai compris et repéré la variable à indiquer.

    dans mon ajaxLivres.php, si j'aurais mis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $buffer .='<JECHANGEICI>'.$row['NomsLivres'].'</JECHANGEICI>';
    je dois mettre dans mon fichier fonction.js :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    reponseT = xhrT.responseXML.documentElement;
    var livres = reponseT.getElementsByTagName("JECHANGEICI");

    cependant, ma liste reste vierge.
    quelle aventure intellectuelle!

    edit : MAJ des codes de mon poste précédent suite à cette dernière modification.


    edit 2 : dans mon fichier ajaxLivres.php il y a la variable "$buffer"
    pouvez vous me dire à quoi elle sert?
    En effet je ne la retrouve nul part dans mes fichiers.
    Elle est définie dans mon fichier ajaxLivres.php ok, mais après?
    Ne devrait il pas y avoir un "print", un "echo" ou un appel de variable quelque part?

  20. #20
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    Concernant l'edit 2 :

    Ildoit effectivemment avoir un echo à la fin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	header('Content-Type: text/xml');
    	echo $buffer;

    Ensuite , vérifie avec un outil comme Firebug , si le xml est généré

Discussions similaires

  1. Menus déroulants dynamiques
    Par okoweb dans le forum jQuery
    Réponses: 2
    Dernier message: 05/10/2011, 19h05
  2. [PHP 5.0] les résultats selon 2 menus déroulants dynamiques, liés entre eux
    Par aspkiddy dans le forum Langage
    Réponses: 3
    Dernier message: 09/06/2011, 12h36
  3. [AJAX] Menus déroulants dynamiques
    Par deidei dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/10/2008, 08h49
  4. [DOM] listes déroulantes dynamiques et passage de paramètres
    Par sorcade dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 09/09/2008, 11h07
  5. [SQL] Relation entre deux menus déroulants dynamiques
    Par intissar_g dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/11/2007, 15h36

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