Formulaire et listes déroulantes dynamique, mais débutant ...

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 : Formulaire et listes déroulantes dynamique, mais débutant ...

par plex » 19 mai 2008, 16:35

Bon j'ai refait mon ancien Code pour que ca soit plus clair, mais je ne parviens toujours pas a faire fonctionner tout ca :(

J'ai créé 2 autres fichiers php et java pour bien séparer les fonctions
index.php

Code : Tout sélectionner

<?php echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"); /* Variables de connexion : ajustez ces paramètres selon votre propre environnement */ $serveur = "localhost"; $admin = "root"; $mdp = ""; $base = "gestion"; ?> <!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> <script type="text/javascript" src="./dept_xhr.js" charset="iso_8859-1"></script> <script type="text/javascript" src="./pdt_xhr.js" charset="iso_8859-1"></script> <?php /* Requête SQL de récupération des données de la première liste */ /*$sql = "SELECT `id_region` AS idr, `region` ". "FROM `region` ". "ORDER BY `id_region`;"; */ $sql = "SELECT `id` AS idr, `nom` ". "FROM `fournisseur` ". "ORDER BY `id`;"; /* Connexion et exécution de la requête */ $connexion = mysql_connect($serveur, $admin, $mdp); if($connexion != false) { $choixbase = mysql_select_db($base, $connexion); $recherche = mysql_query($sql, $connexion); /* Création du tableau PHP des valeurs récupérées */ // $regions = array(); $fournisseurs = array(); /* Index du département par tableau régional */ $id = 0; while($ligne = mysql_fetch_assoc($recherche)) { // $regions[$ligne['idr']] = $ligne['region']; $fournisseurs[$ligne['idr']] = $ligne['nom']; } ?> </head> <body style="font-family: verdana, helvetica, sans-serif; font-size: 85%"> <h3>Version Utilisant AJAX</h3> <p>Vous constaterez que le délai de latence entre la sélection et la mise à jour est quasiment intermédiaire entre les versions 100% PHP et JavaScript.</p> <h3>Trouver un département</h3> <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="getDepartements(this.value);"> <option value="vide">- - - Choisissez une région - - -</option> <?php /* Construction de la première liste : on se sert du tableau PHP */ foreach($fournisseurs as $nr => $nom) { ?> <option value="<?php echo($nr); ?>"><?php echo($nom); ?></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 /> <!-- Bloc pour l'affichage de la sélection par Année --> <span id="blocPdt"></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 } ?> </body> </html>
departements.php

Code : Tout sélectionner

<?php /** * Code qui sera aeeplé par un objet XHR et qui * retournera la liste déroulante des départements * correspondant à la région sélectionnée. */ /* Paramètres de connexion */ $serveur = "localhost"; $admin = "root"; $mdp = ""; $base = "gestion"; /* On récupère l'identifiant de la région choisie. */ $idr = isset($_GET['idr']) ? $_GET['idr'] : false; /* Si on a une région, on procède à la requête */ if(false !== $idr) { /* Cération de la requête pour avoir les départements de cette région */ $sql2 = "SELECT `id`, `annee`, `nom` ". " FROM `annee`". " WHERE `fournisseur` = ". $idr ."". " ORDER BY `fournisseur`;"; $connexion = mysql_connect($serveur, $admin, $mdp); mysql_select_db($base, $connexion); $rech_dept = mysql_query($sql2, $connexion); /* 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(); $code_annee = array(); $nom_annee = array(); $nom_collection = array(); /* On va mettre les numéros et noms des départements dans les deux tableaux */ while(false != ($ligne_dept = mysql_fetch_assoc($rech_dept))) { // $code_dept[] = $ligne_dept['id_departement']; // $nom_dept[] = $ligne_dept['departement']; $code_annee[] = $ligne_dept['id']; $nom_annee[] = $ligne_dept['annee']; $nom_collection[] = $ligne_dept['nom']; $nd++; } /* Maintenant on peut construire la liste déroulante */ $liste = ""; ?> <script type="text/javascript" src="./pdt_xhr.js" charset="iso_8859-1"></script> <? $liste = '<select name="annee" id="annee" onchange="getAnnee(this.value);">'."\n"; for($d = 0; $d < $nd; $d++) { $liste .= ' <option value="'. $code_annee[$d] .'">'. htmlentities($nom_annee[$d]) .' ('. $code_annee[$d] .') ('. $nom_collection[$d] .') </option>'."\n"; } $liste .= '</select>'."\n"; /* Un petit coup de balai */ mysql_free_result($rech_dept); /* Affichage de la liste déroulante */ echo($liste); } /* Sinon on retourne un message d'erreur */ else { echo("<p>Une erreur s'est produite. La région sélectionnée comporte une donnée invalide.</p>\n"); } ?>
produits.php

Code : Tout sélectionner

<?php /** * Code qui sera aeeplé par un objet XHR et qui * retournera la liste déroulante des départements * correspondant à la région sélectionnée. */ /* Paramètres de connexion */ $serveur = "localhost"; $admin = "root"; $mdp = ""; $base = "gestion"; /* On récupère l'identifiant de la région choisie. */ $idr2 = isset($_GET['idr2']) ? $_GET['idr2'] : false; /* Si on a une région, on procède à la requête */ if(false !== $idr2) { /* Cération de la requête pour avoir les départements de cette région */ $sql2 = "SELECT `id`, `annee`, `ref` , `fournisseur` ". " FROM `produits`". " WHERE `fournisseur` = ". $idr2 ."". " ORDER BY `nom`;"; $connexion = mysql_connect($serveur, $admin, $mdp); mysql_select_db($base, $connexion); $rech_dept = mysql_query($sql2, $connexion); /* 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(); //$code_annee = array(); //$nom_annee = array(); //$nom_collection = array(); $code_pdt = array(); $ref_pdt = array(); $code_frs = array(); /* On va mettre les numéros et noms des départements dans les deux tableaux */ while(false != ($ligne_dept = mysql_fetch_assoc($rech_dept))) { // $code_dept[] = $ligne_dept['id_departement']; // $nom_dept[] = $ligne_dept['departement']; // $code_annee[] = $ligne_dept['id']; // $nom_annee[] = $ligne_dept['annee']; // $nom_collection[] = $ligne_dept['nom']; $code_pdt[] = $ligne_dept['id']; $ref_pdt[] = $ligne_dept['ref']; $code_frs[] = $ligne_dept['fournisseur']; $nd++; } /* Maintenant on peut construire la liste déroulante */ $liste = ""; $liste .= '<select name="produit" id="produit">'."\n"; for($d = 0; $d < $nd; $d++) { $liste .= ' <option value="'. $code_pdt[$d] .'">'. htmlentities($ref_pdt[$d]) .' ('. $code_pdt[$d] .')</option>'."\n"; } $liste .= '</select>'."\n"; /* Un petit coup de balai */ mysql_free_result($rech_dept); /* Affichage de la liste déroulante */ echo($liste); } /* Sinon on retourne un message d'erreur */ else { echo("<p>Une erreur s'est produite. La région sélectionnée comporte une donnée invalide.</p>\n"); } ?>
Et les 2 fichiers .JS

dept

Code : Tout sélectionner

/** * Lister les départements d'une région avec un objet * XMLHTTPRequest. */ /* Création de la variable globale qui contiendra l'objet XHR */ var requete = null; /** * Fonction privée qui va créer un objet XHR. * Cette fonction initialisera la valeur dans la variable globale définie * ci-dessus. */ function creerRequete() { try { /* On tente de créer un objet XmlHTTPRequest */ requete = new XMLHttpRequest(); } catch (microsoft) { /* Microsoft utilisant une autre technique, on essays de créer un objet ActiveX */ try { requete = new ActiveXObject('Msxml2.XMLHTTP'); } catch(autremicrosoft) { /* La première méthode a échoué, on en teste une seconde */ try { requete = new ActiveXObject('Microsoft.XMLHTTP'); } catch(echec) { /* À ce stade, aucune méthode ne fonctionne... mettez donc votre navigateur à jour ;) */ requete = null; } } } if(requete == null) { alert('Impossible de créer l\'objet requête,\nVotre navigateur ne semble pas supporter les object XMLHttpRequest.'); } } /** * Fonction privée qui va mettre à jour l'affichage de la page. */ function actualiserDepartements() { var listeDept = requete.responseText; var blocListe = document.getElementById('blocDepartements'); blocListe.innerHTML = listeDept; } /** * Fonction publique appelée par la page affichée. * Cette fonction va initialiser la création de l'objet XHR puis appeler * le code serveur afin de récupérer les données à modifier dans la page. */ function getDepartements(idr) { /* Si il n'y a pas d'identifiant de région, on fait disparaître la seconde liste au cas où elle serait affichée */ if(idr == 'vide') { document.getElementById('blocDepartements').innerHTML = ''; } else { /* À cet endroit précis, on peut faire apparaître un message d'attente */ var blocListe = document.getElementById('blocDepartements'); blocListe.innerHTML = "Traitement en cours, veuillez patienter..."; /* On crée l'objet XHR */ creerRequete(); /* Définition du fichier de traitement */ var url = 'departements.php?idr='+ idr; /* Envoi de la requête à la page de traitement */ requete.open('GET', url, true); /* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */ requete.onreadystatechange = function() { /* Lorsque l'état est à 4 */ if(requete.readyState == 4) { /* Si on a un statut à 200 */ if(requete.status == 200) { /* Mise à jour de l'affichage, on appelle la fonction apropriée */ actualiserDepartements(); } } }; requete.send(null); } }
pdt

Code : Tout sélectionner

/** * Lister les départements d'une région avec un objet * XMLHTTPRequest. */ /* Création de la variable globale qui contiendra l'objet XHR */ var Requetepdt = null; /** * Fonction privée qui va créer un objet XHR. * Cette fonction initialisera la valeur dans la variable globale définie * ci-dessus. */ function creerRequetepdt() { try { /* On tente de créer un objet XmlHTTPRequest */ Requetepdt = new XMLHttpRequest(); } catch (microsoft) { /* Microsoft utilisant une autre technique, on essays de créer un objet ActiveX */ try { Requetepdt = new ActiveXObject('Msxml2.XMLHTTP'); } catch(autremicrosoft) { /* La première méthode a échoué, on en teste une seconde */ try { Requetepdt = new ActiveXObject('Microsoft.XMLHTTP'); } catch(echec) { /* À ce stade, aucune méthode ne fonctionne... mettez donc votre navigateur à jour ;) */ Requetepdt = null; } } } if(Requetepdt == null) { alert('Impossible de créer l\'objet requête,\nVotre navigateur ne semble pas supporter les object XMLHttpRequest.'); } } /** * Fonction privée qui va mettre à jour l'affichage de la page. */ function actualiserAnnee() { var listePdt = Requetepdt.responseText; var blocListe = document.getElementById('blocPdt'); blocListe.innerHTML = listePdt; } /** * Fonction publique appelée par la page affichée. * Cette fonction va initialiser la création de l'objet XHR puis appeler * le code serveur afin de récupérer les données à modifier dans la page. */ function getAnnee(idr2) { /* Si il n'y a pas d'identifiant de région, on fait disparaître la seconde liste au cas où elle serait affichée */ if(idr == 'vide') { document.getElementById('blocPdt').innerHTML = ''; } else { /* À cet endroit précis, on peut faire apparaître un message d'attente */ var blocListe = document.getElementById('blocPdt'); blocListe.innerHTML = "Traitement en cours, veuillez patienter..."; /* On crée l'objet XHR */ creerRequetepdt(); /* Définition du fichier de traitement */ var url = 'produits.php?idr2='+ idr2; /* Envoi de la requête à la page de traitement */ Requetepdt.open('GET', url, true); /* On surveille le changement d'état de la requête qui va passer successivement de 1 à 4 */ Requetepdt.onreadystatechange = function() { /* Lorsque l'état est à 4 */ if(Requetepdt.readyState == 4) { /* Si on a un statut à 200 */ if(Requetepdt.status == 200) { /* Mise à jour de l'affichage, on appelle la fonction apropriée */ actualiserAnnee(); } } }; Requetepdt.send(null); } }
Si quelqu'un a une idée ...
Merci d'avance,

Plexou

hihi

par plexou » 16 mai 2008, 15:52

Merci Cyrano pour ta réponse.
Tu as raison en fait quand on prends son temps on commence a bien comprendre.
Il y a encore quelques jours je ne comprennait pas grand chose au formulaires avec php et à la mise en forme dans des tableau avec des boucles ...

La je suis en train de faire le tableau qui présente les commandes ... j'avance doucement mais ... surement. Et apres, j'attaque la partie Ajax :) J'ai commandé des gants MAPA on sait jamais ;) je tiens à mes mains lool.

Je vais mettre les pieds dans le plat, décrocher le téléphone et m'enfermer pour comprendre le fonctionnement ... et essayer de faire un code propre ... je ne tiens pas a me faire zigouiller par un psykopathe ;) hihi :afraid: :pouce: :pouce: :pouce: :pouce: :ordi: :ordi:

par Cyrano » 16 mai 2008, 13:56

Il ne faut pas se faire peur en imaginant AJAX comme un sommet impossible à atteindre : ce n'est que du JavaScript un tout petit peu plus avancé que des alert() et des gadgets en tous genres.

Si on décompose un peu on a quoi ?
-1- Un gestionnaire d'évènement dans une page web qui appelle une fonction JavaScript;
-2- Cette fonction JavaScript récupère un nombre x de paramètre et crée un objet XMLHTTPRequest ou le fait créer par une fonction annexe (nombreux exemples disponibles sur le web)
-3- Cette même fonction indique ensuite à l'objet XHR comment l'envoyer au serveur, à quelle url il faut faire appel et comment doit être traité et exploité le retour.
-4- Un fichier coté serveur qui récupère ces paramètres, exécute un certain nombre d'instruction pour afficher le résultat attendu. L'affichage de ce résultat est le retour attendu coté client par l'objet XHR.

Sommairement, c'est tout. Si vous n'arrivez pas à voir le fonctionnement global, allez-y une étape à la fois et vous rassemblerez les morceaux en les ayant compris l'un après l'autre ;)

par plex invité » 16 mai 2008, 13:35

ok merci :)
ajax moi non plus lol j'vais mettre des gants ca a l'air chaud :p
hihi

par Albat90 » 16 mai 2008, 11:47

Bonne chance, si t'a besoin d'aide en PHP, n'hésite pas ;)
Par contre, Ajax, j'y ai jamais toucher :P

Albat90 ;)

par plex invité » 16 mai 2008, 10:44

Voila, j'ai donc adapté à ma base de données :)
Je vais maintenant créé le tableau de présentation des données :)
Et il faudra apres que je créé la 3eme liste déroulante ...
Fiou ... pas facil :roll:

Merci pour vos réponses

par plexouille » 15 mai 2008, 16:01

Coucou et merci à tout les deux pour vos réponses.
Je souhaite en effet m'orienter vers AJAX comme tu l'indique dans ta réponse Cyrano car en PHP on reste limité dans les actions visiblement.

Albat90, ca pourrait marcher mais j'ai besoin de quelque chose de plus dynamique :p

Je vais dans un premier temps re créer ton exemple avec mes tables Cyrano ... ca me permettra de mieux comprendre la façon dont tu as codé tout ca :)

Des que j'ai fait ca, je tente de créer la 3eme liste déroulante.
En fait, je souhaiterais pouvoir trier mes commandes facilement.
En ce sens, un produit arrive, on indique le fournisseur, la référence et l'année.

Un tableau me présente alors les commandes en cours sous les conditions indiquées,
Puis, si je le souhaite, je peux alors trier par couleur ou par client...

Je vous tiens informés :)
En tout cas un grand merci à vous deux pour votre aide.
Je vous tiens informés !!!

plEx

par Albat90 » 15 mai 2008, 15:29

Voila à peu près pour deux listes déroulantes.
if (isset($_POST['fournisseur']))
$fournisseur = $_POST['fournisseur'];
else 
$fournisseur = "";

$produit_sql = 'SELECT nom_produit FROM PRODUIT, FOURNISSEUR WHERE PRODUIT.code_four = FOURNISSEUR.code_four AND FOURNISSEUR = "'.$fournisseur.'" ORDER BY nom_produit';
$produit_query = mysql_query($produit_sql) or die('impossible');
echo '<form.....>
<SELECT ...>';
While ($produit = mysql_fetch_array($produit_query)){
echo '<option>'.$produit['nom_produit'].'</option>';
}
echo '</SELECT>';
Si tu voudrais rajouter une listes pour la couleur, c'est la même chose sauf que tu récupère la couleur sélectionné en plus et tu rajoute dans ta requete "AND Couleur_prod = "'.$couleur.'"".

En esperant t'avoir aidé ;)

Albat90 ;)

par Cyrano » 15 mai 2008, 12:26

Raisonne logiquement.

Le tuto est effectivement limité à deux listes, mais le principe sera le même quel que soit le nombre de listes utilisées.
-1- dans chaque liste donnant lieu à la mise à jour d'une autre liste, tu auras un gestionnaire d'évènement qui appellera une fonction qui lui est propre en envoyant ou non un paramètre.

-2- dans chaque fonction spécifique à une liste, il faudra récupérer les valeurs pré-sélectionnées dans la liste appelante bien sur, mais également dans les listes parentes s'il y en a (et non les listes filles bien sur puisqu'elles ne sont pas définies.
À partir de là, tu vas pouvoir définir les conditions de tri de ta requête SQL pour construire la liste suivante.

Sur plus de deux listes, tu peux à priori oublier la seconde méthode du tuto avec le tableau JavaScript : ce sera soit la version 100% PHP soit la version AJAX qui serait à mon avis la plus rationnelle et surtout la plus facile à mettre en œuvre.

Attention à ne pas oublier de mettre à jour les listes filles si tu modifies une liste parente, je veux dire par là : si tu as 3 ou 4 listes (ou +) : tu fais un choix dans la première, la seconde apparaît et tu y fais également un choix, ce qui donne lieu à l'arrivée de la troisième. Mais tu décides de changer le choix de la première : ça doit éventuellement modifier la seconde mais surtout faire disparaître la troisième (et les suivantes s'il y a lieu) puisque le choix dans la seconde n'est pas encore effectué ;)

par plex » 15 mai 2008, 12:02

Merci beaucoup pour ta réponse Albat90.
En fait, je comprends bien la façon de procéder mais ne parviens pas à la mettre en oeuvre.

Lorsque je sélectionne mon fournisseur, j'aimerais que la liste présentant les produits présente les différents produits de celui ci ... puis me demande l'année du produit par exemple.

Tout ceci avec un tableau qui présente les résultats.
Puis on pourrait aussi trier par magasin par exemple ou par attribut (taille ou couleur)

Peut tu m'aider alors ?
Merci encore.

Plexouille

par Albat90 » 15 mai 2008, 11:53

Tout d'abord, il faut connaitre l'architecture de ta BDD.
Ensuite, il se suffit de faire un formulaire avec plusieurs listes que tu remplis à l'aide de requête sur tes tables.
Ensuite quand la personne a choisie ses choix, tu récupère ses informations à l'aide de variables et tu créer une requête SQL sur ta table en te servant de ses données de filtrage dans la partie WHERE de ta requête.
Peu être que je n'ai pas été assez clair, mais si tu pourrais me donner un peu plus d'info sur ce que tu fais, je pense que je pourrai t'aider ;)

Albat90 ;)

Formulaire et listes déroulantes dynamique, mais débutant ..

par plex » 15 mai 2008, 10:23

Bonjour,
Je suis en train de réaliser une page de présentation de commandes clients.
Mais j'aimerais pouvoir trier celle ci de façon assez poussée.

Un peu comme sur le site ldlc : http://www.ldlc.com/cat/140233.html
Avec le tri par constructeur, taille existantes, format et autres interfaces.

J'ai bien trouvé le tuto http://www.phpfrance.com/forums/voir_sujet-4562.php
Mais celui ci ne propose que 2 listes liées, j'aurais besoin d'avoir plus de listes.

Par exemple, le tri des commandes par le fournisseur, puis par le produit, par boutique et enfin par client ou encore par taille de disque dur par exemple.

J'aimerais savoir comment je peux faire ça s'il vous plait. On m'a orienté vers le java et ajax mais je ne comprends pratiquement rien,

Est ce que quelqu'un pourrait m'orienter, me donner un coup de pouce en ce sens ?
Par avance,
Merci
Plexouille