Liste lié

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 oct. 2005, 19:20

normal que tu aie des trous, dans les 2,4 et 5eme éléments du tableau $clients tu demandes d'afficher $nom[0] hors pour ces éléments il 'ny en as pas (d'apres le var_dump())

alors soit tu avite de la rajouter dans la liste en faissant un test avant d'ajouter l'option dans la liste.

soit verifié pourquoi il n'y a pas d'élément indéxé $clients[2][0] (exemple). Peut etre un contenu vide ici
$clients[$r][0] = $ligne['client'];
Voila des petites pistes

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 119 Messages

21 oct. 2005, 12:04

Bon j'avance bien là,

j'ai créé une table client comme ceci:

CREATE TABLE client
(
nom varchar(30),
commercial varchar(40),
id_client int4
)

et mon code ressemble à ça maintenant:
<?php
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
<title>Liste déroulantes dynamiques liées</title>
<meta name="description" content="Listes dynamiques liées: la seconde liste est modifiée instantanément lors d'une sélection sur la première." />
<meta name="keywords" content="menu,déroulant,select,liées,JavaScript" />
<meta name="author" content="Cyrano" />
<meta name="generator" content="Zend Studio Environnement et WebExpert 5" />
<meta http-equiv="imagetoolbar" content="no" />
<meta http-equiv="Pragma" content="no-cache" />
<script type="text/javascript" src="./arrayPHP2JS.js" charset="iso_8859-1"></script>
<script type="text/javascript" src="./changeDept.js" charset="iso_8859-1"></script>
<?php
$sql1 = "SELECT client.nom AS client, designation, client.id_client  from master, client WHERE client.nom=master.client ORDER BY client, designation;";
$connexion = pg_connect("user=adminpg password=alice dbname=intranet");

if($connexion != false)
{
	$recherche = pg_query($connexion, $sql1);
	$i = "";    
	$clients = array();
	echo $recherche;
	while($ligne = pg_fetch_assoc($recherche))
    
	{
	
	$e= $ligne['client'];
	$r= $ligne['id_client'];	
	if($i != $e)
	
	{
		$clients[$r] = array();
		$clients[$r][0] = $ligne['client'];
		$clients[$r][1] = array();
		$i = $e;
		$id = 0;
		
	}
	$clients[$r][1][$id] = $ligne['designation'];
	$id++;
	
    }


    /* On sérialise le tableau obtenu pour traitement par JavaScript */
    $chaine = htmlspecialchars(serialize($clients), ENT_QUOTES);
?>
<pre>
<?php
	var_dump($clients);
	var_dump($chaine);
?>
</pre>
<script type="text/javascript">
/* <![CDATA[ */
<!--
/*
* Ici, on transmets la chaîne sérialisée à JavaScript 
* pour la transformer en tableau indexé JavaScript 
*/
var tableau = new PhpArray2Js('<?php echo $chaine; ?>');
var tab = tableau.retour();
// -->
/* ]]> */
</script>

</head>
<body style="font-family: verdana, helvetica, sans-serif; font-size: 85%">
<h3>Version Utilisant JavaScript</h3>
<p>Vous constaterez que le délai de latence entre la sélection et la mise à jour est quasiment inexistant.</p>
<?php
if(isset($_POST['ok']) && isset($_POST['departement']) && $_POST['departement'] != "")
{
    $region_selectionnee = $_POST['region'];
    $dept_selectionne = $_POST['departement'];
?>
<p>Vous avez sélectionné le département <?php echo($dept_selectionne); ?> dans la région <?php echo($region_stionnee); ?></p>
<?php
}
?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgdept">
  <fieldset style="border: 3px double #333399">
  <legend>Sélectionnez une région</legend>
    <select name="region" id="region" onchange="changeDept(tab,this.value);">
      <option value="vide">- - - Choisissez une région - - -</option>
    <?php
    /* Construction de la première liste : on se sert du tableau PHP */
    $nbr = count($clients);
    foreach($clients as $nr => $nom)
    {
        ?>
    <option value="<?php echo($nr); ?>"><?php echo($nom[0]); ?></option>
<?php
    }
    ?>
    </select>
    <!-- ICI, le secret : on met un bloc avec un id ou va s'insérer le code de
         la seconde liste déroulande -->
  <span id="blocDepartements"></span><br />
  <input type="submit" name="ok" id="ok" value="Envoyer" />
  </fieldset>
</form>
<?php

}
else
{
    /*  Si vous arrivez ici, vous avez un gros problème avec la connexion au serveur de base de données */
?>
</head>
<body>
<p>La connexion au serveur de base de données a échoué. Aucun élément ne peut être affiché.</p>
<?php
}
?>
<p><a href="./index.php" title="Aller vers la version 100% PHP">Aller vers la version 100% PHP</a></p>
</body>
</html>
mon var_dump de $clients donne ça:

Code : Tout sélectionner

array(2) { [2]=> array(2) { [0]=> string(4) "CGEA" [1]=> array(2) { [0]=> string(16) "MASTER 1 de CGEA" [1]=> string(16) "MASTER 2 de CGEA" } } [1]=> array(2) { [0]=> string(4) "NERV" [1]=> array(3) { [0]=> string(16) "MASTER 1 de NERV" [1]=> string(16) "MASTER 2 de NERV" [2]=> string(16) "MASTER 3 de NERV" } } }
donc niquel. Et mon var_dump de $chaine ceci:

string(286) "a:2:{i:2;a:2:{i:0;s:4:"CGEA";i:1;a:2:{i:0;s:16:"MASTER 1 de CGEA";i:1;s:16:"MASTER 2 de CGEA";}}i:1;a:2:{i:0;s:4:"NERV";i:1;a:3:{i:0;s:16:"MASTER 1 de NERV";i:1;s:16:"MASTER 2 de NERV";i:2;s:16:"MASTER 3 de NERV";}}}"

bon aussi.

Donc maintenant sur ma première liste j'ai bien le nom de mes client qui s'affichent (et en un seul exemplaire en plus) mais quand je selectionne mon client le deuxieme menu avec les designations ne s'affiche pas.

J'ai changé dans le changeDept.js tout les idr pas id_client mais rien.

Voilà je voudrais bien un coup de main encore svp j'arrive au bout là :)

Mammouth du PHP | 19672 Messages

21 oct. 2005, 12:17

Pour t'aider à débugguer la partie JavaScript, tu peux utiliser alert() pour faire afficher tes variable et vérifier de cette manière que l'information transmise est bien celle attendue: Et la plupart du temps si l'application ne fonctionne pas, c'est précisément parce cette valeur est inexistante, invalide ou n'est tout simplement pas la bonne.

L'architecture d'un programme en JavaScript n'est pas fondamentalement différente du PHP en ce sens qu'on fait également appel à des alternatives, à des boucles et à des fonctions ou méthodes.

Dans ton script actuel, lorsque tu sélectionne une valeur dans ta liste déroulante, il y a un évènement onchange() qui fait appel au JavaScript en envoyant une information, en l'occurrence la valeur (attribut value) de la balise option sélectionnée. Est-ce que cette valeur est le bon identifiant permettant de faire afficher la seconde liste correspondant. En début de la fonction JavaScript changeDept(), ajoute une ligne alert() pour afficher la valeur des paramètres envoyés et vérifie si c'est bon ou pas.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 119 Messages

21 oct. 2005, 12:28

au tout début du fichier j'ai mis une

alert("test");

mais meme en faisant ça il se passe rien :/

je remet le code du js :
/* On crée la fonction qui va construire la seconde liste déroulante */ 
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  = '<select name="departement" id="departement">'; 
    for(var j = 0;  j < nbd; j++) 
    { 
        form_d += '  <option value="'+ tab[idr][1][j] +'">'+ tab[idr][2][j] +" ("+ tab[idr][1][j] +')<\/option>'; 
    } 
    form_d += '<\/select>'; 
    } 
    else 
    { 
        form_d = ""; 
    } 
    document.getElementById("blocDepartements").innerHTML = form_d; 
}

Mammouth du PHP | 19672 Messages

21 oct. 2005, 12:39

Rajoute les alert():
/* On crée la fonction qui va construire la seconde liste déroulante */
function changeDept(tab,idr)
{
    alert(tab ='\n'+idr);
    if(idr != "vide")
    {
        /* On compte les départements de cette région */
        var nbd = tab[idr][1].length;
        var form_d  = '<select name="departement" id="departement">';
        for(var j = 0;  j < nbd; j++)
        {
            form_d += '  <option value="'+ tab[idr][1][j] +'">'+ tab[idr][2][j] +" ("+ tab[idr][1][j] +')<\/option>';
        }
        form_d += '<\/select>';
    }
    else
    {
        form_d = "";
    }
    document.getElementById("blocDepartements").innerHTML = form_d;
}
Et vois ce que ça t'affiche.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 119 Messages

21 oct. 2005, 12:51

Il ne se passe rien que je mette
 alert(tab ='\n'+idr); 
ou ça
 alert("test"); 
:/

je suis meme pas sur qu'il lance le js en fait maintenant

Eléphant du PHP | 119 Messages

21 oct. 2005, 14:21

C'est bon tout fonctionne :D

c'est à cause de
 form_d += '  <option value="'+ tab[idr][1][j] +'">'+ tab[idr][2][j] +" ("+ tab[idr][1][j] +')<\/option>'; 
je n'avais pas de [idr][2] dans ma liste je n'avais pas vu celui là.

donc tout passe :D merci

Donc voilà maintenant ultime question:

comment faire pour que quand je selectionne mon client j'ai pas 1 mais 5 liste qui apparraissent derrière avec chacune un name et id différent bien sur pour pouvoir récupe derrière le post?

Eléphant du PHP | 119 Messages

21 oct. 2005, 14:35

C'est bon j'ai ma réponse:
/* On crée la fonction qui va construire la seconde liste déroulante */ 
function changeDept(tab,idr) 
{ 
    alert(tab ='\n'+idr); 
    if(idr != "vide") 
    { 
        /* On compte les départements de cette région */ 
        var nbd = tab[idr][1].length; 
        var form_d  = '<select name="departement" id="departement">'; 
        var form_d1  = '<select name="departement1" id="departement1">';
        for(var j = 0;  j < nbd; j++) 
        { 
            form_d += '  <option value="'+ tab[idr][1][j] +'">'+ tab[idr][1][j] +')<\/option>'; 
            form_d1 += '  <option value="'+ tab[idr][1][j] +'">'+ tab[idr][1][j] +')<\/option>'; 
        } 
        form_d += '<\/select>'; 
        form_d1 += '<\/select>'; 
    } 
    else 
    { 
        form_d = ""; 
    } 
    document.getElementById("blocDepartements").innerHTML = form_d; 
    document.getElementById("blocDepartements1").innerHTML = form_d1; 
} 
et je rajoute dans mon php le span blocDepartements1

Voilà.

Merci pour tout vos conseils :D