Page 1 sur 1

Réaffichage de cases à cocher qui pose problème.

Posté : 17 nov. 2014, 16:55
par niconicochan
Bonjour,

Comme le titre l'indique, mon problème concerne le réaffichage de cases à cocher
dans un formulaire.

Je suis dans une session à accès réservé.
J'ai une page de formulaire et une page de traitement de formulaire.

Voici le code des checkbox dans la page du formulaire:
<input type="checkbox" name="plage[]" value="matinee" <?php if(isset($_SESSION['plage'][0]) && $_SESSION['plage'][0] == 'matinee') { echo 'checked="checked"';}; ?> />&nbsp;&nbsp;la matinée&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
             <input type="checkbox" name="plage[]" value="apres-midi" <?php if(isset($_SESSION['plage'][1]) && $_SESSION['plage'][1] == 'apres-midi') { echo 'checked="checked"';}; ?> />&nbsp;&nbsp;l'après-midi                       
             &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
             <input type="checkbox" name="plage[]" value="soiree" <?php if(isset($_SESSION['plage'][2]) && $_SESSION['plage'][2] == 'soiree') { echo 'checked="checked"';}; ?> />&nbsp;&nbsp;la soirée
Il y a trois cases, donc huit combinaisons possibles pour l'utilisateur.
Le réaffichage marche parfaitement du moment qu'il n'y a jamais de case(s) cochée(s) à la suite d'une case non cochée.
Les cases qui suivent une case non cochée et qui ont été cochées ne se réaffichent plus.

Par exemple, si l'utilisateur coche la matinée et la soirée mais pas après-midi le réaffichage donne la matinée seulement.
S'il coche la matinée et l'après-midi seulement le réaffichage se fera correctement.

J'ai l'impression que le problème se situe avec le pointeur interne du tableau plage.
C'est un tableau numérique et lorsque le pointeur se réinitialise sur une nouvelle ligne sans valeur cochée,
il doit passer à la ligne suivante en attribuant le numéro de la ligne précédente car celui-ci n'a pas encore servi.

Si je fais des var_dump derrière le code suivante, de la sorte (page de traitement du formulaire):
if (isset($_POST['plage'][0])){
$matinee=$_POST[plage][0];
};
if (isset($_POST[plage][1])){
$apres_midi=$_POST[plage][1];
};
if (isset($_POST['plage'][2])){
$soiree=$_POST['plage'][2];
};

if(isset($matinee)){
$_POST[plage][0] = "matinee";
}
if(isset($apres_midi)){
$_POST[plage][1] = "apres-midi";
}
if(isset($soiree)){
$_POST[plage][2] = "soiree";
}

var_dump($matinee);
var_dump($apres_midi);
var_dump($soiree);
Le navigateur renvoit bien les bonnes valeurs, par exemple
matinee et soirée si l'utilisateur a coché matinée et soirée.
Mais j'aurai le droit à Undefined variable: soiree et Undefined offset: 2
sûrement car il a vu que le numéro 1 destiné à l'après-midi
n'était pas affecté et il a utilisé ce numéro pour la soirée au lieu du 2,
ce qui fait que le 2 se retrouve sans rien.

J'ai entre autres essayé array_valeus et une boucle foreach mais en vain.

Voilà, si quelqu'un peut me venir en aide ce serait très sympa :D

Re: Réaffichage de cases à cocher qui pose problème.

Posté : 17 nov. 2014, 17:28
par ynx
Salut,

Les checkboxes ont un fonctionnement un peu spécial : si une case n'est pas coché, rien n'est envoyé dans le tableau POST.
Il ne faut donc pas se fier à l'indice du tableau pour récupérer les valeurs cochées.

Avec ton exemple des 3 cases à cocher, si je coche les 3 cases j’obtiens le tableau suivant :

Code : Tout sélectionner

array(3) { [0]=> string(5) "matin" [1]=> string(5) "aprem" [2]=> string(4) "soir" }
-> la valeur 'soir' correspond bien au 3e élément du tableau (indice 2)

Or si je ne coche que la dernière case j'obtiens alors :

Code : Tout sélectionner

array(1) { [0]=> string(4) "soir" }
-> soit un seul élément.

Il ne faut donc pas se fier à l'indice du tableau mais à la valeur des éléments.

Voici un exemple de ce qu'il est possible de faire :
<form method="post">
	<label><input type="checkbox" name="plage[]" value="matin" <?php if (!empty($_POST['plage']) && in_array('matin', $_POST['plage'])) echo 'checked'; ?>> matin</label>
	<label><input type="checkbox" name="plage[]" value="aprem" <?php if (!empty($_POST['plage']) && in_array('aprem', $_POST['plage'])) echo 'checked'; ?>> aprem</label>
	<label><input type="checkbox" name="plage[]" value="soir" <?php if (!empty($_POST['plage']) && in_array('soir', $_POST['plage'])) echo 'checked'; ?>> soir</label>
</form>
Bonne journée

Re: Réaffichage de cases à cocher qui pose problème.

Posté : 18 nov. 2014, 13:32
par niconicochan
Salut,

J'ai utilisé in_array et grâce à ça j'ai pu récupérer ma variable dans mon fichier de traitement de formulaire
(j'ai en fait utilisé in_array dans mon fichier de traitement de formulaire).

Voilà le code que j'ai mis dans mon fichier de traitement de formulaire:
if(in_array('matinee', $_POST['plage'])){
$_SESSION['plage'] = 'matinee';
echo $_SESSION['plage']; //pour vérifier que ça fonctionne bien.
}
if(in_array('apres-midi', $_POST['plage'])){
$_SESSION['plage'] = 'apres-midi';
echo $_SESSION['plage']; //pour vérifier que ça fonctionne bien.
}
if(in_array('soiree', $_POST['plage'])){
$_SESSION['plage'] = 'soiree';
echo $_SESSION['plage']; //pour vérifier que ça fonctionne bien.
}
Grâce à ta recommandation d'utiliser in_array l'echo affiche matinee
quand l'utilisateur coche matinée, apres-midi quand il coche après-midi
et soiree quand il coche soirée :D
Et si l'utilisateur coche sur plusieurs cases tous les echo concernés afficheront
la valeur en question
ex: matineeapres-midi s'il a coché sur matinée et après-midi
C'est une bonne avancée :D

Pour ce qui est maintenant de la page de formulaire.
Un echo $_SESSION['plage'] sur la page du formulaire ressort bien
la valeur de la case cochée.
Ex: matinee si l'utilisateur a coché matinée.
Mais si l'utilisateur a coché plusieurs cases,
une seule valeur s'affichera, les autres sont apparemment écrasées par cette valeur.
Ce qui n'est pas très étonnant en soit puisque une variable contient une seule valeur
(sauf si cette variable est un tableau).

Voilà mon problème, je n'arrive pas à récupérer toutes les valeurs cochées dans mon fichier de formulaire.
Comme je dois pouvoir récupérer plusieurs valeurs à transférer du fichier de traitement de formulaire au fichier de formulaire,
il faudrait que je passe par une "variable tableau" mais tu m'apprends qu'avec les cases à cocher l'indexation ne marche pas,
du coup je ne sais plus comment je peux faire :cry:

Ensuite, si je peux anticiper un problème que je sens arriver, je suis dans une session à accès réservé.
Donc même si j'arrive à faire passer deux valeurs, par exemple matinee et soiree,
en admettant que j'arrive à récupérer mes deux variables dans mon fichier de formulaire et à réafficher les deux coches,
l'utilisateur peut effectivement choisir l'après-midi au lieu de la matinée et de la soirée s'il s'était trompé.
S'il est satisfait, pas de problème, mais s'il veut une nouvelle fois apporter des modifications,
ce qu'il risque de se passer, c'est que ce sont les trois coches qui devraient se réafficher au lieu de celle de l'après-midi
seulement, comme souhaité. En effet, toutes les valeurs existantes dans le tableaux intégré $_SESSION se retrouvent
sur toutes les pages de la session et restent enregistrées tant que la session n'est pas détruite.

Tu peut m'aider à comprendre les deux points soulevés?

Re: Réaffichage de cases à cocher qui pose problème.

Posté : 18 nov. 2014, 15:26
par ynx
Il faut effectivement que tu utilises un tableau pour stocker l'ensemble des cases qui sont cochées.

Je n'ai pas dit que l'indexation ne fonctionne pas avec les cases à cocher, c'est simplement que le nombre d'élément (et donc leur index) retournée par le paramètre $_POST['plage'] dépend du nombre de case que l'utilisateur a coché (cf. message précédent).

Par contre tu peux très bien utiliser ta variable de session $_SESSION['plage'] comme un tableau pour stocker les valeurs des cases cochées. Par exemple :
<?php
session_start();

$_SESSION['plage'] = array();

if (!empty($_POST['plage'])) {
	if(in_array('matinee', $_POST['plage'])){
		$_SESSION['plage'][] = 'matinee';
	}
	if(in_array('apres-midi', $_POST['plage'])){
		$_SESSION['plage'][] = 'apres-midi';
	}
	if(in_array('soiree', $_POST['plage'])){
		$_SESSION['plage'][] = 'soiree';
	}
	
	echo 'L\'utilisateur a coché les cases : ';
	var_dump($_SESSION['plage']);
}
?>
<form method="post">
	<label><input type="checkbox" name="plage[]" value="matinee" <?php if (in_array('matinee', $_SESSION['plage'])) echo 'checked'; ?>> matinee</label>
	<label><input type="checkbox" name="plage[]" value="apres-midi" <?php if (in_array('apres-midi', $_SESSION['plage'])) echo 'checked'; ?>> apres-midi</label>
	<label><input type="checkbox" name="plage[]" value="soiree" <?php if (in_array('soiree', $_SESSION['plage'])) echo 'checked'; ?>> soiree</label>
	<input type="submit">
</form>
Je ne comprend pas très bien ta deuxième interrogation. Néanmoins dans l'exemple ci-dessus tu peux remarquer que toutes les cases sont réaffichées avec la valeur choisis par le visiteur, il peut donc modifier son choix avant de renvoyer le formulaire.

Re: [RESOLU] Réaffichage de cases à cocher qui pose problème

Posté : 18 nov. 2014, 18:12
par niconicochan
Merci, j'ai compris :D J'ai pu terminé mon programme :D

Je m'en souviendrai des cases à cocher :twisted:

Il y a deux choses incroyables dans ce que tu m'as dit:

1. La première est d'avoir eu l'idée ingénieuse d'utiliser la fonction in_array pour retrouver des valeurs
sans avoir besoin d'utiliser des tableaux avec une indexation qui se décale et devient faussée.
Une aiguille, une botte de foin et le tour est joué!! L'indexation peut faire n'importe quoi on s'en balance!

2. La deuxième, que je trouve presque encore plus ingénieuse, est d'avoir eu l'idée, et ça je trouve qu'il fallait vraiment le faire,
de créer un tableau vide nommé
$_SESSION['plage']
avec la ligne de code suivante:
$_SESSION['plage'] = array();
Et ça ça me bluffe!
Parce que du coup le tableau vide se rempli à mesure que le serveur lit le code ci-dessous:
if (!empty($_POST['plage'])) {
        if(in_array('matinee', $_POST['plage'])){
        $_SESSION[plage'][] = 'matinee';
        }
        if(in_array('apres-midi', $_POST['plage'])){
        $_SESSION['plage'][] = 'apres-midi';
        }
        if(in_array('soiree', $_POST['plage'])){
        $_SESSION['plage'][] = 'soiree';
        }
}
les valeurs du tableaux sont redirigées vers la page de formulaire avec la boîte modale,
l'aiguille et la botte de foin permettent à nouveau d'afficher les valeurs à l'écran,
et lorsque l'utilisateur appuie à nouveau sur envoi après avoir ou non changé les valeurs,
il se passe quelque chose qui pour moi est incroyable, on crée un tableau vide qui s'appelle
$_SESSION['plage']
$_SESSION['plage'] = array();
C'est incroyable car ce tableau va accueillir les dernières entrées utilisateurs postées et ça uniquement!
Si cette ligne de code n'existait pas, on peut faire le test d'ailleurs, il suffit d'enlever
$_SESSION['plage'] = array();
il y aurait un réaffichage automatique de toutes les valeurs déjà cochées au moins une fois dans la session,
ce qui fait par exemple que si l'utilisateur entre d'abord matinée et soirée, ces deux valeurs sont cochées au réaffichage,
mais s'il entre ensuite après-midi et qu'il envoi le formulaire en oubliant d'autres champs encore,
ce sont les trois champs qui seront cochés car matinée et soirée auront déjà été cochés une fois dans la même session!!
Hors avec ton code, toutes ces anciennes valeurs entrées qui deviennent donc parasites pour l'utilisateur
"sont écrasées" par l'annonce du tableau
$_SESSION['plage']
qui est annoncé comme vide =>
$_SESSION['plage'] = array();
.
Je ne sais pas si j'arrive à me faire comprendre?
En tout cas moi ça m'épatte :D =D> :D