Page 1 sur 2

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

Posté : 15 déc. 2005, 17:03
par ryanu
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>

Posté : 15 déc. 2005, 17:30
par mere-teresa
Tu as lu le tutoriel là dessus dans la FAQ du forum?

Posté : 16 déc. 2005, 10:59
par ryanu

Posté : 16 déc. 2005, 12:14
par mere-teresa
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

Posté : 16 déc. 2005, 13:01
par ryanu
Ok je me mets au boulot :wink:

Posté : 12 janv. 2006, 11:01
par ryanu
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

Posté : 12 janv. 2006, 11:15
par Cyrano
Tu utilises la version 100%PHP ou la version JavaScript ?

Posté : 12 janv. 2006, 13:09
par ryanu
La version Javascript.

Posté : 13 janv. 2006, 10:46
par ryanu
S'il vous plait dites moi que c'est possible avec la version javascript :?

Posté : 13 janv. 2006, 10:54
par Cyrano
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.

Posté : 13 janv. 2006, 12:57
par ryanu
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:

Posté : 13 janv. 2006, 13:01
par Cyrano
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.

Posté : 13 janv. 2006, 14:12
par ryanu
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 ?

Posté : 13 janv. 2006, 15:08
par Cyrano
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;
}

Posté : 13 janv. 2006, 15:42
par ryanu
Youpi ça marche ! \:D/
Un grand grand merci pour ta rapidité à me répondre. :merci: