IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Liste de choix dépendant de plusieurs select


Sujet :

AJAX

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur après-vente
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut [AJAX] Liste de choix dépendant de plusieurs select
    Salut vous tous !

    Après avoir bien cherché (puisque je sais que cette question est récurrente), je n'ai trouvé nulle part de réponse à mon problème, d'ou mon post.
    Je souhaite faire en AJAX une partie d'un formulaire qui pour le moment est en pur PHP (j'ai un niveau inexistant en JS), et fonctionne très bien.

    Pour faire simple, j'ai un tableau de machines, de marques et modèles variés, qui sont installées chez plusieurs clients.
    Dans mon formulaire, on choisi d'abord le client, ensuite la marque (filtrée avec le choix du client), puis le modèle (filtré avec le client ET la marque) et enfin le nom de la machine, filtré avec les trois paramètres d'avant.

    voici mon extrait de code en php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    <div class="bloc">
    <label>Customer : </label>
       <select name="Customer" id="Customer" OnChange="this.form.submit()" />
       <option value="-1" <?php if(isset($Customer) && $Customer != -1){echo "selected";} ?> >--Choisir--</option>
    <?php 
    $res = mysql_query("SELECT COUNT( * ) AS Enregistrements , Customer FROM ToolBase GROUP BY Customer"); // on appelle la table pour extraire la liste des criteres
    while( $val = mysql_fetch_array($res)) 
    {
    ?>
       <option value="<?php echo $val['Customer']?>" <?php if ($Customer==$val['Customer']){echo " selected";} 
       ?>
       >
       <?php echo $val['Customer'] ?>
       </option>
     
    <?php
    }
       ?>
    </select>
     
    <label>Manufacturer : </label>
    <select name="Manufacturer" id="Manufacturer" OnChange="this.form.submit()" />
       <option value="-1" <?php if(isset($Manufacturer) && $Manufacturer != -1){echo "selected";} ?> >--Choisir--</option>
    <?php 
     
    $res = mysql_query("SELECT COUNT( * ) AS Enregistrements , Manufacturer FROM ToolBase WHERE Customer='$Customer' GROUP BY Manufacturer"); // on appelle la table pour extraire la liste des Constructeurs, sans conditions
    while( $val = mysql_fetch_array($res)) 
    {
    ?>
       <option value="<?php echo $val['Manufacturer']?>" <?php if ($Manufacturer==$val['Manufacturer']){echo " selected";} 
       ?>
       >
       <?php echo $val['Manufacturer'] ?>
       </option>
    <?php
       }?>
     
    </select>
    </div>
     
    <div class="bloc">
    <label>System Type : </label>
       <select name="System_type" id="System_type" OnChange="this.form.submit()" />
       <option value="-1" <?php if(isset($System_type) && $System_type != -1){echo "selected";} ?> >--Choisir--</option>
    <?php 
    // on appelle la table pour extraire la liste des systemes du constructeur choisi
     
    $res = mysql_query("SELECT COUNT( * ) AS Enregistrements , System_type FROM ToolBase WHERE Customer='$Customer' AND Manufacturer='$Manufacturer'  GROUP BY System_type"); 
    while( $val = mysql_fetch_array($res)) 
    {
    ?>
       <option value="<?php echo $val['System_type']?>" <?php if ($System_type==$val['System_type']){echo " selected";} 
       ?>
       >
       <?php echo $val['System_type'] ?>
       </option>
    <?php
       }?>
     
    </select>
     
     
    <label>Tool Name : </label>
       <select name="Tool_name" id="Tool_name" OnChange="this.form.submit()" />
       <option value="-1" <?php if(isset($Tool_name) && $Tool_name != -1){echo "selected";} ?> >--Choisir--</option>
    <?php 
    // on appelle la table pour extraire la liste des tools finale
     
    $res = mysql_query("SELECT COUNT( * ) AS Enregistrements , Tool_name FROM ToolBase WHERE Customer='$Customer' AND Manufacturer='$Manufacturer'AND System_type='$System_type' GROUP BY Tool_name"); 
    while( $val = mysql_fetch_array($res)) 
    {
    ?>
       <option value="<?php echo $val['Tool_name']?>" <?php if ($Tool_name==$val['Tool_name']){echo " selected";} 
       ?>
       >
       <?php echo $val['Tool_name'] ?>
       </option>
    <?php
       }?>
     
    </select>
    </div>

    J'ai essayé d'adapter le très bon Tuto de Loïc Laffont, mais sans succès, puisqu'il ne passe que le choix de la liste N-1, et pas les autres choix...

    Comment faire pour récupérer dans mon fichier RetourPHP.php les choix des 2 ou 3 select précédents ??

    Merci d'avance pour vos lumières !!

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonsoir,

    Je ne vois aucune fonction javascript moi, tu faits un submit à chaque onchange. Je ne vois pas trop le rapport avec AJAX

    A+.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 139
    Points : 171
    Points
    171
    Par défaut
    Bonjour,

    il faudrait déjà penser à séparer un peu le code, parce que le traitement base de données au beau milieu de la vue html, c'est un peu sale.

    Ensuite ton problème n'est pas spécialement difficile à résoudre :
    - ton premier <select> dédié aux clients est peuplé au chargement de la page
    - tes autres <select> seront présent, mais vides (sans <option>)

    sur le onChange de ton <select> dédié aux clients, tu fais un appel Ajax vers une méthode à laquelle tu fournis l'id du client. Le serveur le traite et construit une liste de marques qui sera insérée dans ton second <select>.

    sur le onChange du second <select> dédié aux marques, tu fais un autre appel Ajax vers une méthode qui traitement l'id de la marque et du client, tu fais une requete contenant les 2 coté serveurs et tu peuples le 3è <select>

    et tu fais de même jusqu'au choix de la machine.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur après-vente
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    Bonsoir,

    Je ne vois aucune fonction javascript moi, tu faits un submit à chaque onchange. Je ne vois pas trop le rapport avec AJAX

    A+.
    J'ai précisé que c'était mon code existant, c'est à dire en pur PHP...que je souhaite améliorer avec de l'Ajax pour éviter de recharger ma page à chaque changement dans un select..

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur après-vente
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par bewidia Voir le message
    Bonjour,

    il faudrait déjà penser à séparer un peu le code, parce que le traitement base de données au beau milieu de la vue html, c'est un peu sale.

    Ensuite ton problème n'est pas spécialement difficile à résoudre :
    - ton premier <select> dédié aux clients est peuplé au chargement de la page
    - tes autres <select> seront présent, mais vides (sans <option>)

    sur le onChange de ton <select> dédié aux clients, tu fais un appel Ajax vers une méthode à laquelle tu fournis l'id du client. Le serveur le traite et construit une liste de marques qui sera insérée dans ton second <select>.

    sur le onChange du second <select> dédié aux marques, tu fais un autre appel Ajax vers une méthode qui traitement l'id de la marque et du client, tu fais une requete contenant les 2 coté serveurs et tu peuples le 3è <select>

    et tu fais de même jusqu'au choix de la machine.
    Merci pour la réponse, mais ça, c'est le principe (que j'avais bien en tête).
    Ce qu'il me manque, c'est la manière de le programmer, sachant que j'ai des connaissances quasi-nulles en JS...ma méthode consiste à customiser du code existant pour l'adapter à mon besoin tout en comprenant petit à petit comment ça fonctionne (formation sur le tas, comme on dit ;-))

    La vraie question, c'est comment passer 2 id (ou 3, ou 4) en ajax.

  6. #6
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Citation Envoyé par elmanu13 Voir le message
    Ce qu'il me manque, c'est la manière de le programmer, sachant que j'ai des connaissances quasi-nulles en JS...ma méthode consiste à customiser du code existant pour l'adapter à mon besoin tout en comprenant petit à petit comment ça fonctionne (formation sur le tas, comme on dit ;-))
    Commence par lire un tutoriel Javascript, puis regarde ce tutoriel AJAX (Tu trouveras comment lier des listes).

    A+.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 139
    Points : 171
    Points
    171
    Par défaut
    Tu peux passer autant de paramètres que tu veux en Ajax, c'est comme un formulaire que tu soumets à un script serveur.

    Le plus synthétique, c'est de faire pour chaque select une méthode JS et PHP.

    Tu dis ne pas bien connaitre le JS donc ce que je te conseille n'est peut-être pas l'idéal pour l'apprendre, mais jQuery permet de franchement simplifier l'accès aux éléments DOM et les requêtes Ajax.

    en HTML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <select id="clients" onChange="changeClient()">[...]</select>
    <select id="marques" on Change="changeMarques()"></select>
    <select id="modeles" on Change="changeModeles()"></select>
    en JS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function changeClient(){
    scriptServeur="/serveur/script/getMarques.php?idClient="+document.getElementById("clients").value
     
    //appel serveur et recup reponse
    }
     
    function changeMarques(){
    scriptServeur="/serveur/script/getModeles.php?idClient="+document.getElementById("clients").value+"&idMarque="+document.getElementById("marques").value
     
    //appel serveur et recup reponse
    }
    les appels AJAX sont au choix du POST ou du GET, coté serveur ce sont de simples scripts qui reçoivent les $_POST / $_GET, font le traitement qui va bien et répondent soit en html (dans ton cas) soit en xml (ou mieux de l'xml transformé en html avec xslt :p)

    Bon courage

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur après-vente
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    Commence par lire un tutoriel Javascript, puis regarde ce tutoriel AJAX (Tu trouveras comment lier des listes).

    A+.
    J'ai commencé par ça, et j'ai déjà appliqué le tuto que tu me conseilles sur une partie de mon site qui n'avait besoin que de 2 selects, l'un dépendant de l'autre.
    A partir de 3 selects, le 3e dépendant des 2 autres, ça se complexifie (un peu pour les pros, beaucoup pour moi !), et la réponse de Bewidia va beaucoup m'aider !!

    Je vous tiens au courant quand c'est terminé, merci en tout cas !

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur après-vente
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut damned
    Bon, forcément, sans formation de base en JS, je galère un peu, mais je progresse.
    J'ai compris le principe, mais j'ai une double difficulté à résoudre :
    1-une série de 4 SELECT inter-dépendants les un des autres en cascade (le contenu du 4e dépend du choix des 3 autres et pas uniquement du dernier). Je dois donc me bidouiller une fonction qui fait passer plusieurs paramètres, ça me semble faisable avec un minimum de recherche.
    Une fois ces 4 select remplis, on envoie le tout vers une Database.

    2-l'utilisateur doit pouvoir REVENIR sur ce formulaire, RETROUVER les choix qu'il y a fait (et qui ont donc été sauvés dans une base de données), et pouvoir les MODIFIER.
    Il faut donc que ma fonction, en plus de pouvoir passer plusieurs paramètres, puisse récupérer les valeurs de ces paramètres quand on est en mode modif (un flag en $_GET) pour ajouter la balise "selected" au choix extrait de la database.

    Avant de me lancer vers une méthode qui va ensuite me bloquer pour le point 2, si vous avez des conseils je suis preneur !!

    Merci d'avance (et je vais chercher une formation JS rapidos ;-))

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 139
    Points : 171
    Points
    171
    Par défaut
    Si c'est un nouvel enregistrement, tes select seront vides à part le premier.
    Si c'est une modification, en fonction de ce qu'il y a de sauvegardé dans ton enregistrement, tu peupleras directement les 4 select avec les valeurs possibles disponibles et un selected=selected sur la valeur de l'enregistrement.

    Le fonctionnement du javascript reste le même : il réagit a des onChange sur les select

Discussions similaires

  1. liste de choix dépendantes : pb surprenant
    Par jdesert dans le forum Struts 1
    Réponses: 6
    Dernier message: 11/07/2008, 12h38
  2. [AJAX] Listes chainées - Mauvaise actualisation d'un select
    Par tavarlindar dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 28/05/2008, 15h50
  3. [AJAX] liste de choix
    Par Tikenjahfakouli dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/05/2008, 17h25
  4. Réponses: 2
    Dernier message: 11/08/2006, 11h11
  5. Réponses: 7
    Dernier message: 21/03/2006, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo