IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Conserver Checkbox cochées


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 129
    Par défaut Conserver Checkbox cochées
    Bonjour,

    Voilà mon problème et j'aimerai avoir votre conseil sur la démarche à suivre :

    J'ai un formulaire qui contient des checkbox, boutons radio. La partie de mon formulaire avec les checkbox est générée dynamiquement via une boucle. Celle avec les boutons radio est fixe.
    J'ai mis en place un fichier .js contenant une fonction pour vérifier si tout est coché au moins une fois et un fonction fonction pour submit le formulaire à chaque click de l'utilisateur sur une checkbox ou bouton radio etc..
    Le soucis c'est que mon formulaire rappel la même page, et donc, recharge le formulaire et donc si l'utilisateur coche une case elle se décoche automatiquement et de ce fait on ne peux pas cocher plusieurs case ...

    J'ai vu quelques solutions sur le forum et sur le net mais aucune ne m'a vraiment convaincu... :/ Variable de Session, input hidden etc je ne sais pas du tout comment/quoi faire ^^'

    Merci de votre aide

    Ps : voilà le code de mon formulaire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    	<form method="POST" action="macmon.php" name="formulaire">
     
    	<div id="cadreMachine"><fieldset>
    	<legend>Machines :</legend>
    	<table>
    		<td>
     
    		<tr><b>Linux :</b><br/>
     
    		<?php
    		foreach($machineLinux[0] as $elementL)
    		{
    			if ($elementL == "localhost")
    			{
    				echo'<input type="checkbox" name="checkLinux" value="'.$elementL.'" class="Linux" onclick="envoyerL()"/> <label for="'.$elementL.'">'.$elementL.'</label><br/>';
    			}else{
    				echo'<input type="checkbox" name="checkLinux" value="'.$elementL.'" class="Linux" onclick="envoyerL()"/> <label for="'.$elementL.'">'.$elementL.'</label><br/>';
    			}
    		}
    		?>
    		</tr>
    <br/>
    		<tr><b>Windows :</b><br/>
     
    		<?php
    		foreach($machineWindows[0] as $elementW)
    		{
    			echo'<input type="checkbox" name="checkWindows" value="'.$elementW.'" class="Windows" onclick="envoyerW()"/> <label for="'.$elementW.'">'.$elementW.'</label><br/>';
    		}
    		?>
    		</tr>
    	</table>
    	<input type="hidden" value="0"/>
    	</fieldset>
    	</div>
     
    		<div id="cadreplug">
    	<fieldset>
    	<legend>Plugins :</legend>
     
    		<input type="radio" name="plugin" value="LasirCpu" id="idPlug" checked="checked"/><label for="plugin">CPU</label><br/>
    		<input type="radio" name="plugin" value="LasirCpuAdmin" id="idPlug"/><label for="plugin">CPUAdmin</label><br/>
    		<input type="radio" name="plugin" value="LasirDisque" id="idPlug"/><label for="plugin">Disque Dur</label><br/>
    		<input type="radio" name="plugin" value="LasirMemory" id="idPlug"/><label for="plugin">Mémoire RAM</label><br/>
    		<input type="radio" name="plugin" value="LasirReseau" id="idPlug"/><label for="plugin">Réseau</label><br/>
    		<input type="radio" name="plugin" value="LasirUtilisateur" id="idPlug"/><label for="plugin">Utilisateur (Windows)</label><br/>
     
    	</fieldset>
    	</div>
     
    	<div id="cadreFreq">
    	<fieldset>
    	<legend>Fréquence :</legend>
     
    		<input type="radio" name="frequence" value="day" id="idFreq" checked="checked" /> <label for="frequence">Jour</label><br/>
    		<input type="radio" name="frequence" value="week" id="idFreq"/> <label for="frequence">Semaine</label><br/>
    		<input type="radio" name="frequence" value="month" id="idFreq"/> <label for="frequence">Mois</label><br/>
    		<input type="radio" name="frequence" value="year" id="idFreq"/> <label for="frequence">Année</label><br/>
     
    	</fieldset>
    	</div>
    	</form>

  2. #2
    Membre très actif
    Avatar de Nowwis
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2009
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2009
    Messages : 406
    Par défaut
    Bonjour,

    Pourquoi raffraichis-tu ton form à chaque click dans une checkbox ? Pour stocker l'info en BdD ?
    Si tel est le cas, tu pourrais réutiliser l'info pour agrémenter tes checkbox.

    Sinon, la solution à mes yeux et la variable _POST :
    Effectivement, si tu renvois ton formulaire à chaque fois, tu sais exactement quel checkbox ont été coché grâce à $_POST['name_checkbox']; et donc les recoché par défault.

    De plus, dans ton form, les name des checkbox doivent se finir par []. Effectivement, tu crées un tableau (tu peux en avoir plusieurs). Hors là ça va être difficile de récupérer plusieurs checkbox.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 129
    Par défaut
    Enfait disons que je veux que lorsque l'utilisateur click sur une checkbox l'information ciblé apparaisse directement à l'écran. (Pour info c'est des img)
    Donc en fonction des critères qu'il choisit (checkbox et radio) l'image ou les images s'affichent en "temps réel" sans avoir à cliquer sur un bouton submit (qui aurait été plus simple pour moi mais dans le cadre du projet je ne peux pas).

    Donc si je mets les "[]" à la fin de mes "name" et si j'utilise ce code par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(isset($_POST['checkWindows']) && in_array($elementW, $_POST['checkWindows']))
    			{
    				echo'<input type="checkbox" name="checkWindows" value="'.$elementW.'" class="Windows" onclick="envoyerW()" checked="checked"/> <label for="'.$elementW.'">'.$elementW.'</label><br/>';
    			}else
    			{
    				echo'<input type="checkbox" name="checkWindows" value="'.$elementW.'" class="Windows" onclick="envoyerW()"/> <label for="'.$elementW.'">'.$elementW.'</label><br/>';
    			}
    Ça devrait marcher?

  4. #4
    Membre très actif
    Avatar de Nowwis
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2009
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2009
    Messages : 406
    Par défaut
    Donc déjà, tu peux faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(isset($_POST['checkWindows'][$elementW]))
    			{
    				echo'<input type="checkbox" name="checkWindows['.$elementW.']" value="'.$elementW.'" class="Windows" onclick="envoyerW()" checked="checked"/> <label for="'.$elementW.'">'.$elementW.'</label><br/>';
    			}else
    			{
    				echo'<input type="checkbox" name="checkWindows['.$elementW.']" value="'.$elementW.'" class="Windows" onclick="envoyerW()"/> <label for="'.$elementW.'">'.$elementW.'</label><br/>';
    			}
    Ou plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $checked = (isset($_POST['checkWindows'][$elementW])) ? 'checked="checked"' : '';
    echo'<input type="checkbox" name="checkWindows['.$elementW.']" value="'.$elementW.'" class="Windows" onclick="envoyerW()" '.checked .' /> <label for="'.$elementW.'">'.$elementW.'</label><br/>';
    Si ton action JS envoyerW envoi ton form en submit, et que la method est POST, alors oui je pense que ça marche

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 129
    Par défaut
    D'accord merci. je vais tester et adapter ça =)

    quand je récupère les valeurs de mes checkbox, je dois utiliser tout le temps le "name" sous cette forme : checkWindows['.$elementW.']?

  6. #6
    Membre très actif
    Avatar de Nowwis
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2009
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2009
    Messages : 406
    Par défaut
    Ben au vu de ton code, j'ai pris ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    name="checkWindows['.$elementW.']"
    Mais c'est à toi de voir le meilleur moyen. Si les éléments viennent d'une BdD pourquoi ne pas mettre l'id (au moins t'es sur d'en avoir qu'un...).

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 129
    Par défaut
    non mes éléments viennent d'un dossier. Enfait j'affiche des images qui sont dans un certains dossier etc. Ces images sont déjà générées par un logiciel donc leur nom est structuré d'une façon précise et donc moi je peux les retrouver grâce à cette nomenclature.
    Mon "$elementW" c'est une variable que je tire d'un tableau. Et donc pour tous mes éléments de tableau (foreach) j'affiche mes checkbox (soit une par $elementW quoi )

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 129
    Par défaut
    Alors je viens d'adapter le code et à première vu ça marche. le seul soucis c'est qu'il me prend que le post de la dernière variable. Si je coche ma première checkbox et que j'affiche le $_POST avec print_r il ne m'affiche rien par contre si je coche la dernière checkbox, là le print_r m'affiche le tableau contenant le value de ma dernière checkbox. Problème de boucle?

  9. #9
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    J'essai de comprendre un peu ce que tu tentes de faire, et je me dis que, théoriquement (donc sauf erreur), il ne serait pas utile de recharger ainsi la page à chaque checkbox coché.

    Au départ, tu as des données sous le coude, c'est à dire une liste de cases à cocher qui, si j'ai bien compris, doivent permettre d'afficher une image si l'utilisateur les coches.

    Les images correspondant seraient là, sur le serveur, et leur nom correspondraient (plus ou moins) à $elementW.

    Du coup, pourquoi ne pas exploiter le CSS, soit ceci :
    -> display: none
    -> display: block
    c'est à dire visible / caché.

    Par défaut, le code HTML des images seraient là mais invisibles.
    Puis lorsqu'on les coches un JS s'occuperait à les rendre visible ou invisible selon son état coché/décoché, cela en JS (display: block ou display: none).
    (plus besoin de recharger la page)

    Cependant, pour valider le tout il faudra un bouton submit étant donné qu'on laisse le soin à l'utilisateur d'effectuer tous ces choix en 1er (sans rechargement, donc sans validation annexe en JS).

    C'est une idée

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 129
    Par défaut
    Oui merci c'est une bonne idée mais voilà ^^' je ne peux pas faire avec un bouton submit. ça ne "colle pas" au cahier des charges :/
    Ca m'aurais arrangé mais non je peux pas.
    Du coup j'ai toujours ce problème de boucle là...

    EDIT: C'est bon tout marche impec'
    Le pb que j'avais enfait c'est que je m’étais un peu trop emporté sur les vérification de mes variables avec le "isset". J'ai raccourcie ma condition à un simple "isset" et ça marche déjà beaucoup mieux =)

  11. #11
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Oui merci c'est une bonne idée mais voilà ^^' je ne peux pas faire avec un bouton submit. ça ne "colle pas" au cahier des charges
    Tu as su trouver le problème, tant mieux.

    Mais pour celui qui a effectué ce cahier des charges, il doit pas être trop au courant du fonctionnement de ce protocole HTTP, qui est particulier.
    Tu évoques à un moment "en temps réel", il n'y a justement pas de temps réel, et c'est l'une des particularités, surement un frein à certain développement, et certaines erreurs commises aussi.
    Il y a des technique qui tentent de palier à cela, entre autre l'Ajax, mais ce n'est pas du temps réel pour autant.

    Les WebSockets (protocole ws/wss) vont très certainement apporter une réponse à ce problème, mais c'est en cours, c'est pas finalisé.


    D'ailleurs, tu dois t'en rendre compte, car à chaque "submit" effectué en JS (quelque par artificiellement), la totalité des traitements sont à refaire.
    C'est un énorme handicap, quand bien même que l'application tourne sur une seule machine (en local par exemple).

    En tout cas je ne vois vraiment pas d'explication qui pousse à ne pas vouloir mettre un bouton submit dans un formulaire.
    Ca me parais même limite absurde.


    Ceci dit, il y a peut être moyen de tricher un peu.
    On peu par exemple mettre un bouton submit qu'on défini à 1 pixel de hauteur et de largeur (même couleur de fond aussi), donc quelque part masqué/planqué dans le formulaire.
    Du fait qu'il existe, il suffit d'appuyer sur la touche "entrer" pour valider le formulaire.
    Il y a quand même une sorte de restriction, il faut que le focus (position du curseur) se trouve dans le formulaire. Mais ceci peut être "forcer" en JS.
    Et le tour est jouer.

    A moins que le cahier des charges interdise aussi d'appuyer sur la touche entrer, alors dans cette condition je suis à bout d'idées.

    C'était une autre idées (surement la dernière).

  12. #12
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 129
    Par défaut
    oui c'est une bonne idée ^^

    Mais enfait sur ce projet là, on recherche une "rapidité" d'utilisation. C'est sûr que faire un clic de plus ça n'a tué personne mais c'est pas moi qui décide Car si tu compte que j'ai 10 checkbox, 10 boutons radio, et que chaque checkbox et bouton radio sont des critères pour afficher mes images, je te laisse imaginer le nombre de combinaisons possible donc le nombre de fois que l'utilisateur devra cliquer sur les checkbox et sur submit. Là dans un sens je lui ai simplifié la tache en divisant par deux le temps passé à cliquer c'est quasi-rien mais quand même.

    Après, le projet n'est pas conçut pour être up sur le net. C'est un projet qui restera en local pour l'entreprise donc pour le soucis de temps d’exécution/calcul etc ça va.

  13. #13
    Membre Expert Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Par défaut
    Citation Envoyé par pra3t0r Voir le message
    Mais enfait sur ce projet là, on recherche une "rapidité" d'utilisation. C'est sûr que faire un clic de plus ça n'a tué personne mais c'est pas moi qui décide Car si tu compte que j'ai 10 checkbox, 10 boutons radio, et que chaque checkbox et bouton radio sont des critères pour afficher mes images, je te laisse imaginer le nombre de combinaisons possible donc le nombre de fois que l'utilisateur devra cliquer sur les checkbox et sur submit. Là dans un sens je lui ai simplifié la tache en divisant par deux le temps passé à cliquer c'est quasi-rien mais quand même.
    L'idée de RunCodePhp (je crois) c'était plutot de modifier ton affichage en javascript mais du coup pour valider les modifs, il faut à la fin de la saisie submiter le formulaire via un bouton.
    Tu coup ça ne multiplie pas par 2 le nombre de cliques mais valide juste la conf complète une fois terminée....

    Ca me paraît plus sûr et logique de valider une fois la saisie terminée plutot que de valider au fur et à mesure....

Discussions similaires

  1. conserver les checkbox cochés
    Par I.Z.M.M dans le forum ASP.NET
    Réponses: 0
    Dernier message: 25/01/2009, 13h44
  2. nombre de checkbox cochés
    Par manaboko dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/05/2005, 15h39
  3. [débutant] obtenir le nombre de checkbox cochées
    Par macke_d dans le forum Composants
    Réponses: 3
    Dernier message: 30/03/2005, 02h17
  4. Réponses: 9
    Dernier message: 12/01/2005, 17h00
  5. [XML][XSL]afficher une checkbox cochée
    Par kirk80 dans le forum XMLRAD
    Réponses: 2
    Dernier message: 16/09/2004, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo