Page 1 sur 2

Formulaire avec plusieurs Select et affichage des selected a

Posté : 26 févr. 2008, 10:35
par Xvider
Bonjour,

Alors attention ça va pas être simple à expliquer :p

Je possède une page qui contient plusieurs éléments <select>

exemple
<select id="typefeuilles">
	<option>Veuillez Choisir un Type d'impression</option>
	<option <? echo $recto; ?> value="Recto">Recto</option>
	<option <? echo $rectoverso; ?> value="Recto/Verso">Recto/Verso</option>
</select>
<select id="formatprod">
	<option value="">Veuillez Choisir le Format du Produit</option>
	<option value="prodA3">A3</option>
	<option value="prodA4">A4</option>
	<option value="Personnalise">Personnalisé</option>
</select>
Je valide mon formulaire, je stock le choix de l'utilisateur dans une $_SESSION, jusque là rien de rare.

La méthode simple pour positionner mon selected sur mon premier <select>, serait de faire quelque chose comme ceci.

Biensur ce code et tout au dessus du précédent exemple.
<?
session_start();
	$recto="";
	$rectoverso="";
	if (isset($_SESSION['typefeuilles'])=="Recto")
	{
		$recto="selected=\"selected\"";
	}
	else if (isset($_SESSION['typefeuilles'])=="Recto/Verso")
	{
		$rectoverso="selected=\"selected\"";
	}
?>
La méthode fonctionne, mais n'est pas du tout approprié à la masse d'information ce trouvant dans la page.

Le souci c'est que là je doit faire cette vérification pour chaque <select> et ceux ci ne contiennent que peu de choix.

Comment faire pour simplifier la chose et rendre compatible a chaque balise, même celle avec beaucoup plus d'option ?

Merci par avance.

Posté : 26 févr. 2008, 10:45
par d0m
Salut,

Pour faire cela de façon générique, il faut faire le test carrément en affichant la liste
c'est à dire tester si la valeur en session de la liste courante correspond à l'option qu'on affiche :
<select id="typefeuilles">
    <option>Veuillez Choisir un Type d'impression</option>
    <option <? if($_SESSION['typefeuilles']=='Recto') echo 'selected="SELECTED"'; ?> value="Recto">Recto</option>
    <option <? if($_SESSION['typefeuilles']=='Recto/Verso') echo 'selected="SELECTED"'; ?> value="Recto/Verso">Recto/Verso</option>
</select> 

Posté : 26 févr. 2008, 10:54
par Xvider
Oui j'avais fait comme toi au début, je l'ai sorti parce que je sentais venir le moment de la vérification sur chaque champs, et ça me paraissait plus lisible de l'extérieur.

Une idée pour une méthode plus simple, genre une fonction générique qui marcherait pour tous les <select> ?

Et s'affranchir donc d'un if pour chaque <option>, de façon a ne pas avoir a ce soucier du nombre d'information a l'intérieur, surtout si le <select> et généré depuis une Base de Donnée.

Posté : 26 févr. 2008, 10:58
par d0m
Oui,

le "générique" ne vient pas de la sélection par défaut mais de la construction de la liste.
Si tu veux quelque chose de générique, il te faut construire les listes de manière générique.
Par exemple avec une fonction :
function creer_liste($nom_liste,$options,$valeur_selectionnee){
  echo '<SELECT NAME="'.$nom_liste.'">';
  foreach($options as $option){
    echo '  <OPTION VALUE="'.$option['value'].'";if($option['value']==$valeur_selectionnee) echo 'selected="SELECTED"'; echo '>'.$option['libelle'].'"</OPTION>';
  }
  echo '</SELECTED>';
}
et l'utiliser comme ceci :
$options = array();
$options[] = array('value'=>'Recto/Verso','libelle'=>'Recto/Verso');
...
creer_liste('typesfeuilles',$options,$_SESSION['typesfeuilles']);

Posté : 26 févr. 2008, 11:16
par Xvider
Ce qui va donner un tableau par <select> ?

Et un apport a la fonction pour chacun des <select> aussi.

On sous entend toujours que l'on connait le contenu du <select> de cette façon :(

J'essaye de trouver ou héberger mon truc pour que le rendu soit compréhensible.

Posté : 26 févr. 2008, 11:49
par d0m
oui il faudra construire un tableau par select et appeler la fonction pour chacun.
Mais ça aussi tu peux le faire de manière générique, tout dépend d'où tu sort les valeurs à mettre dans les select.

De toute façon il faudra à un moment ou un autre savoir quoi mettre dans la liste.

Le mieux déjà c'est de mettre toutes les valeurs sélectionnées des listes dans un tableau prévu pour cela dans la variable de session au lieu de mettre directement dans $_SESSION :
$_SESSION['valeurs_selectionnes']['type_feuilles'] = $_POST['type_feuilles'];
...
Tu peux très bien mettre l'affichage des listes dans une boucle et utiliser le nom figurant dans la variable de session :
foreach($_SESSION['valeurs_selectionnes'] as $nom_liste => $valeur_selectionnee){
  $options = array();
  //ici il faudra ta requête ou je ne sais quoi qui va chercher les éléments à placer dans la liste
  $options[] = array('value' => '..., 'libelle' => ...);
   ...
  creer_liste($nom_liste,$options,$valeur_selectionnee);
}

Posté : 26 févr. 2008, 12:10
par Xvider
Me revoilà,

Je viens de trouver pour héberger mon projet en cour.

Vous comprendrez surement beaucoup mieux ou je veu en venir.

http://xvider.atwebpages.com/

Mon problème commence a la page Detail du Livre.

Merci encore pour toutes ces réponses super rapide.

Le but de mon projet est:

Permettre à l'utilisateur de revenir à tout moment dans le devis, tant qu'il n'a pas validé la fin des opérations. (l'édition, qui lancera aussi son stockage dans la base de donnée)

Quasi tout ce fait en AJAX (une sorte de défis personnel en même temps)

Posté : 26 févr. 2008, 14:16
par d0m
oui ok tu as plusieurs listes déroulantes mais elles ne sont pas magiques, à un moment donné il faudra remplir les différentes listes par les options possibles.

D'où sort tu ces options?
- en dur dans le code
- dans une base de données
- dans un fichier?

Posté : 26 févr. 2008, 14:18
par Xvider
Pour l'instant c'est en dur pour mes tests mais ça viendra d'une base de donnée.

Posté : 26 févr. 2008, 14:25
par d0m
Alors disons que ça vient d'une base.
Il faudra dans ta base :
- le nom de la liste
- les différentes valeurs
- les différentes libelles (si différents des valeurs)

tu pourras par exemple faire un tableau multidimensionnel contenant les différentes listes ainsi que les options :
//extraction d'une ligne de la requête
while($ligne = ...){
  $tableau[$ligne['nom_liste']][] = array('valeur'=>$ligne['valeur'],'libelle'=>$ligne['libelle']) ;
}
Il te suffira ensuite de parcourir ce tableau et pour les différentes listes, les afficher avec la fonction générique.

Posté : 27 févr. 2008, 10:49
par Xvider
Pas d'autre alternative que le tableau ?

Ca me parait un peu lourd pour un si petit truc, après je dit surement une connerie.

J'ai deja l'info dans une variable de session en plus, le but est uniquement de l'exploiter de façon générique quand on revient sur la page.

Posté : 27 févr. 2008, 11:16
par d0m
Tu n'est pas obligé d'utiliser un tableau, tu peux utiliser un objet ou même rien en utilisant directement les résultats des requêtes.
Ça ce n'est que de la manipulation de variables.

Posté : 27 févr. 2008, 11:29
par Xvider
je rappelle mon objectif.

Page de formulaire multiSelect
L'utilisateur arrive, fait des choix, change de fenêtre et ce rend compte qu'il a oublié un truc dans la page précédente ou encore avant.

Quand il revient sur la page je veu que les choix de l'utilisateur effectué précédemment ce ré affiche comme s'il n'avait jamais changé de page.

Pour ce faire lors du départ de la page je recup tous ces choix dans des variables de sessions(j'ai pas trouvé comment faire autrement)

Quand il revien j'aimerai pouvoir faire ré afficher c'est choix sans avoir à connaitre la structure de la page en dur, c'est a dire la valeur des champs à contrôler (en admettant qu'ils viennent d'un BDD)

Posté : 27 févr. 2008, 12:28
par d0m
Pour ce faire lors du départ de la page je recup tous ces choix dans des variables de sessions
Ça c'est très bien, ça te permet de naviguer en gardant les choix en mémoire.
Quand il revien j'aimerai pouvoir faire ré afficher c'est choix sans avoir à connaitre la structure de la page en dur, c'est a dire la valeur des champs à contrôler (en admettant qu'ils viennent d'un BDD)
On récapitule :
- les choix déjà faits sont mémorisés dans la variable de session
- on revient sur ta page avec les listes
- tes listes sont donc à afficher
- il faut donc les construire
- tu peux utiliser pour cela une fonction générique(évite de taper des dizaines de lignes de codes)
- tu passes dans cette fonction la valeur de la variable de session correspondante à la liste.
- tu as une page avec des listes et des choix pré sélectionnées (les valeurs dans la variable de session)

Quelle étape as tu du mal à saisir/coder ?

Posté : 27 févr. 2008, 12:42
par Xvider
Je bloc a ce niveau
- tu peux utiliser pour cela une fonction générique(évite de taper des dizaines de lignes de codes)
- tu passes dans cette fonction la valeur de la variable de session correspondante à la liste.
- tu as une page avec des listes et des choix pré sélectionnées (les valeurs dans la variable de session)

Parce que le faire tout en connaissant chaque champ je peu mais rédiger la fonction qui ce fou du nom c'est une autre affaire.

Et justement j'aimerai que ça puisse marcher dans toute les situation

En gros, j'avais envisager une fonction du genre :

- j'ai un select avec un ID donné et une variable de session lui étant associé portant le même nom.
- une fonction qui boucle sur le select d'un style

Code : Tout sélectionner

function select(idvariable) { for ($machin=0 , machin<idvariable.length (a la taille de mon select),machin++) { et la en fonction de ma variable de session je vérifie qu'elle champ avait été choisi et rajouter la mention selected dans le <option> } }
enfin c'est ce que j'avais en tête mais pas moyen de le réaliser je bloc dessus depuis deux jours

je te renouvelle l'endroit ou tu peu en avoir un exemple :p

http://xvider.atwebpages.com/

Mon problème commence a la page Detail du Livre.