A propos de la liste deroulante qui s'alimente avec la prece

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 : A propos de la liste deroulante qui s'alimente avec la prece

par logone » 02 mars 2006, 19:28

Tout fonctionne à merveille

Merci aux participants du post pour leur aide

Ci joint le script modifie ca peux servir
<?php
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
require("init.php");
// On récupère si elle existe les valeurs envoyées par le formulaire 
$idr = isset($_POST['pays'])?$_POST['pays']:null;
$dept_selectionne = isset($_POST['departement'])?$_POST['departement']:null;
?>
<!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></title>
<meta http-equiv="Pragma" content="no-cache" />
</head>
<body>
<?php
// On établit la connexion à MySQL 
    $sql1 = "SELECT id, pays FROM pays ORDER BY pays";
    $rech_pays = mysql_query($sql1);
    $code_pays = array();
    $pays = array();
    // On active un compteur pour les pays
    $nb_pays = 0;
    if($rech_pays != false)
    {
        while($ligne = mysql_fetch_assoc($rech_pays))
        {
            array_push($code_pays, $ligne['id']);
            array_push($pays, $ligne['pays']);
            /* On incrémente de compteur */
            $nb_pays++;
        }
    }
    ?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgdept">
<select name="pays" id="pays" onchange="document.forms['chgdept'].submit();">
  <option value="0">---Selectionnez un pays---</option>
    <?php
    for($i = 0; $i < $nb_pays; $i++)
    {
?>
  <option value="<?php echo($code_pays[$i]); ?>"<?php echo((isset($idr) && $idr == $code_pays[$i])?" selected=\"selected\"":null); ?>><?php echo($pays[$i]); ?></option>
<?php
    }
    ?>
</select>
    <?php
    mysql_free_result($rech_pays);
    // On commence par vérifier si on a envoyé un numéro de pays 
    if(isset($idr) && $idr != 0)
    {
        // Création de la requête pour avoir les départements de ce pays
        $sql2 = "SELECT id, dep FROM departement WHERE id_pays='$idr'";
        
            $rech_dept = mysql_query($sql2);
            // compteur pour les départements
            $nd = 0;
            // On crée deux tableaux pour les numéros et les noms des départements
            $code_dept = array();
            $nom_dept = array();
            while($ligne_dept = mysql_fetch_assoc($rech_dept))
            {
                array_push($code_dept, $ligne_dept['id']);
                array_push($nom_dept, $ligne_dept['dep']);
                $nd++;
            }  
            // On construit la liste déroulante
            ?>
<select name="departement" id="departement" onchange="document.forms['chgdept'].submit();"> 
<option value="0">---Selectionnez un département---</option>
            <?php  
            for($d = 0; $d<$nd; $d++)
            {
                ?>		  
				  
  <option value="<?php echo($code_dept[$d]); ?>"<?php echo((isset($dept_selectionne) && $dept_selectionne == $code_dept[$d])?" selected=\"selected\"":null); ?>><?php echo($nom_dept[$d]); ?></option>
                <?php
            }
?>
</select>
<?php

        mysql_free_result($rech_dept);
		
		$idpays = $_POST['pays'];
		$iddep = $_POST['departement'];
    }
?>

par Hermès » 01 mars 2006, 13:37

Hermès >> Nope, dans la méthode donnée ici, on ne modifie pas l'url en passant la valeur du champ sélectionné, on reposte la totalité du formulaire :) Du coup on récupère toute les valeurs saisies, et vu que le pays a été resélectionné par défaut, il est de nouveau renvoyé :)
Excellent, faut que je le note, à chaque fois je me fais une petite fonction qui récupère toutes les données passées en GET pour les réinjecter dans mes liens.

par logone » 01 mars 2006, 13:35

Merci Ryle pour ces explications
Si tu as quelque chose de plus leger je suis preneur mais cette methode me semble pas mal.

par Ryle » 01 mars 2006, 13:32

Logone >> oui, il faut également rajouter le test pour selectionner l'élément dans ta liste de département (Pour chaque département dans ta liste, si idDepartement == idDeptSelectionné, alors tu ajoutes l'attribut "selected" dans le tag option :))

Hermès >> Nope, dans la méthode donnée ici, on ne modifie pas l'url en passant la valeur du champ sélectionné, on reposte la totalité du formulaire :) Du coup on récupère toute les valeurs saisies, et vu que le pays a été resélectionné par défaut, il est de nouveau renvoyé :)

Personnellement, je gérais mes listes imbriquées avec du javascript en supprimant / créant les options de la liste dont j'avais besoin à partir d'un tableau. Depuis le retour en force du httpRequest avec ajax, je regénère un nouveau select et remplace le précédent, ça évite de recharger la page et donc de devoir s'occuper des données des autres champs :)

par logone » 01 mars 2006, 13:27

cela semble fonctionner mais je perd le selected de la seconde liste je vais regarder cela mais je pense etre pres de ma solution je vous tiens au courant.

par Hermès » 01 mars 2006, 13:23

dans le premier cas, il te suffit de soumettre le formulaire lors du onChange de ta liste de département (cf. le pays)

Code : Tout sélectionner

<select name="departement" id="departement" onchange="document.forms['chgdept'].submit();">
Tu perds pas la valeur de la première liste avec ce code ?
Je fais pas exactement comme ça pour mes listes imbriquées donc je connais pas trop le fonctionnement du contenu de ton onChange, mais lorsque la page va être rechargée, tu ne risques pas de trouver dans l'URL plus que la valeur de la deuxième liste ?

par Ryle » 01 mars 2006, 13:13

Qu'est ce que tu attends au final ? tu veux récupérer l'id du pays et du département sur la même page ? ou sur une autre page qui traitera toutes les données de ton formulaire ?

dans le premier cas, il te suffit de soumettre le formulaire lors du onChange de ta liste de département (cf. le pays)

Code : Tout sélectionner

<select name="departement" id="departement" onchange="document.forms['chgdept'].submit();">
Dans le second cas, il te faut un bouton submit t'enverra toutes les données du formulaire vers la page désirée. Tu récupéreras alors ton département et ton pays comme n'importe quel élément du formulaire :)

par Hermès » 01 mars 2006, 13:10

Rajoute un "onChange" à ton deuxième select pour qu'il recharge la page avec cette fois 2 valeurs dans l'URL (pour le département et pour le pays)

par logone » 01 mars 2006, 13:06

En effet c'est ce que je pensais aussi et je n'arrive pas a la recuperer peut etre qu'avec mon code ca sera plus simple
<?php
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
require("init.php");
/* On récupère si elle existe la valeur du pays envoyée par le formulaire */
$idr = isset($_POST['pays'])?$_POST['pays']:null;
$dep = isset($_POST['departement'])?$_POST['departement']:null;
?>
<!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></title>
<meta http-equiv="Pragma" content="no-cache" />
</head>
<body>
<?php
// On établit la connexion à la db
    $sql1 = "SELECT id, pays FROM pays ORDER BY pays";
    $rech_pays = mysql_query($sql1);
    $code_pays = array();
    $pays = array();
    /* On active un compteur pour les pays */
    $nb_pays = 0;
    if($rech_pays != false)
    {
        while($ligne = mysql_fetch_assoc($rech_pays))
        {
            array_push($code_pays, $ligne['id']);
            array_push($pays, $ligne['pays']);
            /* On incrémente de compteur */
            $nb_pays++;
        }
    }
    ?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgdept">
<select name="pays" id="pays" onchange="document.forms['chgdept'].submit();">
  <option value="-1">-Choisissez un pays-</option>
    <?php
    for($i = 0; $i < $nb_pays; $i++)
    {
?>
  <option value="<?php echo($code_pays[$i]); ?>"<?php echo((isset($idr) && $idr == $code_pays[$i])?" selected=\"selected\"":null); ?>><?php echo($pays[$i]); ?></option>
<?php
    }
    ?>
</select>
    <?php
    mysql_free_result($rech_pays);
    /* On commence par vérifier si on a envoyé un numéro de pays et le cas échéant s'il est différent de -1 */
    if(isset($idr) && $idr != -1)
    {
        /* Cération de la requête pour avoir les départements de ce pays */
        $sql2 = "SELECT id, dep FROM departement WHERE id_pays='$idr'";
        
            $rech_dept = mysql_query($sql2);
            /* Un petit compteur pour les départements */
            $nd = 0;
            /* On crée deux tableaux pour les numéros et les noms des départements */
            $code_dept = array();
            $nom_dept = array();
            /* On va mettre les numéros et noms des départements dans les deux tableaux */
            while($ligne_dept = mysql_fetch_assoc($rech_dept))
            {
                array_push($code_dept, $ligne_dept['id']);
                array_push($nom_dept, $ligne_dept['dep']);
                $nd++;
            }
            /* Maintenant on peut construire la liste déroulante */
            ?>
<select name="departement" id="departement">
            <?php  
            for($d = 0; $d<$nd; $d++)
            {
                ?>
  <option value="<?php echo($code_dept[$d]); ?>"<?php echo((isset($dept_selectionne) && $dept_selectionne == $code_dept[$d])?" selected=\"selected\"":null); ?>><?php echo($nom_dept[$d]." (". $code_dept[$d] .")"); ?></option>
                <?php
            }
?>
</select>
<?php

        
        /* Un petit coup de balai */
        mysql_free_result($rech_dept);
		
		$idpays = $_POST['pays'];
		$iddep = $_POST['departement'];
    }
?>
J'ai adapte le script pour mon developpement
je cherche le departement suivant le pays donc
si je fais
echo $idpays; // ca fonctionne pas de soucis
echo $iddep; // ne marche pas et je ne vois pas comment il pourrait fonctionner car la page ne se reload pas quand on selectionne le departement

J'espere eclairer un peu le probleme

par charabia » 01 mars 2006, 12:13

Bé tu as deux select bien distincts non ?

par zeus » 01 mars 2006, 12:12

la valeur sélectionnée dans la seconde liste déroulante de l'exemple de Cyrano doit se trouver dans $_POST["departement"] ... :-k

Sinon, je ne comprend pas trop ton pb

A propos de la liste deroulante qui s'alimente avec la prece

par logone » 01 mars 2006, 12:07

Salut,

J'ai reussi a integrer la routine

http://www.phpfrance.com/forums/voir_sujet-4562.php

qui fonctionne correctement, comme la question avait ete posée une fois que j'ai mon choix il me manque l'essenciel l'envoyer vers une autre page et la hic j'arrive pas a recuperer mes variables

pour la premiere liste pas de soucis je recupere grace a la variable $POST mais pour la seconde liste comment faire pour recuperer l'id de l'element selectionné ??

Je pense ne pas etre le seul à avoir eu le probleme enfin j'espere

Merci de votre aide

[/php]