remplir une liste déroulante à partir d'une autre

Eléphanteau du PHP | 18 Messages

15 déc. 2005, 17:03

Bonjour,
Je cherche un moyen de remplir une liste déroulante en allant chercher dans ma bdd les enregistrements correspondants à ce que j'aurais sélectionnés dans une autre liste déroulante, le tout en évitant de recharger la page à chaque fois.

Voici la page que j'ai construite mais impossible de trouver pourquoi ce la ne fonctionne pas :
<html>
<head>
<title>TEST </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="http://robloche.free.fr/common.js"></script>
<script type="text/javascript" src="http://robloche.free.fr/tuto.js"></script>
<script type="text/javascript" >
var l1    = f.elements["list1"];
var l2    = f.elements["list2"];
var index = l1.selectedIndex;
if(index < 1)
   l2.options.length = 0;
else {
   var xhr_object = null;
	
   if(window.XMLHttpRequest) // Firefox
      xhr_object = new XMLHttpRequest();
   else if(window.ActiveXObject) // Internet Explorer
      xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
   else { // XMLHttpRequest non supporté par le navigateur
      alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
      return;
   }

   xhr_object.open("POST", "testXML.php", true);
	
   xhr_object.onreadystatechange = function() {
      if(xhr_object.readyState == 4)
         eval(xhr_object.responseText);
   }

   xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   var data = "$codeprestation="+escape(l1.options[index].value)+"&form="+f.name+"&select=list2";
   xhr_object.send(data);
}

</script>
</head>

<body>
<? include "f_base"; ?>

<div class="Centered">

	<form class="CenteredForm" name="form_selects" id="form_selects" action="" method="" onsubmit="return false;">
		<fieldset>
			<legend>Faites un choix dans la liste de gauche et observez le résultat dans celle de droite</legend>
			<div class="Left">
			Famille&nbsp;:
			<select name="list1" id="list1" class="ButtonL" onchange="request05(this.form)">
				 <option value="0" selected>-- Sélectionnez un code prestation --</option>
          <? 
             $sql = "SELECT codeprestation FROM prestations ORDER BY codeprestation ASC";
             $option = mysql_query($sql);
             while ($row = mysql_fetch_row($option)) 
             {
                $query="SELECT codeprestation FROM prestations WHERE codeprestation=\"$row[0]\"";
               $codeprestation=mysql_query($query);
               $codeprestation=mysql_result($codeprestation,"codeprestation");  

               print "<option value=\"$codeprestation\">".($row[0])."</option>\n";
             }
               ?>
			</select>
			&nbsp;&nbsp;&nbsp;Espèces&nbsp;:
			<select name="list2" id="list2" class="ButtonL">
			<?php
$query  = "SELECT `libelle` FROM `prestations` WHERE `codeprestation` = '".$_POST["$codeprestation"]."'";
$query .= " ORDER BY `libelle`";
$result = @mysql_query($query);

echo 'var o = null;';
echo 'var s = document.forms["'.$_POST["form"].'"].elements["'.$_POST["select"].'"];';
echo 's.options.length = 0;';
while($r = mysql_fetch_array($result))
	echo 's.options[s.options.length] = new Option("'.$r["libelle"].'");';
 ?>
			</select>
			</div>
		</fieldset>
	</form>
</div>
</body></html>

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

15 déc. 2005, 17:30

Tu as lu le tutoriel là dessus dans la FAQ du forum?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphanteau du PHP | 18 Messages

16 déc. 2005, 10:59


Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

16 déc. 2005, 12:14

Franchement, je ne lirai pas cette tartine de code. Mais quitte à reprendre le code de qqn d'autre, autant que ce soit avec des explications, non ?

Le tuto => http://www.phpfrance.com/forums/voir_sujet-4562.php

Eléphanteau du PHP | 18 Messages

16 déc. 2005, 13:01

Ok je me mets au boulot :wink:

Eléphanteau du PHP | 18 Messages

12 janv. 2006, 11:01

En suivant le tutoriel ça marche impeccable.
mais je voudrais qu'en cliquant sur un des éléments de ma liste "région", que, en plus de la liste "département", une troisième liste s'affiche en même temps.
J'ai du mal en Javascript et mes essais jusqu'ici sont infructueux.
Merci

Mammouth du PHP | 19672 Messages

12 janv. 2006, 11:15

Tu utilises la version 100%PHP ou la version JavaScript ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 18 Messages

12 janv. 2006, 13:09

La version Javascript.

Eléphanteau du PHP | 18 Messages

13 janv. 2006, 10:46

S'il vous plait dites moi que c'est possible avec la version javascript :?

Mammouth du PHP | 19672 Messages

13 janv. 2006, 10:54

Oui, c'est possible, pas évident parce que le tableau à sérializer est plus complexe qu'avec deux listes, mais techniquement, c'est faisable.

Ceci dit, as-tu suivi le lien vers le site aidejavascript.com sur les listes fantôme : il y a des explications sur les bases afin de rajouter davantage de listes.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 18 Messages

13 janv. 2006, 12:57

Je viens de consulter ce lien mais comme je nage complètement en javascript, je ne sais pas comment l'appliquer à mon cas. Est-ce que dans le fichier ChangeDept.js je dois rajouter une fonction pour afficher un 2ème bloc <span> ?

En fait je ne cherche pas à faire des listes en cascade. Je veux qu'en sélectionnant une région il y ait 2 listes qui s'affichent (2 blocs <span>).
Donc l'utilisateur ne doit pas cliquer dans la liste département pour faire afficher la 3ème liste ...
C'est compliqué mais c'est une exigence de mon patron. :evil:

Mammouth du PHP | 19672 Messages

13 janv. 2006, 13:01

Alors c'est plus simple: là où le code fait afficher une liste, il te suffit de rajouter une ligne d'instruction pour faire également afficher la seconde liste dans l'autre bloc span.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 18 Messages

13 janv. 2006, 14:12

Ca m'embête de te demander ça mais est-ce que tu pourrais m'aider plus précisément car je patauge.
La liste que je veux ajouter correspond au champs Ville de ma table Département.

Donc j'ai modifié ma fonction ChangeDept ainsi :
function changeDept(tab,idr) 
{ 
    if(idr != "vide") 
    { 
    /* On compte les départements de cette région */ 
    var nbd = tab[idr][1].length; 
    var form_d  = '<input type="text" name="departement" size="70" maxlength="70"  '; 
 for(var j = 0;  j < nbd; j++) 
    { 
        form_d += '  value="'+ tab[idr][2][j] +'" '; 
    } 
	{
        form_d += '>'; 
    } 
	{ 
        form_d += '<input type="text" name="ville" size="10" maxlength="10"  ';
	 } 
	{ 
		form_d += '  value="'+ tab[idr][3][j] +'" '; 
    } 
	{ 
        form_d += '>'; 
    } 
    else 
    { 
        form_d = ""; 
    } 
    document.getElementById("blocDepartements").innerHTML = form_d;     	
}



Faut-il modifier le tableau PHP ?

Mammouth du PHP | 19672 Messages

13 janv. 2006, 15:08

Il faudrait surtout faire un code valide: tu as un paquet d'accolades orphelines : ton code devrait ressembler davantage à ceci:
function changeDept(tab,idr)
{
    if(idr != "vide")
    {
        /* On compte les départements de cette région */
        var nbd = tab[idr][1].length;
        var form_d  = '<input type="text" name="departement" size="70" maxlength="70"  ';
        for(var j = 0;  j < nbd; j++)
        {
            form_d += '  value="'+ tab[idr][2][j] +'" ';
            form_d += '>';
            form_d += '<input type="text" name="ville" size="10" maxlength="10"  ';
            form_d += '  value="'+ tab[idr][3][j] +'" ';
            form_d += '>';
        }
    }
    else
    {
        form_d = "";
    }
    document.getElementById("blocDepartements").innerHTML = form_d;
}
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 18 Messages

13 janv. 2006, 15:42

Youpi ça marche ! \:D/
Un grand grand merci pour ta rapidité à me répondre. :merci: