Page 1 sur 1

Aide sur tuto de liste déroulante imbriquées

Posté : 26 janv. 2008, 03:11
par stefane321
Bonjour,

J'ai utilisé le tutoriel suivant pour faire une liste déroulante qui en fait apparaite une autre.

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

J'ai pris la solution javascript.

Donc, je m'en sert dans 2 pages.

La première je crée l'utilisateur.

La deuxième, sert a modifier les info sur l'utilisateur.

Le script de liste déroulante fonctionne bien mais j'ai besoin d'aide pour y faire une petite modification afin que dans la page de modification des données de l'utilisateur je ne perde pas les données d'origine de la région et de la ville.

Car actuellement, supposons que je veule seulement changer son numéro de téléphone, je dois aussi penser a resélectionner la région et la ville sinon dans la bd les champs region_id et departement_id viennent a 0.

J'espère que vous pourrez m'aider. Merci!

Voici mon code (je vous colle seulement les bout relatif aux liste déroulante car sinon on s'en sortira pas la page est très longue:
include("../config.php");
/* Requête SQL de récupération des données */
$sql = "SELECT id_departement AS idd, departement AS dept, region.id_region AS idr, region ".
"FROM departement, region ".
"WHERE departement.id_region = region.id_region ".
"ORDER BY region.id_region;";
/* Connexion et exécution de la requête */
$connexion = mysql_pconnect($host, $login, $password);
if($connexion != false)
{
    $choixbase = mysql_select_db($db, $connexion);
    $recherche = mysql_query($sql, $connexion);
    /* Pour ne pas écraser mes tableaux, je crée un témoin */
    $temoin_r = 0;
    /* Création du tableau PHP des valeurs récupérées */
    $regions = array();
    /* Index du département par tableau régional */
    $id = 0;
    while($ligne = mysql_fetch_assoc($recherche))
    {
        $r = $ligne['idr'];
        $d = $ligne['idd'];
        /* Je vérifie si je suis toujours dans la même région, sinon je crée les tableaux nécessaires */
        if($temoin_r != $r)
        {
            $regions[$r] = array();
            /* J'ajoute laa région */
            $regions[$r][0] = $ligne['region'];
            $regions[$r][1] = array();
            $regions[$r][2] = array();
            $temoin_r = $r;
            $id = 0;
        }
        /* J'ajoute les départements */
        $regions[$r][1][$id] = $d;
        $regions[$r][2][$id] = $ligne['dept'];
        $id++;
    }
    /* On sérialise le tableau obtenu pour traitement par JavaScript */
    $chaine = htmlspecialchars(serialize($regions), ENT_QUOTES);
?>
<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>
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_selectionnee); ?></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($regions);
    foreach($regions as $nr => $nom)
    {
        ?>
    <option value="<?php echo($nr); ?>"><?php echo(utf8_encode($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 />
  </fieldset>
</form>
<?php
    
} 
Voici ma bd:

Code : Tout sélectionner

CREATE TABLE `Ventes_gestion` ( `id` int(255) NOT NULL auto_increment, `nom_entreprise` varchar(255) NOT NULL default '', `services` text NOT NULL, `personne_contact` varchar(255) NOT NULL default '', `url_web` varchar(255) NOT NULL default '', `courriel` varchar(255) NOT NULL default '', `telephone` varchar(255) NOT NULL default '', `tel_sans_frais` varchar(255) NOT NULL default '', `telecopieur` varchar(255) NOT NULL default '', `adresse` text NOT NULL, `code_postal` varchar(255) NOT NULL, `date_dernier_appel` date NOT NULL, `recall` int(1) NOT NULL, `date_de_rappel` date NOT NULL, `soumission_envoye` int(1) NOT NULL default '0', `message` text NOT NULL, `image` varchar(255) NOT NULL default '', `status` int(1) NOT NULL, `region_id` int(255) NOT NULL, `ville_id` int(255) NOT NULL, PRIMARY KEY (`id`) )
Merci!

Posté : 26 janv. 2008, 09:41
par Cyrano
Ça veut donc dire que tu dois avoir une valeur par défaut dans les listes de ton formulaire et dans ce cas, il faut récupérer ces valeurs et sélectionner les options correspondantes.

Comment fonctionne le système ? Avec des paramètres : si un premier paramètre est présent, la première liste s'affiche avec la valeur qui avait été choisie sélectionnée et on a la seconde liste où la sélection reste à faire : partant de là, tu peux rapidement conclure qu'avec un second paramètre, tu pourrais aussi présélectionner l'option de la seconde liste aussi.

Sauf que la solution JavaScript n'est peut-être pas la plus appropriée pour faire ça justement parce que les paramètres sont dans le cache du navigateur : au chargement de la page, il n'y en a aucun. Donc ce que tu pourrais explorer, c'est d'ajouter des paramètres et dans le traitement PHP, récupérer ces paramètres et construire les listes en PHP en pré-sélectionnant les options qui vont bien : si tu conserves la structure du code avec les gestionnaires d'évènement onchange, ça ne t'empèchera pas de modifier les valeurs via JavaScript.

Posté : 27 janv. 2008, 06:43
par stefane321
Je suis revenue en arrière, dans le sens où en tout premier lieu j'ai essayé la façon 100% PHP.

Je reviens en arrière car j'ai d'autres problèmes avec celle en javascript:

- Mon navigateur me sors un pop up avec un message disant que le script ne répond pas, voulez-vous continuer ou arreter.

-Ne m'y connaissant pas trop en javascript c'est plus simple pour moi modifier celui en php. (Les caractères accentué bug je dois ajouter utf8_decode()

Cependant, j'ai un bug avec celui en php :

Je dois mettre $_SERVER['PHP_SELF'] comme cible d'action pour que sa marche.

Mais là je me peux plus envoyer mes données vers ma page update_prospect.php

Mon form original:
<form method="post" action="update_prospect.php" enctype="multipart/form-data">
Mon form modifié pour que sa marche:
<form id="chgdept" method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>" enctype="multipart/form-data">
Avez-vous une solution?

Merci!

Posté : 27 janv. 2008, 07:53
par Cyrano
La solution est qu'effectivement, si on fait une sélection dans la première liste et qu'on recharge la même page pour avoir la seconde, il faudrait modifier la valeur de l'attribut action lors de ce rechargement, mais ça ne fonctionnerait plus si on décidait de modifier la première sélection.

Donc la solution passerait par d'abord laisser le $_SERVER['PHP_SELF'] comme action et ensuite dans le bouton d'envoi un gestionnaire d'évènement onclick appelant une modification dynamique de la cible, quelque chose du genre :

Code : Tout sélectionner

<input type="submit" id="envoi" value="Enregistrer" onclick="this.form.action='update_prospect.ph'; this.form.submit();" />
À tester, en tous cas je suggère que tu explores dans cette direction.

Posté : 27 janv. 2008, 20:03
par stefane321
ok merci, cette solition fonctionne.

Je colle le code exact pour d'autre a qui sa peut servir:
<form id="chgdept" name="chgdept" action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post">
<input type='submit' name='submit22' value='Envoyer' onclick=\"document.forms.chgdept.action='update_prospect.php';\">
Maintenant, j'ai un nouveau problème.

Mon formulaire commence par les champs nom, courriel, adresse .... et la sélection de la région et du département.

Mais lorsque la page se réactualise pour afficher la deuxième liste déroulante je perd les données précédemment entré dans les premiers champs .

Y a t'il une solution autre que de mettre le choix de la région et du département en début de formulaire?

Merci!

Posté : 27 janv. 2008, 20:07
par Cyrano
Autre question :arrow: autre sujet.

Ceci dit on va simplifier : dans la même FAQ, il y a un autre tuto sur la validation de formulaire, tu y verras comment conserver les données saisies.