Liste lié

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Liste lié

par saebakun » 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

par saebakun » 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?

par saebakun » 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

par Cyrano » 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.

par saebakun » 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; 
}

par Cyrano » 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.

par saebakun » 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à :)

par Truc » 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

ça vient

par saebakun » 20 oct. 2005, 16:24

Bon je commence à bien comprendre la création de la $chaine

Voici mon code actuellement:
<?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, designation from master ORDER BY client, designation;";
$sql2 = "SELECT designation FROM master;";
$connexion = pg_connect("user=adminpg password=alice dbname=intranet");

if($connexion != false)
{
	$recherche = pg_query($connexion, $sql1);

	$i = "";    
	$r = 1;
	$clients = array();

    
	while($ligne = pg_fetch_assoc($recherche))
    {
	
	$e= $ligne['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++;
	$r++;
	
    }
    /* 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>
Voilà ce que me renvoie un var_dump de $clients

Code : Tout sélectionner

array(5) { [1]=> array(2) { [0]=> string(4) "CGEA" [1]=> array(1) { [0]=> string(16) "MASTER 1 de CGEA" } } [2]=> array(1) { [1]=> array(1) { [1]=> string(16) "MASTER 2 de CGEA" } } [3]=> array(2) { [0]=> string(4) "NERV" [1]=> array(1) { [0]=> string(16) "MASTER 1 de NERV" } } [4]=> array(1) { [1]=> array(1) { [1]=> string(16) "MASTER 2 de NERV" } } [5]=> array(1) { [1]=> array(1) { [2]=> string(16) "MASTER 3 de NERV" } } }
et un var_dump de $chaine:

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

Ma page s'affiche bien j'ai la premiere liste mais elle bug un peu ça donne
en premier choix "CGEA"
en deuxieme choix "" (un champ vide)
en troisieme choix "NERV"
en quatrieme "" (un champ vide)
en cinquieme "" (un champ vide)

alors que je devrait avoir que la ligne 1 et 3

et le deuxieme ne s'affiche pas du tout quand je selectionne dans le premier.

Voilà si y'a des idées je suis preneur là je séche un peu :/

par saebakun » 20 oct. 2005, 09:50

Oui je voulais juste préciser que les noms était pas complet c'est tout ^_^

on peut passer à la suite si c pas grave pour le moment.

par Cyrano » 20 oct. 2005, 09:46

Tu as donc les deux sociétés : c'est ce que tu voulais jusque là non ?

par saebakun » 20 oct. 2005, 09:46

un var_dump de $chaine me rend ceci:

string(56) "a:2:{i:0;s:4:"CGEA";i:1;s:4:"NERV";}"

par saebakun » 20 oct. 2005, 09:35

ok donc j'ai ça:
<?php 
$sql1 = "SELECT DISTINCT client FROM master ORDER BY client;"; 
$sql2 = "SELECT designation FROM master;"; 
$connexion = pg_connect("user=adminpg password=alice dbname=intranet"); 

if($connexion != false) 
{ 
    $recherche = pg_query($connexion, $sql1); 
    $client= array(); 

    while($ligne = pg_fetch_assoc($recherche)) 
    { 
        $clients[] = $ligne['client']; 
    } 
    /* On sérialise le tableau obtenu pour traitement par JavaScript */ 
    $chaine = htmlspecialchars(serialize($clients), ENT_QUOTES); 
?> 
} 

Mais j'ai toujours le fait que dans ma liste je n'ai que la première lettre du nom du client qui apparait, je suis en train de fouiner dans le javascript mais je vois pas ou il le coupe comme ça

par Cyrano » 20 oct. 2005, 09:32

Alors c'est normal que tu aies plusieurs fois le même client : et donc à priori il va falloir procéder avec deux requêtes : llla première pour lister seulement les clients, et la suivante pour les différentes lignes en fonction d'un client bien précis.

par saebakun » 20 oct. 2005, 09:09

Oui exactement.

En fait c'est un tableau qui repertorie mes masters et designation et le nom de chacun d'entre eux, et je rajoute le nom du client pour chaque master.

mon tableau laster est comme ceci:

CREATE TABLE master
(
client varchar(30),
designation varchar(80),
cd int4,
dvd int4,
ref varchar(20)
)

je peux du coup avoir plusieurs fois le meme client mais chaque designation est unique.