Php-select conditionnel

Résolu
crisom Messages postés 8 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 13 avril 2010 - 15 oct. 2009 à 00:39
crisom Messages postés 8 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 13 avril 2010 - 16 oct. 2009 à 10:49
bonjour
je veux dans un formulaire,avoir un premier select pour faire un choix d'un second select en conservant la valeur du premier.
un onchange devrait me permettre de lancer un submit.dans mon formulaire j'ai plusieurs submit suivant la sélection du select.
je n'arrive pas à recuperer la valeur du select.
voici un bout de code, qui ne fonctionne pas , le onchange est en cause . pouvez-vous m'aider- merci
<?php

if (isset($_POST['traiter'])){
$traiter = htmlspecialchars($_POST['traiter']);}
else {$traiter="";}
if (isset($_POST['item1'])){
$item1 = htmlspecialchars(trim(($_POST['item1'])));}
else {$item1="";}
if($traiter=='test'){
echo" $item1 ";
}
?>
<form name='form1' action='<?php $_SERVER['PHP_SELF'] ?>' method='POST' />
couleur,
----
<select name='item1'size='3' onchange="this.document.forms['form1'].traiter.value='test'.submit() " >
<option value='B' selected > Blanc </option>
<option value='P' > Pastel </option>
<option value='V' > Vif </option>
</select

</td>
</tr>
</tr><tr>
<td> </td>
</tr>
</table>

</form>
<?php

10 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
15 oct. 2009 à 13:27
Salut,

La question revient toutes les semaines, voire tous les jours. Merci donc de bien vouloir faire une recherche sur le site, ou sur Google, car elle a déjà été traitée de dizaines de milliards de fois (au moins).

--
Neige

N'hésitez pas à lire la doc
3
crisom Messages postés 8 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 13 avril 2010
15 oct. 2009 à 14:43
bonjour,
merci pour la positive attitude, j'ai cherché sur google et les forums. de nombreuses explication qui ne mzarchent pas.
en fait comment recupere apres un onchange --> on submit , un retour quand il y a p^lusieurs submit.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
15 oct. 2009 à 15:24
Comment expliquer alors que la réponse soit donné autant de fois, rien que sur phpCS ? Parce que depuis le temps que je fréquente ce forum, je peux t'assurer que des explications qui fonctionnent ont été données plus d'une fois !

Il n'y a pas besoin d'avoir plusieurs submit, un seul suffit pour valider le formulaire une fois que toutes les listes select on été sélectionnées correctement par l'utilisateur. Tu ne te poses pas la bonne question : le submit ne DOIT PAS servir à valider la première liste pour remplir la première (à moins que tu ne souhaites valider le formulaire, mais là encore, inutile d'en avoir plusieurs)
Il faut regarder du côté d'Ajax. En gros, pour te donner les grandes lignes (mais je crois que je vais finir par faire un tuto parce que vraiment...) :
- un script JS qui va faire une requête sur un script (a priori PHP dans ton cas précis) en lui soumettant la valeur de l'option de la première liste
- le script PHP va renvoyer une liste d'options pour remplir la seconde liste
- le script JS, toujours lui, récupère alors le contenu renvoyé par le script PHP et l'insère directement dans la seconde liste, laquelle possède maintenant un contenu adapté en fonction de la valeur sélectionnée dans la première liste

C'est tout. Le script PHP en question ne doit RIEN faire d'autre que renvoyer les options de la seconde liste, et UNIQUEMENT ça (pas d'autres balises HTML, puisque le contenu s'insère directement dans le fichier html existant).

Ou alors, j'ai rien compris à ton problème...

--
Neige

N'hésitez pas à lire la doc
0
crisom Messages postés 8 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 13 avril 2010
15 oct. 2009 à 16:43
merci pour tes explications,
comme j'ai besoin de plusieurs submit ( le même formulaire sert à creer, supprimer, afficher et imprimer). pour un sélect d'aiguillage j'utilise un onchange.
en fait le submit dans le onchange (onchange="submit()") envoie la valeur des champs , dont ceux du select, mais de valeur de submit.
il suffit de recupere le select et par PHP de faire l'aiguillage vers les autres select.
merci pour tes reflexions
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
15 oct. 2009 à 17:20
Hum. Je crois que j'ai mal compris ton problème, alors. Je te prie de m'excuser, mais j'ai d'abord cru que tu voulais lier le contenu d'une liste déroulante à une première liste en fonction de la sélection dans celle-ci. Ou alors c'est bien ça, et je comprends de moins en moins...

Est-ce que tu pourrais expliquer plus en détails ce que tu souhaites précisément ?
Ce sont ces phrases là que j'ai vraiment du mal à bien comprendre :
je veux dans un formulaire,avoir un premier select pour faire un choix d'un second select en conservant la valeur du premier.
un onchange devrait me permettre de lancer un submit.dans mon formulaire j'ai plusieurs submit suivant la sélection du select.
je n'arrive pas à recuperer la valeur du select.

Je ne sais pas bien comment interpréter ça... :/

--
Neige

N'hésitez pas à lire la doc
0
crisom Messages postés 8 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 13 avril 2010
15 oct. 2009 à 22:38
BONSOIR NEIGE
je me suis mal expriimé, voici finalement ce que je cherchais à resoudre dans une version simplifiée
merci pour ton aide
<?php

if (isset($_POST['traiter'])){
$traiter = htmlspecialchars($_POST['traiter']);}
else {$traiter="";}
if (isset($_POST['item1'])){
$item1 = htmlspecialchars(trim(($_POST['item1'])));}
else {$item1="";}
if (isset($_POST['item2'])){
$item2 = htmlspecialchars(trim(($_POST['item2'])));}
else {$item2="";}
if($traiter=='faire'){
echo " +-- $item1 +--
";
echo " === $item2=-=
";
}

?>
<form name='form1' action='<?php $_SERVER['PHP_SELF'] ?>' method='POST' />
couleur,
----

<select name='item1'size='3' onchange="submit()" value=<?php echo $item1 ?> >
<option value='B' <?php if($item1=='B'){echo " selected"; }?> > Blanc </option>
<option value='P' <?php if($item1=='P'){echo " selected";}?> >Pastel </option>
<option value='V '<?php if($item1=='V'){echo " selected";} ?> > Vif </option>
</select>,
----

<?php
if ($item1=='V'){
?>
couleur vives,
----

<select name='item2'size='4' >
<option value='A' selected> Autre </option>
<option value='R' > Rouge </option>
<option value='G' > bleu </option>
<option value='B' > Vert </option>
</select>,
<?php
}
if ($item1=='P'){
?>
couleur Pastel,
----

<select name='item2'size='4' >
<option value='A' selected> Autre </option>
<option value='R' > Rose </option>
<option value='G' > bleu </option>
<option value='B' > Vert </option>
</select>,
<?php
}
?>

<table>
----



</form>
<?php
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
16 oct. 2009 à 03:09
Salut,

J'avais rédigé une réponse complète, j'y avais passé du temps et c'est 3 mots avant la fin que Firefox s'est dit "Tiens, et si je plantais maintenant ?". Et forcément, l'éditeur remplaçant le contenu en ajoutant la signature tout ça tout ça, ben mon message est parti dans les limbes de la RAM de mon PC... Et j'ai eu une grosse flemme de recommencer le message, hein, faut me comprendre, 15 minutes passées à rédiger un truc et pouf...

Alors j'en ai fait un tuto, que j'ai passé genre 1h à rédiger complètement, avec mise en forme et tout. Et là, pas moyen de valider le tuto... Trop fort : je pouvais le modifier ! Et en le prévisualisant, je voyais le commentaire de la mise à jour alors qu'il n'était même pas publié...

Bref... J'ai heureusement pu faire un copier/coller, mais il n'en reste pas moins que tout ce que j'ai pris le temps d'écrire ne peux pas être publié ici.

Alors je vais faire un article sur mon blog, et basta, parce que ça commence à bien faire.

Prochaine étape : développer carrément un site de sources PHP, parce que ça commence à bien faire (oui, je me répète, comme quoi ça commence vraiment à bien faire).

Tiens, je vais refaire un post (parce que j'aime ça) avec le contenu de mon tuto... Tant pis, il sera sur le forum avant d'être dans les tutoriels... C'est n'importe quoi, mais bon... C'est con, parce que c'est quand même un tuto, donc pas spécifique à ton cas, il faudra que tu adaptes...

--
Neige, complètement blasé

N'hésitez pas à lire la doc
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
16 oct. 2009 à 03:13
Pour ce tutoriel, il est nécessaire d'avoir une base de données (a priori MySQL, mais peu importe le SGBDR). Dans cette base de données, nous avons une table qui liste des catégories hiérarchisées, sans limite de niveau. Concrètement, nous n'aurons que 2 listes, donc 2 niveaux, mais la table n'impose pas de limite théorique.
Je pars du principe, dans ce tutoriel, que nous utilisons une classe pour gérer la connexion à la base de données. Une classe du genre mysqli ou PDO. Mais cela reste facilement adaptable pour l'extension "classique" mysql (qui devient de plus en plus obsolète).
Nous aurons donc des méthodes compliquées que je ne détaillerai pas ici, comme $db -> query() ou encore $db -> fetch()...
Je pars du postulat que la connexion à la base de données se fait dans un fichier connexion_db.php que je ne détaille pas, puisqu'il varie d'un SGBDR à l'autre et d'une extension à l'autre (mysql, mysqli, PDO, voire même de packages comme PEAR::DB, etc)

Voici le code SQL permettant la création de la table, ainsi que de quoi la remplir un peu pour les exemples :

--
-- Structure de la table `categories`
--

CREATE TABLE IF NOT EXISTS `categories` (
  `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cat_parent_id` int(10) unsigned NOT NULL DEFAULT '0',
  `cat_title` varchar(255) NOT NULL,
  PRIMARY KEY (`cat_id`),
  KEY `cat_parent_id` (`cat_parent_id`)
) ENGINE= MyISAM  DEFAULT CHARSET=latin1;

--
-- Contenu de la table `categories`
--

INSERT INTO `categories` (`cat_id`, `cat_parent_id`, `cat_title`) VALUES
(1, 0, 'Musique'),
(2, 0, 'Films'),
(3, 0, 'Livres'),
(4, 1, 'Rock'),
(5, 1, 'Classique'),
(6, 1, 'Jazz'),
(7, 1, 'Pop'),
(8, 2, 'Horreur'),
(9, 2, 'Policier'),
(10, 2, 'Biopic'),
(11, 2, 'Documentaire'),
(12, 3, 'Biographie'),
(13, 3, 'Essai'),
(14, 3, 'Romantique');


Deuxième assertion pour ce tutoriel : nous utiliserons jQuery. Pourquoi ? D'abord parce que je ne suis pas développeur Javascript et que gérer un objet XmlHTTPRequest manuellement est le genre de chose dont je me dispense bien volontier. Ensuite parce que ça allège le code considérablement et que si vous souhaitez vraiment écrire tout le JS à la main, c'est que vous avez le niveau pour vous dispenser de ce tuto... (et toc :p )
Il est donc nécessaire d'ajouter sur votre page HTML le code de jquery, sinon le script JS que je donne dans la troisième partie ne fonctionnera pas ! Ca ressemble à une ligne comme ça :

<script type="text/javascript" src="/js/jquery-1.2.3.min.js" temp_src="/js/jquery-1.2.3.min.js"></script>


Ceci étant posé, commençons par les explications sur le fonctionnement de ce que nous allons mettre en place.
Nous avons un script qui génère notre formulaire. Peu importe que l'on utilise ou pas un moteur de template, un framework, le principe restera toujours le même : du (X)HTML dont une partie générée dynamiquement par PHP.
Nous aurons besoin d'un script PHP qui sera chargé de générer le contenu de la deuxième liste (uniquement celle-ci et de manière exclusive, c'est à dire que du code qui se place entre les balises <select> et </select>).
Il nous faudra également un script Javascript qui chargera le HTML généré par le précédent script et le chargera au bon endroit dans notre document.

1. Le script qui génère la deuxième liste : genere_liste.php

Hé oui, aussi surprenant que cela puisse paraître, on va commencer par celui-là, parce que ce script sera utilisé par les deux autres.
Ce script recevra en paramètre une variable cat_id qui est l'identifiant de la catégorie parente des éléments que nous souhaitons afficher. Si on sélectionne, dans la première liste, "Musique", on devra afficher dans la seconde liste Rock, Classique, Jazz et Pop. L'identifiant de la catégorie parente (Musique) est 1, c'est cette valeur que l'on va traiter.
Cet argument sera, a priori, passé en argument via une requête HTTP de type GET, donc, sera disponible dans la variable $_GET['cat_id']. Mais nous allons également prévoir le cas où il n'est pas défini et lui attribuer une valeur par défaut (1 : catégorie Musique). Si on affiche un formulaire de modification et qu'il faut sélectionner un autre élément de la liste que le premier, on prendra soin d'adapter le script en fonction (je ne le fais pas ici, car c'est un autre problème).
Pour la suite, nous admettrons que ce script se trouve au même niveau que celui qui génère le code HTML, c'est à dire à la racine du répertoire de publication web. Adaptez si vous souhaitez le ranger ailleurs. Attention : ce script doit IMPERATIVEMENT être accessible depuis le web, donc être dans ou sous le répertoire de publication web. Sinon, les requêtes faites par Javascript ne fonctionneront pas.

Voici à quoi ressemble ce script :

<?php
# Connexion à la base de données
require('connexion_db.php');
# On prévoit que le script puisse être inclus (il le sera...) et que l'identifiant de la catégorie puisse être déjà défini
if (!isset($cat_id)) {
  # On récupère l'id de la catégorie parente, et on le protège : on ne veut qu'un entier
  $cat_id  = isset($_GET['cat_id']) ? intval($_GET['cat_id']) : 1;
}

# Ecrivons notre requête SQL :
$sql =  "SELECT cat_id, cat_title FROM categories WHERE cat_parent_id=$cat_id ORDER BY cat_title DESC";
if (FALSE !($result $db -> query($sql))) {
  while (FALSE !($row $result -> fetch())) {
    echo '<option value="'.$row['cat_id'].'">'.$row['cat_title'].'</option>'."\n";
  }
}
?>


Notre script va gentiment ecrire le code HTML des options de la liste. En cas d'erreur, il n'affichera simplement rien. Libre à vous de gérer le comportement du script en cas d'erreur, par exemple en déclenchant une erreur avec trigger_error() ou en levant une exception en PHP5.

2. Le script du formulaire

Je vous laisse le soin de mettre votre page en forme, je ne m'intéresserai ici qu'au code qui concerne directement les deux liste déroulantes. Code que voici :

<select id ="liste1"><?php $cat_id =  0; include('genere_liste.php'); ?></select>
<select id="liste2"><?php $cat_id = 1; include('genere_liste.php'); ?></select>


Comme vous pouvez le constater, nous utilisons deux fois le même script. Nous pouvons le faire car les données proviennent de la même table et sont hiérarchisées. Veillez à adapter en fonction de vos besoins (notamment, la première liste peut tout à fait être statique ou générée à partir d'un autre script d'après les données d'une autre table, etc).
Lors de l'inclusion, le contexte d'exécution du script inclus est le même que celui qui fait l'inclusion ; c'est à dire que la variable $cat_id que l'on défini dans le script du formulaire est accessible. C'est pour cela que nous avons pris soin dans le script genere_liste.php de ne définir $cat_id avec la variable $_GET['cat_id'] que si elle ne l'est pas déjà. Lorsque le script sera appelé directement par Javascript, $cat_id ne sera pas défini, on utilisera alors $_GET['cat_id'].
Appelez ce fichier comme vous voulez, ça ne me regarde pas ^^

3. Le script Javascript

Comme je le disais en introduction, nous utiliserons jQuery pour nous faciliter la vie.
Voici le script à placer n'importe où sur la page (tant que ça reste conforme au doctype du document, évidemment) :

<script type ="text/javascript">
$('document').ready(function() {
  $('#liste1').change(function() {
    $('#liste2').load('/genere_liste.php?cat_id='+this.value);
  });
});
</script>



C'est tout. Explications :
$('document').ready(function() { : la fonction a exécuter quand jQuery aura détecté que le fichier est intégralement chargé.
$('#liste1') : l'élément du DOM dont l'id est liste1, c'est à dire notre première liste déroulante
.change : assigne la fonction qui suit à l'évènement onchange de l'élément en question, donc de notre première liste déroulante
.load() : la fonction de jQuery qui va charger le document appelé en argument. Cette fonction, étant appliquée à l'élément liste2, va remplacer ce qui se trouve à l'intérieur de cet élément. Comme il s'agit d'une liste, cela correspond à ce qui se trouve entre <select.... > et </select>
this.value : A cet endroit du script JS, le contexte d'exécution est l'évènement onchange de l'élément liste1. this se rapporte donc à l'élément liste1, et this.value est la valeur de l'option sélectionnée.

Conclusion

C'est tout... C'est terminé.
Maintenant, quand vous sélectionnez une option de la première liste, la seconde se met à jour automatiquement.
Evidemment, ça ne doit pas vous avancer à grand chose de n'avoir qu'une liste qui se met à jour... Le principe est exactement le même si vous souhaitez afficher tous les objets qui appartiennent à la catégorie sélectionnée dans la deuxième liste : il suffit de charger le résultat d'un script dans un élément
qui contient la liste des objets, exactement sur le même principe que ce que nous venons de voir ici.

Si vous souhaitez ajouter une animation pendant le chargement, ce n'est pas de mon ressort :). Consultez la documentation de jQuery, parce que vous aurez besoin de contrôler mieux le processus de chargement, avec les évènements Ajax de jQuery

--
Neige, vraiment complètement blasé

N'hésitez pas à lire la doc
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
16 oct. 2009 à 03:16
En gros, pour ton cas :
[list]
[*] Pas besoin de base de données (si j'ai bien compris)
[*] La première liste est statique, donc pas besoin d'inclure quoi que ce soit, mets directement le code
[*] La seconde liste ne semble pas être générée d'après une base de données, le script genere_liste.php se contentera alors d'afficher les différents bouts de code que tu as dans tes if.
/list

Les scripts du tuto ont été testés, ils fonctionnent (IE6+, FF, Chrome, bref, tout les navigateurs avec lesquels jQuery fonctionne).

--
Neige

N'hésitez pas à lire la doc
0
crisom Messages postés 8 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 13 avril 2010
16 oct. 2009 à 10:49
bonjour
merci pour ces détails
j'utilise mysql pour générer les différentes valeurs des select
0
Rejoignez-nous