Listes déroulantes liées et valeur réinitialisée.
Bonjour,
j'ai dans un formulaire de recherche, 2 listes déroulantes liées (marque et modèles). En gros en fonction de la marque choisie dans la liste "marque", les modèles correspondant apparaissent dans la liste "modèle".
Mon soucis est que je souhaiterais qu' en tête de liste, j'ai le texte "Choisissez une marque" qui apparaisse, mais qu'une fois la marque choisie celle-ci apparaisse en tête de liste.
J'ai également une autre question. Comme mon formulaire apparaît sur chacune de mes pages, j'aimerai qu'une fois la recherche effectuée, la tête de liste de mes liste "marque" et "modèle" soient à nouveau le texte "Faites votre choix" et n'aient plus les valeurs choisies précédemment.
Faut-il utiliser des session pour cela? est-ce bien nécessaire dans ce cas?
-> Cyrano puisqu'il y a de fortes chances que tu lises ce post, j'avais trouvé sur http://forum.phpfrance.com/faq-tutoriels/formulaires-listes-deroulantes-dynamiques-liees-t4562.html un script que tu as fait je pense. Il fonctionne très bien mais je n'arrive pas à l'adapter à mon cas. J'en ai donc refais un plus simple je pense. Donne-moi ton avis si tu veux bien.
A noter que je fais appel à des fonctions extérieures (ex: select_carburant();)
Donc si quelqu'un a une idée merci d'avance
Voici mon code :
if (isset($_POST['ok']) && (!empty($_POST['marque']))) //Teste si le formulaire a bien été soumis { $select_marque =$_POST['marque']; //On récupère la marque $select_model =$_POST['model']; //On récupère le modèle choisit $choix =$_POST['marque']; } else //La page simplement relancée (Onchange) { /* $choix=$_POST['marque']; //On récupère la marque */ } define('LIST_SELECTED', ' selected="selected"'); //Début du formulaire echo '<form action="'.$_SERVER['PHP_SELF'].'" method="POST" id="mon_form">'; $request_marque=mysql_query("SELECT * FROM marque"); //Requète pour les marques ?> <legend>Marque :</legend> <SELECT name="marque" size="1" style="width:200px" onchange="document.forms['mon_form'].submit();"> <?PHP echo '<OPTION value="'.$choix.'">--Faites votre choix--</OPTION>'; while($donnees_marque=mysql_fetch_array($request_marque)) { $listchecked =($donnees_marque['marque'] == $choix) ? LIST_SELECTED : null; echo '<OPTION value="'.$donnees_marque['marque'].'" '.$listchecked.'>'.$donnees_marque['marque'].'</OPTION>'; $nom_marque =$_POST['marque']; } echo '</SELECT><br />'; $request_model=mysql_query("SELECT model.id_model, model.code_model, model.code_marque, model.model, marque.id_marque, marque.code_marque, marque.marque FROM model INNER JOIN marque ON marque.code_marque=model.code_marque WHERE 1=1 AND marque.marque='$nom_marque'"); echo '<legend>Modèle :</legend>'; echo '<SELECT name="model" size="1" style="width:200px">'; echo '<OPTION></OPTION>'; while($donnees_model=mysql_fetch_array($request_model)) { echo '<OPTION value="'.$donnees_model['model'].'">'.$donnees_model['model'].'</OPTION>'; } echo '</SELECT><br />'; echo '<legend>Carburant : </legend><br />'; select_carburant(); echo '<legend>Kilométrage : </legend><br /> <SElECT name="Kilométrage" size="1" style="width:200px"> Value ><option>Kilométrage</option></SELECT></legend><br />'; echo '<div id="prix">'; echo '<legend>Prix : </legend><br /> <SElECT name="prix" size="1"style="width:97px"> Value ><option>Prix</option></SELECT></legend>'; echo '</div>'; echo '<div id="annee">'; echo '<legend>Année : </legend><br />'; select_annees(); echo '</div>'; echo '<legend>Type de véhicule : </legend><br /> <SElECT name="Type" size="1" style="width:200px"> Value ><option>Type de véhicule</option></SELECT></legend>'; echo '<div id="submit"><input type="submit" name="ok" id="ok" value="ok"/></div>'; echo '</form>';
Réponses apportées à cette discussion
Salut Paintbox,
je suis effectivement l'auteur du tuto de PHPFrance sur les listes liées. Si tu n'arrives pas à l'adapter, c'est que tu as du louper une étape quelque part. Peut-être serait-il opportun de t'attarder aussi sur les commentaires du code qui sont en général assez explicites sur certains détails.
Sinon pour te guider vers la solution, il serait utile que je sache sur quelle version tu te bases : 100% PHP, PHP + JS ou PHP + AJAX ? Si tu es en phase d'apprentissage, je te recommande vivement de commencer par la solution 100% PHP que tu pourras par la suite améliorer avec AJAX sans modifier le code PHP en utilisant quelque chose du style jQuery qui est tout à fait adapté pour ce genre de choses.
Ceci étant, voici un genre de guide pour te simplifier la vie :Algorithme schématique des listes liées
<?php/** * Lister les marques et stocker ça dans un tableau $liste_marques; * Vérifier si le formulaire a été posté : * Si on a une valeur de marque alors : * Stocker l'identifiant de la marque choisie dans une variable $selected_marque; * Lister les modèles correspondant dans un tableau $liste_modeles; * Si on a une valeur de modèle choisi Alors : * Stocker l'identifiant du modèle choisi dans une variable $selected_modele; * Traiter les données sélectionnées à partir de nos deux données; * Sinon : * Initialiser la variable $selected_modele à NULL; * Fin-Si; * Sinon : * Initialiser la variable $selected_marque à NULL; * Initialiser la variable $liste_modeles à array(); * Construire le formulaire; * Fin-Si; */
Ben oui, juste des commentaires et pas une ligne de code, décevant hein ? :P Mais tu noteras que j'ai indenté ça et que j'ai utilisé des Si/Sinon/Fin-Si histoire de rendre ça plus parlant : analyse ça pour bien en comprendre le déroulement et traduis ça en code :)
Errata : il en manque un petit bout : la ligne 17 « Construire le formulaire » devrait également être présente juste après la ligne 12.
Attention, ça veut dire que tu as intérêt à optimiser un peu pour ne pas construire deux fois le même code de formulaire. Cherche un peu ici ce que j'ai pu poster sur les templates et la syntaxe HEREDOC, ça pourra s'avérer très très pratique.
Hello Cyrano,
merci pour ta réponse. Je me base uniquement sur la version 100% PHP . Je préfère avancer sur PHP et passer plus tard à Java. Chaque chose en son temps.
Merci pour ton algorithme, j'avais également essayé d'en faire une, mais il n'étais peut être pas aussi complète.
J'ai malgré tout une question pourquoi nécessairement stocker dans des tableaux? La version que j'ai fait jusuq'à présent, n'en utilisait pas et fonctionnait quand même. J'avais déjà remarqué cela dans ton script sur PHPFrance.
Je vais le suivre et essayer d'avancer.
Merci !
Le tableau est un élément natif du langage est la lecture est très rapide. Ça permet en outre de découper ton code en étapes sans tout mélanger.
Mais il y a un autre élément que je n'ai pas indiqué, mais que tu vas découvrir avec le temps : utiliser une variable non initialisée génère en général un warning. Mais Si elle est initialisée, le fait qu'elle soit vide (ou NULL) ou bien ayant une valeur peut s'avérer très pratique à l'usage dans la construction de ta page : selon le cas, tu affichera telle ou telle partie du code HTML. Mais comme ta variable est prête d'avance, tu t'en préoccupe le moment venu.
L'idée générale, c'est de rassembler les morceaux avec un peu d'ordre et de méthode et quand tu as toutes les pièces, tu construis l'objet final, quasiment de la même manière que tu fais une maquette d'avion ou de bateau : tu rassembles les pièces, les peintures, les éléments de décors, tu classes tout ça et ensuite tu commences à assembler sans chercher quoique ce soit puisque tout est disponible et sous la main :)