petit problème de formulaire

Eléphanteau du PHP | 14 Messages

24 avr. 2011, 19:08

bonjour , pourriez vous m'expliquer comment je peux garder dans une liste déroulante les sélections après un submit
<form action="" method="post">
<select name="region[]" multiple="multiple">
<?php 
$reg=array('Alsace', 
'Aquitaine', 
      'Auvergne', 
      'Bourgogne', 
      'Bretagne', 
      'Centre', 
      'Champagne-Ardenne', 
      'Corse', 
      'Franche-Comté', 
      'Île-de-France', 
      'Languedoc-Roussillon', 
      'Limousin', 
      'Lorraine',
      'Midi-Pyrénées',
      'Nord-Pas-de-Calais',
      'Basse-Normandie',
      'Pays de la Loire',
      'Picardie',
      'Poitou-Charentes',
      'Provence-Alpes-Côte d\'Azur',
      'Rhône-Alpes',
      'Guadeloupe',
      'Guyane', 
      'Martinique',
      'Mayotte', 
      'La Réunion');


foreach($reg as $regi ){
if(isset($_POST['region']) and $_POST['region'] == $regi) {$p=' selected="selected"';}
echo'<option value="'.$regi.'" '.$p.'>'.$regi.'</option>';}

?>
</select>
<input type="submit"  value="envoyer">
</form>


devlop78
Invité n'ayant pas de compte PHPfrance

24 avr. 2011, 19:12

essaie plutot quelque chose comme

in_array($_POST['region'],$regi)

ViPHP
AB
ViPHP | 5818 Messages

24 avr. 2011, 19:41

Tu peux aussi utiliser les variables de session.

Eléphanteau du PHP | 14 Messages

24 avr. 2011, 19:57

merci, j'ai essayé mais cela ne marche pas
<php $reg=array('Alsace',
'Aquitaine',
      'Auvergne',
      'Bourgogne',
      'Bretagne',
      'Centre',
      'Champagne-Ardenne',
      'Corse',
      'Franche-Comté',
      'Île-de-France',
      'Languedoc-Roussillon',
      'Limousin',
      'Lorraine',
      'Midi-Pyrénées',
      'Nord-Pas-de-Calais',
      'Basse-Normandie',
      'Pays de la Loire',
      'Picardie',
      'Poitou-Charentes',
      'Provence-Alpes-Côte d\'Azur',
      'Rhône-Alpes',
      'Guadeloupe',
      'Guyane',
      'Martinique',
      'Mayotte',
      'La Réunion');


if(in_array(@$_POST['region'],$reg)){ echo'toto';}	
 ?>

<form action="" method="post">
<select name="region[]" multiple="multiple">
<?php
 
foreach($reg as $regi ){

echo'<option value="'.$regi.'" '.$p.'>'.$regi.'</option>';
}	  

Eléphanteau du PHP | 14 Messages

24 avr. 2011, 21:50

j'ai trouvé une solution, je sais pas si on peut faire mieux, si vous l'avez
<?php
function selec($tab,$post) {
     for ($i = 0, $w = count($post); $i < $w; $i++) {
         if ($post[$i] == $tab) {
             return TRUE;
         }
     }
     return FALSE;
 }

foreach($reg as $regi ){
 if (isset($_POST['region']) && selec($regi,$_POST['region'])) {
                  echo'<option  selected>'.$regi.'</option>';
              } else {
                  echo'<option >'.$regi.'</option>';
              }
}	  
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 avr. 2011, 21:52

Cela fonctionnera mieux si tu le fait dans le foreach, et si tu utilises le bon nom de variable : $reg est un tableau, $regi une valeur. Ce qui t'intéresse c'est de savoir si la valeur que tu est en train d'afficher comme option est contenue dans le tableau de valeur sélectionnée par l'utilisateur :)

En fait, il te suffit de reprendre ton code initial et de changer uniquement le contenu du if pour y inclure le code que t'a donné devlop78


Edit : et oui, on peut faire plus simple que de re-développer la fonction in_array(), c'est de l'utiliser ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 14 Messages

24 avr. 2011, 22:00

j'arrive pas à trouver avec in_array
j'ai essayé ceci mais ça marche pas :oops:
foreach($reg as $regi ){
if(in_array($_POST['region'],$regi)) $p='selected';
echo'<option  '.$p.'>'.$regi.'</option>';
}	  

devlop78
Invité n'ayant pas de compte PHPfrance

24 avr. 2011, 23:40

J'ai donné l'idée ... après à toi d'adapter, en plus je n'étais même pas sûr que l'ordre des arguments était bon.

Bref,

tu as :

- Array $reg
- Array $_POST['region']

Ce qui veut dire deux boucles imbriquées :
foreach($reg as $regi ){
if(in_array($regi,$_POST['region'])) $p='selected="selected"';
echo '<option '.$p.'>'.htmlentities($regi).'</option>';
}

Eléphanteau du PHP | 14 Messages

25 avr. 2011, 19:26

foreach($reg as $regi ){
if(in_array($regi,$_POST['region'])) $p='selected="selected"';
echo '<option '.$p.'>'.htmlentities($regi).'</option>';
} 
j'ai bien compris que j'avais 2 boucles imbriquées, mais cela ne marche pas même dans cette configuration :oops: .
pourriez vous m'expliquer? :P

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 avr. 2011, 00:17

Euh... ben en fait tu as deux tableaux, mais tu n'as qu'une seule boucle, qu'est pas particulièrement imbriquée (c'est déjà pas simple, alors c'est pas la peine de compliquer le problème avec des termes savants ;))

En fait, pour chaque élément du tableau $reg (c'est là qu'est ta boucle), tu va vérifier si celui-ci est contenu dans le tableau que tu reçois de l'utilisateur... ton code devrait donc fonctionner. A mon avis, il faut juste t'assurer que si l'élément n'est pas dedans, tu réinitialise bien la valeur de $p :
foreach($reg as $regi ){
  if(in_array($regi,$_POST['region'])) 
    $p='selected="selected"';
  else
    $p = '';
  echo '<option '.$p.'>'.htmlentities($regi).'</option>';
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

devlop78
Invité n'ayant pas de compte PHPfrance

26 avr. 2011, 01:13

MDR. Je n'avais même pas vu. On aurait pu chercher longtemps. Ca aurait bien dans ce cas de nous dire que tous les éléments étaient sélectionnés à partir du 1er vraiment choisi ... :D

Eléphanteau du PHP | 14 Messages

27 avr. 2011, 16:40

Évidement si on n'oublie l'essentiel :lol:
merci messieurs :P