[résolu]Liste déroulante liée

Eléphanteau du PHP | 23 Messages

14 juin 2012, 10:36

Bonjour à tous, je sais que beaucoup de sujets sur les listes déroulantes liées existent moi-même j'en ai déjà parlé mais aujourd'hui je viens avec un problème différent.

En effet, ma première liste déroulante va contenir toute les valeurs d'une table et dans la deuxième les valeurs d'une autre table quand la première a des valeurs de la seconde.

Un exemple pour illustrer mon propos :

première liste de département
Direction
Administration
Compta

La direction n'a pas de sous service, alors que l'administration et la compta en on :
deuxieme liste :

si direction, pas de liste s'affiche
si administration ou compta, une liste avec ses services doit s'afficher.


J'utilise pour le lien entre les listes déroulante le code javascript présent sur ce forum : faq-tutoriels/formulaires-listes-deroul ... t4562.html

J'ai adapté le code à mon problème. Le code de base ne prend que les correspondance, donc dans mon cas, n'aurait pas prit Direction. J'ai donc dû faire quelque modifications, peut-être sont-elles mal faîtes. Mais j'arrive à obtenir tout d'abord la liste contenant tout les départements, et si ils y a un sous service la 2nd liste s'affiche, mais dans le cas ou je clic d'abord sur (ici) Administration, j'ai la 2nd liste, mais si je change vers Direction, la liste d'administration reste toujours. Par contre si je reviens sur l'option de départ, où la value prend "vide" c'est bon la deuxième liste disparaît, mais cela implique que l'utilisateur doit tout d'abord allez sur l'option vide, puis resélectionner un champ, ce que je dois éviter pour des soucis de rapidité.

voici le code que j'utilise :

La page où se trouve le code php et d'appel à la fonction javascript :

<?php
	session_start();
	echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
	include('./menu.html');
	/* Variables de connexion : ajustez ces paramètres selon votre propre environnement */
	$serveur = "localhost";
	$admin   = "root";
	$mdp     = "";
	$base    = "paper";
?>
	<head>
		<title>Ajouts dans journal</title>
	</head>
	<body>

<?php
		$sql4 = "SELECT departement.id_departement AS idd, departement_name, section_departement ".
				"FROM departement ".
				"ORDER BY departement.departement_name ;";
		$sql3 = "SELECT id_service AS ids, name_service AS serv, departement.id_departement AS idd, departement_name, section_departement ".
				"FROM service, departement ".
				"WHERE service.id_departement = departement.id_departement ".
				"ORDER BY departement.departement_name ;";
		
		
		
		/* Connexion et exécution de la requête */
		$connexion = mysql_pconnect($serveur, $admin, $mdp);
		if($connexion == false){
		?>
			<p>La connexion au serveur de base de données a échoué. Aucun élément ne peut être affiché.</p>
		<?php
		}
		else {
		?>		
			<?php	
		
		
			$choixbase = mysql_select_db($base, $connexion);
			$recherche3 = mysql_query($sql3, $connexion);
			$recherche4 = mysql_query($sql4, $connexion);
			/* Pour ne pas écraser mes tableaux, je crée un témoin */
			$temoin_ts = 0;
			/* Création du tableau PHP des valeurs récupérées */
			$departements = array();
			/* Index tableau */
			$idd = 0;
			/* Pour les service */
			while($ligne = mysql_fetch_assoc($recherche3)){
				$d = $ligne['idd'];
				$s = $ligne['ids'];
				/* Je vérifie si je suis toujours dans le même departement, sinon je crée les tableaux nécessaires */
				if($temoin_ts != $d)
				{
					$departements[$d] = array();
					/* J'ajoute le departement */
					$departements[$d][0] = $ligne['departement_name']." - ".$ligne['section_departement'];
					$departements[$d][1] = array();
					$departements[$d][2] = array();
					$temoin_ts = $d;
					$idd = 0;
				}
				/* J'ajoute les objets */
				$departements[$d][1][$idd] = $s;
				$departements[$d][2][$idd] = $ligne['serv'];
				$idd++;
			}			
			while($ligne = mysql_fetch_assoc($recherche4)){
				$d = $ligne['idd'];
				/* Je vérifie si je suis toujours dans le même departement, sinon je crée les tableaux nécessaires */
				if($temoin_ts != $d)
				{
					
						/* J'ajoute le departement */
						$departements[$d][0] = $ligne['departement_name']." - ".$ligne['section_departement'];;
				}
				$idd++;
			}
			/* On sérialise le tableau obtenu pour traitement par JavaScript */
			$chaines = htmlspecialchars(serialize($departements), ENT_QUOTES);
			?>
			<script type="text/javascript">
				var tableau_service = new PhpArray2Js('<?php echo $chaines; ?>');
				var tab_service = tableau_service.retour();
			</script>
			<form name="journal" action="traitement.php" method="post">
				  <p>Sélectionnez un departement</p>
					<select name="departement" id="departement" onchange="changeService(tab_service,this.value);">
						<option value="vide">- - - Choisissez un departement - - -</option>
						<?php
						/* Construction de la première liste : on se sert du tableau PHP */
						$nbr = count($departements);
						foreach($departements as $nrd => $nom){
						?>
						<option value="<?php echo($nrd); ?>"><?php echo($nom[0]); ?></option>
					<?php
						}
					?>
					</select>
					<!-- un bloc avec un id ou va s'insérer le code de la seconde liste déroulande -->
					<br/><br/><span id="blocservice"></span>
			</form>
			
		<?php
		}
		include('./footer.html');
		?>
	</body>	
</html>

ensuite celui de changeService.js

[javascript]
/* On crée la fonction qui va construire la seconde liste déroulante */
function changeService(tab_service,ids)
{
if(ids != "vide")
{
/* On compte les objets de ce departement */
var nbs = tab_service[ids][1].length;
if (nbs != 0) {
var form_dep = '<select name="service" id="service">';
form_dep += '<option value="vide">- - - Choisissez un service - - -</option>';
for(var j = 0; j < nbs; j++)
{
form_dep += ' <option value="'+ tab_service[ids][1][j] +'">'+ tab_service[ids][2][j] +'<\/option>';
}
form_dep += '<\/select>';
}
else
{
form_dep = "";
}
}
else
{
form_dep = "";
}
document.getElementById("blocservice").innerHTML = form_dep;
}
[/javascript]


Merci d'avance de votre aide, n'hésitez pas à me demander des infos pour compléter mon explication ou carrément reformuler certains points.


Raitei
Modifié en dernier par Raitei le 14 juin 2012, 13:35, modifié 1 fois.

Eléphanteau du PHP | 23 Messages

14 juin 2012, 13:34

Soucis réglé.

Je pars en réunion je mettrai la solution au cas ou des gens auraient eu le même soucis, en revenant de celle-ci.


EDIT :
			/* Création du tableau PHP des valeurs récupérées */
			$departements = array();			
			$idd=0;
			while($ligne = mysql_fetch_assoc($recherche4)){
				$d = $ligne['idd'];
				/* Je vérifie si je suis toujours dans le même departement, sinon je crée les tableaux nécessaires */
				if($temoin_ts != $d)
				{
						/* J'ajoute le departement */
						$departements[$d][0] = $ligne['departement_name']." - ".$ligne['section_departement'];;
						$departements[$d][1] = array();
						$departements[$d][2] = array();
				}
				$idd++;
			}
			/* Index tableau */
			$idd = 0;
			/* Pour les service */
			while($ligne = mysql_fetch_assoc($recherche3)){
				$d = $ligne['idd'];
				$s = $ligne['ids'];
				/* Je vérifie si je suis toujours dans le même departement, sinon je crée les tableaux nécessaires */
				if($temoin_ts != $d)
				{
					/* J'ajoute le departement */
					$departements[$d][0] = $ligne['departement_name']." - ".$ligne['section_departement'];
					$departements[$d][1] = array();
					$departements[$d][2] = array();
					$temoin_ts = $d;
					$idd = 0;
				}
				/* J'ajoute les objets */
				$departements[$d][1][$idd] = $s;
				$departements[$d][2][$idd] = $ligne['serv'];
				$idd++;
			}



Raitei.