J'ai un tas de cases à cocher qui sont cochées par défaut. Mes utilisateurs décocheront probablement quelques-unes (le cas échéant) des cases à cocher et laisseront le reste coché.
Existe-t-il un moyen de faire en sorte que le formulaire POSTE les cases à cocher qui ne sont pas cochées, plutôt que celles qui sont cochées?
checkbox
élément est terrible? Ils sont un contrôle binaire, ils doivent envoyer des valeurs binaires.La solution que j'aimais le plus jusqu'à présent est de mettre une entrée cachée avec le même nom que la case à cocher qui pourrait ne pas être cochée. Je pense que cela fonctionne de sorte que si la case n'est pas cochée, l'entrée cachée est toujours réussie et envoyée au serveur, mais si la case est cochée, elle remplacera l'entrée cachée avant elle. De cette façon, vous n'avez pas à garder une trace des valeurs dans les données publiées qui devraient provenir des cases à cocher.
la source
Je l'ai résolu en utilisant du JavaScript vanille:
Attention à ne pas avoir d'espaces ni de sauts de ligne entre ces deux éléments d'entrée!
Vous pouvez utiliser
this.previousSibling.previousSibling
pour obtenir des éléments "supérieurs".Avec PHP, vous pouvez vérifier le champ caché nommé pour 0 (non défini) ou 1 (défini).
la source
<fieldset name='fs1'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset> <fieldset name='fs2'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset>
* Supposons qu'il y avait de nouvelles lignes là-bas. Ils ne semblent pas travailler dans des blocs de code de mini-balisagepreviousElementSibling
place depreviousSibling
. Il est pris en charge presque partout et ignore les nœuds de texte.Mon préféré est d'ajouter un champ caché avec le même nom qui sera utilisé si la case n'est pas cochée. Mais la solution n'est pas aussi simple qu'il y paraît.
Si vous ajoutez ce code:
Le navigateur ne se souciera pas vraiment de ce que vous faites ici. Le navigateur enverra les deux paramètres au serveur et le serveur devra décider quoi en faire.
PHP, par exemple, prend la dernière valeur comme celle à utiliser (voir: Position faisant autorité des clés de requête HTTP GET en double )
Mais d'autres systèmes avec lesquels j'ai travaillé (basés sur Java) font le chemin - ils ne vous offrent que la première valeur. .NET au lieu de cela vous donnera un tableau avec les deux éléments à la place
J'essaierai de tester cela avec node.js, Python et Perl à un moment donné.
la source
request.getParameterValues
Une technique courante consiste à transporter une variable cachée avec chaque case à cocher.
Côté serveur, nous détectons d'abord la liste des variables cachées et pour chacune des variables cachées, nous essayons de voir si l'entrée de case à cocher correspondante est soumise ou non dans les données du formulaire.
L'algorithme côté serveur ressemblerait probablement à:
Ce qui précède ne répond pas exactement à la question, mais fournit un autre moyen d'obtenir des fonctionnalités similaires.
la source
vous n'avez pas besoin de créer un champ caché pour toutes les cases à cocher, il suffit de copier mon code. elle changera la valeur de la case à cocher si elle n'est pas cochée, la
value
affectera0
et si la case à cocher est cochée, affectez-lavalue
à1
la source
Si vous omettez le nom de la case à cocher, elle ne sera pas transmise. Seul le tableau test_checkbox.
la source
Vous pouvez faire du Javascript dans l'événement d'envoi du formulaire. C'est tout ce que vous pouvez faire, il n'y a aucun moyen d'amener les navigateurs à le faire eux-mêmes. Cela signifie également que votre formulaire sera rompu pour les utilisateurs sans Javascript. Mieux vaut savoir sur le serveur quelles cases il y a, donc vous pouvez en déduire que celles qui sont absentes des valeurs de formulaire publiées (
$_POST
en PHP) ne sont pas cochées.la source
$_REQUEST
est une bonne pratique car elle permet une certaine réutilisation du code si votre script prend en charge les deux méthodes.Je ferais en fait ce qui suit.
Avoir mon champ de saisie caché avec le même nom avec la case à cocher
puis quand je poste, je supprime tout d'abord les valeurs en double ramassées dans le tableau $ _POST, après avoir affiché chacune des valeurs uniques.
Je l'ai obtenu d'un post supprimer les valeurs en double du tableau
la source
checkbox_name[]
chaque valeur sera entrée dans un tableau que vous pourrez ensuite extraire. Ex:$_POST['checkbox_name'][0]
et ainsi de suite avec l'incrément du nombre de champs portant le même nom. Un autre exemple est que si vous aviez trois champs nommés,field_name[]
vous pouvez obtenir la deuxième valeur defield_name
like$_POST['field_name'][1]
. Son objectif peut être étonnant si vous avez plusieurs champs du même nom."J'ai opté pour l'approche serveur. Semble fonctionner correctement - merci. - reach4thelasers 1 déc. 09 à 15:19" Je voudrais le recommander du propriétaire. Comme cité: la solution javascript dépend de la façon dont le gestionnaire de serveur (je ne l'ai pas vérifié)
tel que
la source
Je sais que cette question a 3 ans mais j'ai trouvé une solution qui, je pense, fonctionne plutôt bien.
Vous pouvez vérifier si la variable $ _POST est affectée et l'enregistrer dans une variable.
la fonction isset () vérifie si la variable $ _POST est affectée. Par logique, s'il n'est pas attribué, la case n'est pas cochée.
la source
La plupart des réponses ici nécessitent l'utilisation de JavaScript ou de contrôles d'entrée en double. Parfois, cela doit être entièrement géré côté serveur.
Je crois que la clé (prévue) pour résoudre ce problème commun est le contrôle d'entrée de soumission du formulaire.
Pour interpréter et gérer avec succès les valeurs non cochées des cases à cocher, vous devez connaître les éléments suivants:
En vérifiant si le formulaire a été soumis (une valeur est affectée à l'élément d'entrée de soumission), toute valeur de case à cocher non cochée peut être supposée .
Par exemple:
Lors de l'utilisation de PHP, il est assez simple de détecter les cases à cocher.
Les données initiales pourraient être chargées à chaque chargement de page, mais ne devraient être modifiées que si le formulaire a été soumis. Étant donné que les noms des cases à cocher sont connus à l'avance, ils peuvent être parcourus et inspectés individuellement, de sorte que l'absence de leurs valeurs individuelles indique qu'ils ne sont pas vérifiés.
la source
J'ai d'abord essayé la version de Sam. Bonne idée, mais cela fait qu'il y a plusieurs éléments dans le formulaire avec le même nom. Si vous utilisez un javascript qui trouve des éléments en fonction du nom, il renverra désormais un tableau d'éléments.
J'ai travaillé sur l'idée de Shailesh en PHP, ça marche pour moi. Voici mon code:
la source
J'aime aussi la solution que vous venez de publier un champ de saisie supplémentaire, en utilisant JavaScript me semble un peu hacky.
En fonction de ce que vous utilisez pour votre backend dépendra de l'entrée qui va en premier.
Pour un serveur principal où la première occurrence est utilisée (JSP), vous devez procéder comme suit.
Pour un serveur principal où la dernière occurrence est utilisée (PHP, Rails), vous devez procéder comme suit.
Pour un serveur principal où toutes les occurrences sont stockées dans un type de données de liste (
[]
,array
). (Python / Zope)Vous pouvez publier dans l'ordre que vous souhaitez, il vous suffit d'essayer d'obtenir la valeur de l'entrée avec l'
checkbox
attribut type. Donc, le premier index de la liste si la case à cocher était avant l'élément caché et le dernier index si la case à cocher était après l'élément caché.Pour un serveur principal où toutes les occurrences sont concaténées avec une virgule (ASP.NET / IIS) Vous devrez (diviser / exploser) la chaîne en utilisant une virgule comme délimiteur pour créer un type de données de liste. (
[]
)Vous pouvez maintenant tenter de récupérer le premier index de la liste si la case à cocher était avant l'élément caché et de récupérer le dernier index si la case à cocher était après l'élément caché.
source d'image
la source
J'utilise ce bloc de jQuery, qui ajoutera une entrée cachée au moment de la soumission à chaque case à cocher non cochée. Cela vous garantira que vous obtenez toujours une valeur soumise pour chaque case à cocher, à chaque fois, sans encombrer votre majoration et sans risquer d'oublier de le faire sur une case à cocher que vous ajouterez plus tard. Il est également indépendant de la pile backend (PHP, Ruby, etc.) que vous utilisez.
la source
Vous pouvez également intercepter l'événement form.submit et inverser la vérification avant de soumettre
la source
Je vois que cette question est ancienne et a tellement de réponses, mais je vais quand même donner mon sou. Mon vote est pour la solution javascript sur l'événement «soumettre» du formulaire, comme certains l'ont souligné. Pas de doublage des entrées (surtout si vous avez des noms longs et des attributs avec du code php mélangé avec du HTML), pas de soucis côté serveur (qui nécessiterait de connaître tous les noms de champs et de les vérifier un par un), il suffit de récupérer tous les éléments non cochés , attribuez-leur une valeur 0 (ou tout ce dont vous avez besoin pour indiquer un état «non vérifié»), puis changez leur attribut «vérifié» en vrai
de cette façon, vous aurez un tableau $ _POST comme ceci:
la source
la source
Ce que j'ai fait était un peu différent. J'ai d'abord changé les valeurs de toutes les cases à cocher non cochées. À "0", puis tous sélectionnés, la valeur serait alors soumise.
la source
Je préfère assembler le $ _POST
cela ne dérange pas, si le POST n'a pas la valeur 'checkboxname', il a été décoché donc, attribuez une valeur.
vous pouvez créer un tableau de vos valeurs ckeckbox et créer une fonction qui vérifie si des valeurs existent, si ce n'est pas le cas, cela ne dérange pas et vous pouvez attribuer une valeur
la source
Exemple sur les actions Ajax est (': vérifié') utilisé jQuery au lieu de .val ();
params obtiendra la valeur TRUE OR FALSE.
la source
Les cases à cocher représentent généralement les données binaires qui sont stockées dans la base de données sous forme de valeurs Oui / Non, O / N ou 1/0. Les cases à cocher HTML sont de mauvaise nature pour envoyer de la valeur au serveur uniquement si la case est cochée! Cela signifie que le script du serveur sur un autre site doit savoir à l'avance quelles sont toutes les cases à cocher possibles sur la page Web afin de pouvoir stocker des valeurs positives (cochées) ou négatives (non cochées). En fait, seules les valeurs négatives posent problème (lorsque l'utilisateur décoche la valeur précédemment (pré) vérifiée - comment le serveur peut-il le savoir lorsque rien n'est envoyé s'il ne sait pas à l'avance que ce nom doit être envoyé). Si vous avez un script côté serveur qui crée dynamiquement un script UPDATE, il y a un problème parce que vous ne savez pas ce que toutes les cases à cocher doivent être reçues afin de définir la valeur Y pour les cases cochées et N pour les cases non cochées (non reçues).
Étant donné que je stocke les valeurs «Y» et «N» dans ma base de données et les représente via des cases à cocher cochées et non cochées sur la page, j'ai ajouté un champ masqué pour chaque valeur (case à cocher) avec les valeurs «Y» et «N», puis j'utilise des cases à cocher uniquement à des fins visuelles. représentation, et utilisez la fonction JavaScript simple check () pour définir la valeur de if selon la sélection.
utiliser un écouteur JavaScript onclick et appeler la fonction check () pour chaque case à cocher sur ma page Web:
De cette façon, les valeurs «Y» ou «N» sont toujours envoyées au script côté serveur, il sait quels sont les champs qui doivent être mis à jour et il n'est pas nécessaire de convertir la valeur checbox «on» en «Y» ou la case à cocher non reçue en «N '.
REMARQUE: un espace blanc ou une nouvelle ligne est également un frère donc ici j'ai besoin de .previousSibling.previousSibling.value. S'il n'y a pas d'espace entre alors seulement .previousSibling.value
Vous n'avez pas besoin d'ajouter explicitement l'écouteur onclick comme auparavant, vous pouvez utiliser la bibliothèque jQuery pour ajouter dynamiquement l'écouteur click avec fonction pour changer la valeur de toutes les cases à cocher de votre page:
la source
Toutes les réponses sont excellentes, mais si vous avez plusieurs cases à cocher dans un formulaire du même nom et que vous souhaitez publier le statut de chaque case à cocher. Ensuite, j'ai résolu ce problème en plaçant un champ caché avec la case à cocher (nom lié à ce que je veux).
puis contrôlez le changement d'état de la case à cocher en dessous du code jquery:
Désormais, en cas de modification d'une case à cocher, la valeur du champ masqué associé sera modifiée. Et sur le serveur, vous ne pouvez regarder que les champs cachés au lieu des cases à cocher.
J'espère que cela aidera quelqu'un à avoir ce type de problème. bravo :)
la source
Le problème avec les cases à cocher est que si elles ne sont pas cochées, elles ne sont pas publiées avec votre formulaire. Si vous cochez une case et publiez un formulaire, vous obtiendrez la valeur de la case à cocher dans la variable $ _POST que vous pouvez utiliser pour traiter un formulaire, si elle n'est pas cochée, aucune valeur ne sera ajoutée à la variable $ _POST.
En PHP, vous contourneriez normalement ce problème en effectuant une vérification isset () sur votre élément de case à cocher. Si l'élément que vous attendez n'est pas défini dans la variable $ _POST, nous savons que la case n'est pas cochée et la valeur peut être fausse.
Mais si vous avez créé un formulaire dynamique, vous ne connaîtrez pas toujours l'attribut name de vos cases à cocher, si vous ne connaissez pas le nom de la case à cocher, vous ne pouvez pas utiliser la fonction isset pour vérifier si cela a été envoyé avec la variable $ _POST.
la source
la source
Il existe une meilleure solution de contournement. Tout d'abord, ne fournissez l'attribut de nom qu'aux cases à cocher qui sont cochées. Ensuite, en cliquant
submit
, à travers un JavaScript,function
vous cochez toutes les cases non cochées. Ainsi, lorsque voussubmit
seuls ceux-ci seront récupérés chezform collection
ceux qui ont desname
biens.Avantage: pas besoin de créer de boîtes cachées supplémentaires et de les manipuler.
la source
@cpburnz a bien fait mais avec beaucoup de code, voici la même idée en utilisant moins de code:
JS:
HTML (notez le nom du champ en utilisant un nom de tableau):
Et pour PHP:
la source
Version jQuery de la réponse de @ vishnu.
Si vous utilisez jQuery 1.5 ou une version antérieure, veuillez utiliser la fonction .attr () au lieu de .prop ()
la source
Cette solution est inspirée de celle de @ desw.
Si vos noms d'entrée sont en "style de formulaire", vous perdrez l'association d'index de tableau avec vos valeurs de chekbox dès qu'une chekbox est vérifiée, incrémentant cette "dissociation" d'une unité à chaque fois qu'une chekbox est vérifiée. Cela peut être le cas d'un formulaire pour insérer quelque chose comme des employés composé de certains champs, par exemple:
Si vous insérez trois employés à la fois et que le premier et le second sont uniques, vous vous retrouverez avec un élément à 5 éléments
isSingle
tableau à , de sorte que vous ne pourrez pas parcourir à la fois les trois tableaux afin, par exemple, , insérez les employés dans une base de données.Vous pouvez surmonter cela avec un post-traitement de tableau simple. J'utilise PHP côté serveur et je l'ai fait:
la source
Cette solution est donc exagérée pour cette question, mais elle m'a aidé lorsque j'ai eu la même case à cocher qui s'est produite plusieurs fois pour différentes lignes d'un tableau. Je devais connaître la ligne représentée par la case à cocher et connaître également l'état de la case à cocher (cochée / décochée).
Ce que j'ai fait était de retirer l'attribut name de mes entrées de case à cocher, de leur donner la même classe et de créer une entrée cachée qui contiendrait l'équivalent JSON des données.
HTML
Javascript pour exécuter le formulaire soumettre
La chaîne json sera transmise avec le formulaire sous la forme $ _POST ["has-permissions-values"]. En PHP, décodez la chaîne en un tableau et vous aurez un tableau associatif qui a chaque ligne et la valeur vrai / faux pour chaque case à cocher correspondante. Il est alors très facile de parcourir et de comparer les valeurs actuelles de la base de données.
la source