Post unchecked HTML checkboxes

j'ai une charge de cases à cocher qui sont vérifiées par défaut. Mes utilisateurs vont probablement décocher quelques-unes (s'il y en a) des cases à cocher et laisser le reste coché.

y a-t-il un moyen pour que le formulaire affiche les cases à cocher Non cochées, plutôt que celles où sont cochées?

244
demandé sur Wouter 2009-11-27 18:56:29

30 réponses

ajouter une entrée cachée pour la case à cocher avec un ID différent:

<input id='testName' type='checkbox' value='Yes' name='testName'>
<input id='testNameHidden' type='hidden' value='No' name='testName'>

avant de soumettre le formulaire, désactiver l'entrée cachée basée sur la condition vérifiée:

if(document.getElementById("testName").checked) {
    document.getElementById('testNameHidden').disabled = true;
}
175
répondu vishnu 2015-08-15 10:11:34

la solution que j'ai le plus aimé 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 telle sorte que si la case à cocher n'est pas cochée, l'entrée cachée est toujours réussie et envoyée au serveur, mais si la case à cocher est cochée, il supplantera l'entrée cachée avant elle. De cette façon, vous n'avez pas à garder la trace des valeurs dans les données postées étaient censés venir des cases à cocher.

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>
396
répondu Sam 2010-01-02 20:35:42

Je l'ai résolu en utilisant simple (native) javascript:

<input type="hidden" name="checkboxName" value="0"><input type="checkbox" onclick="this.previousSibling.value=1-this.previousSibling.value">

attention à ne pas avoir d'espaces ou de linebreaks entre ces deux éléments d'entrée!

vous pouvez utiliser ceci.previousSibling.previousSibling pour obtenir "supérieure" éléments.

avec PHP vous pouvez vérifier le champ caché nommé pour 0 (non défini) ou 1 (défini).

35
répondu Marcel Ennix 2014-11-25 14:22:09

une technique courante est de transporter une variable cachée avec chaque case à cocher.

<input type="checkbox" name="mycheckbox" />
<input type="hidden" name="mycheckbox.hidden"/>

du côté du 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 correspondante est soumise sous forme de données ou non.

l'algorithme côté serveur ressemblerait probablement à:

for input in form data such that input.name endswith .hidden
  checkboxName = input.name.rstrip('.hidden')
  if chceckbName is not in form, user has unchecked this checkbox

ce qui précède ne répond pas exactement à la question, mais offre un autre moyen d'atteindre une fonctionnalité similaire.

17
répondu Shailesh Kumar 2009-11-27 16:31:23

Mon favori personnel 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 facile qu'il y paraît.

si vous ajoutez ce code:

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

le navigateur ne se souciera pas vraiment de ce que vous faites ici. Le navigateur va envoyer deux paramètres pour le serveur, et le serveur doit décider quoi faire avec eux.

PHP prend par exemple la dernière valeur comme celui à utiliser (voir: position faisant autorité de dupliquer les clés de requête HTTP )

mais d'autres systèmes avec lesquels j'ai travaillé (basé sur Java) le font de la même manière - ils ne vous offrent que la première valeur. .NET vous donnera plutôt un tableau avec les deux éléments à la place

je vais essayer de le tester avec node.js, Python et Perl à l'occasion.

16
répondu SimonSimCity 2017-05-23 12:26:25

vous n'avez pas besoin de créer un champ caché pour toutes les cases à cocher, copiez simplement mon code. il modifiera la valeur de la case à cocher si elle n'est pas cochée le value assignera 0 et si la case à cocher cochée alors assignera value en 1

$("form").submit(function () {

    var this_master = $(this);

    this_master.find('input[type="checkbox"]').each( function () {
        var checkbox_this = $(this);


        if( checkbox_this.is(":checked") == true ) {
            checkbox_this.attr('value','1');
        } else {
            checkbox_this.prop('checked',true);
            //DONT' ITS JUST CHECK THE CHECKBOX TO SUBMIT FORM DATA    
            checkbox_this.attr('value','0');
        }
    })
})
16
répondu Rameez SOOMRO 2013-12-13 16:15:02

vous pouvez faire du Javascript dans l'événement soumettre du formulaire. C'est tout ce que vous pouvez faire cependant, il n'y a aucun moyen d'obtenir des navigateurs pour le faire par eux-mêmes. Cela signifie également que votre formulaire sera cassé pour les utilisateurs sans Javascript. Mieux est de savoir sur le serveur quelles cases à cocher il y a, de sorte que vous pouvez en déduire que celles qui sont absentes des valeurs de formulaire postées ( $_POST en PHP) ne sont pas vérifiées.

9
répondu Bart van Heukelom 2009-11-27 15:59:52

je ferais ce qui suit.

avoir mon champ d'entrée caché avec le même nom avec la case à cocher

<input type="hidden" name="checkbox_name[]" value="0" />
<input type="checkbox" name="checkbox_name[]" value="1" />

et puis quand je poste I Tout d'abord supprimer les valeurs dupliquées ramassées dans le tableau $_POST, atfer qui affiche chacune des valeurs uniques.

  $posted = array_unique($_POST['checkbox_name']);
  foreach($posted as $value){
    print $value;
  }

j'ai eu ça d'un post supprimer les valeurs dupliquées du tableau

9
répondu desw 2017-05-23 12:18:19
$('input[type=checkbox]').on("change",function(){
    var target = $(this).parent().find('input[type=hidden]').val();
    if(target == 0)
    {
        target = 1;
    }
    else
    {
        target = 0;
    }
    $(this).parent().find('input[type=hidden]').val(target);
});

<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>

si vous omettez le nom de la case à cocher il ne sera pas passé. Seulement le tableau test_checkbox.

9
répondu Jeremy 2016-09-28 10:54:21

"je suis allé avec le serveur. Semble bien fonctionner - grâce. – reach4thelasers Dec 1 '09 à 15:19" je tiens à recommander à partir de la propriétaire. Comme indiqué: la solution javascript dépend de la façon dont le gestionnaire de serveur (Je ne l'ai pas vérifié)

tel que

if(!isset($_POST["checkbox"]) or empty($_POST["checkbox"])) $_POST["checkbox"]="something";
6
répondu N Zhang 2016-01-28 13:48:07

J'ai d'abord essayé la version de Sam. Bonne idée, mais il provoque là pour être plusieurs éléments dans la forme avec le même nom. Si vous utilisez javascript qui trouve des éléments basés sur le nom, il retournera maintenant un tableau d'éléments.

j'ai travaillé sur L'idée de Shailesh en PHP, ça marche pour moi. Voici mon code:

/* Delete '.hidden' fields if the original is present, use '.hidden' value if not. */
foreach ($_POST['frmmain'] as $field_name => $value)
{
    // Only look at elements ending with '.hidden'
    if ( !substr($field_name, -strlen('.hidden')) ) {
        break;
    }

    // get the name without '.hidden'
    $real_name = substr($key, strlen($field_name) - strlen('.hidden'));

    // Create a 'fake' original field with the value in '.hidden' if an original does not exist
    if ( !array_key_exists( $real_name, $POST_copy ) ) {
        $_POST[$real_name] = $value;
    }

    // Delete the '.hidden' element
    unset($_POST[$field_name]);
}
5
répondu Wouter 2011-03-08 14:41:08

la plupart des réponses ici nécessitent L'utilisation de JavaScript ou des contrôles d'entrée en double. Parfois, cela doit être géré entièrement sur le 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 la présentation du formulaire.

pour interpréter et manipuler avec succès des valeurs non vérifiées pour les cases à cocher, vous devez avoir la connaissance de ce qui suit:

  1. les noms des cases à cocher
  2. Le nom du formulaire de soumission de l'élément d'entrée

en vérifiant si le formulaire a été soumis (une valeur est attribuée à l'élément d'entrée de la présentation), toute valeur de case à cocher non cochée peut être présumé .

par exemple:

<form name="form" method="post">
  <input name="value1" type="checkbox" value="1">Checkbox One<br/>
  <input name="value2" type="checkbox" value="1" checked="checked">Checkbox Two<br/>
  <input name="value3" type="checkbox" value="1">Checkbox Three<br/>
  <input name="submit" type="submit" value="Submit">
</form>

en utilisant PHP, il est assez trivial de détecter les cases à cocher qui ont été cochées.

<?php

$checkboxNames = array('value1', 'value2', 'value3');

// Persisted (previous) checkbox state may be loaded 
// from storage, such as the user's session or a database.
$checkboxesThatAreChecked = array(); 

// Only process if the form was actually submitted.
// This provides an opportunity to update the user's 
// session data, or to persist the new state of the data.

if (!empty($_POST['submit'])) {
    foreach ($checkboxNames as $checkboxName) {
        if (!empty($_POST[$checkboxName])) {
            $checkboxesThatAreChecked[] = $checkboxName;
        }
    }
    // The new state of the checkboxes can be persisted 
    // in session or database by inspecting the values 
    // in $checkboxesThatAreChecked.
    print_r($checkboxesThatAreChecked);
}

?>

les données initiales peuvent être chargées sur chaque page chargée, mais ne doivent être modifiées que si le formulaire a été soumis. Comme les noms des cases à cocher sont connus à l'avance, elles peuvent être parcourues et inspectées individuellement, de sorte que l'absence de leurs valeurs individuelles indique qu'elles ne sont pas vérifiées.

5
répondu Werner 2015-04-14 07:56:14

j'utilise ce bloc de jQuery, qui ajoutera une entrée cachée à l'Heure de soumission à chaque case à cocher non cochée. Il vous garantira que vous obtenez toujours une valeur soumise pour chaque case à cocher, à chaque fois, sans encombrer votre balisage et au risque d'oublier de le faire sur une case à cocher que vous ajoutez plus tard. C'est aussi agnostique à n'importe quelle pile de backend (PHP, Ruby, etc.) vous êtes en utilisant.

// Add an event listener on #form's submit action...
$("#form").submit(
    function() {

        // For each unchecked checkbox on the form...
        $(this).find($("input:checkbox:not(:checked)")).each(

            // Create a hidden field with the same name as the checkbox and a value of 0
            // You could just as easily use "off", "false", or whatever you want to get
            // when the checkbox is empty.
            function(index) {
                var input = $('<input />');
                input.attr('type', 'hidden');
                input.attr('name', $(this).attr("name")); // Same name as the checkbox
                input.attr('value', "0"); // or 'off', 'false', 'no', whatever

                // append it to the form the checkbox is in just as it's being submitted
                var form = $(this)[0].form;
                $(form).append(input);

            }   // end function inside each()
        );      // end each() argument list

        return true;    // Don't abort the form submit

    }   // end function inside submit()
);      // end submit() argument list
5
répondu Matt Holden 2016-04-17 15:10:38

Vous pouvez également intercepter le formulaire.soumettre l'événement et le contrôle inversé avant de soumettre

$('form').submit(function(event){
    $('input[type=checkbox]').prop('checked', function(index, value){
        return !value;
    });
});
4
répondu Jimchao 2012-12-04 17:08:05

je vois que cette question Est vieille et a tellement de réponses, mais je vais donner mon penny de toute façon. Mon vote est pour la solution javascript sur l'événement 'submit' du formulaire, comme certains l'ont souligné. Pas de doublage des entrées (surtout si vous avez de longs noms et attributs avec du code php mélangé avec du html), Pas de problème du côté du 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 vérifiés, leur assigner une valeur 0 (ou tout ce dont vous avez besoin pour indiquer un "non" coché 'status) et ensuite changer leur attribut 'coché' en true

    $('form').submit(function(e){
    var b = $("input:checkbox:not(:checked)");
    $(b).each(function () {
        $(this).val(0); //Set whatever value you need for 'not checked'
        $(this).attr("checked", true);
    });
    return true;
});

de cette façon, vous aurez un tableau $_POST comme ceci:

Array
(
            [field1] => 1
            [field2] => 0
)
4
répondu MarcoSpada 2016-02-28 23:38:20
$('form').submit(function () {
    $(this).find('input[type="checkbox"]').each( function () {
        var checkbox = $(this);
        if( checkbox.is(':checked')) {
            checkbox.attr('value','1');
        } else {
            checkbox.after().append(checkbox.clone().attr({type:'hidden', value:0}));
            checkbox.prop('disabled', true);
        }
    })
});
4
répondu Sajjad Shirazy 2016-08-25 05:53:04

j'aime aussi la solution que vous venez de poster un champ d'entrée supplémentaire, en utilisant JavaScript semble un peu hacky pour moi.

dépend de ce que vous utilisez pour vous backend dépendra de ce que l'entrée va en premier.

pour un serveur backend où la première occurrence est utilisée (JSP), vous devez faire ce qui suit.

  <input type="checkbox" value="1" name="checkbox_1"/>
  <input type="hidden" value="0" name="checkbox_1"/>



Pour un serveur d'arrière-plan où la dernière occurrence est utilisée (PHP,Rails) vous devez effectuer les opérations suivantes.

  <input type="hidden" value="0" name="checkbox_1"/>
  <input type="checkbox" value="1" name="checkbox_1"/>



pour un serveur d'arrière-plan où toutes les occurrences sont stockées dans un type de données de liste( [] , array ). (Python / Zope)

vous pouvez poster dans quel ordre vous voulez, vous avez juste besoin d'essayer d'obtenir la valeur de l'entrée avec l'attribut de type checkbox . Donc le premier index de la liste si la case à cocher était avant l'élément caché et le dernier index si la case était après l'élément masqué.



Pour un serveur d'arrière-plan où toutes les occurrences sont concaténées avec une virgule (ASP.NET / IIS) Vous aurez besoin de (split/explode) la chaîne en utilisant une virgule comme un délimiteur pour créer un type de liste de données. ( [] )

Maintenant, vous pouvez essayer d'attraper le premier index de la liste que si la case était avant l'élément masqué et de saisir le dernier indice si la case était après l'élément masqué.

Backend parameter handling

image source

3
répondu TarranJones 2016-01-04 16:54:55

Ce que j'ai fait était un peu différent. J'ai d'abord changé les valeurs de toutes les cases à cocher non vérifiées. À "0", puis les a tous sélectionnés, de sorte que la valeur serait soumise.

function checkboxvalues(){
  $("#checkbox-container input:checkbox").each(function({ 
    if($(this).prop("checked")!=true){
      $(this).val("0");
      $(this).prop("checked", true);
    }
  });
}
2
répondu Seborreia 2015-04-21 02:14:21

je préfère rassembler les $_POST

if (!$_POST['checkboxname']) !$_POST['checkboxname'] = 0;

c'esprits, si le POSTE n'ont pas l' 'checkboxname'value, il a été unckecked donc, assigner une valeur.

vous pouvez créer un tableau de vos valeurs ckeckbox et créer une fonction qui vérifient si les valeurs existent, si ce n'est pas le cas, les esprits qui ne sont pas contrôlés et vous pouvez marquer une valeur

2
répondu Felipe Gonzalez 2015-08-23 19:51:59

exemple sur les actions Ajax est ( ': coché') utilisé jQuery au lieu de .val();

            var params = {
                books: $('input#users').is(':checked'),
                news : $('input#news').is(':checked'),
                magazine : $('input#magazine').is(':checked')
            };

params obtiendra la valeur en vrai ou faux..

1
répondu Mehmet Ali Uysal 2014-02-25 08:02:44
Les cases à cocher

représentent généralement des données binaires stockées dans la base de données sous forme de valeurs Yes/No, Y/N ou 1/0. Les cases à cocher HTML ont une mauvaise nature pour envoyer de la valeur au serveur seulement si la case à cocher 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 d'être en mesure de stocker des valeurs positives (vérifiées) ou négatives (non vérifiées). En fait, seules les valeurs négatives posent problème (lorsque l'utilisateur ne vérifie pas la valeur précédemment (pré -) vérifiée-comment peut-il le serveur sait cela quand 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 le script de mise à jour, il y a un problème parce que vous ne savez pas quelles cases à cocher doivent être reçues afin de définir la valeur Y pour celles qui sont vérifiées et la valeur N pour celles qui ne le sont pas.

puisque je stocke les valeurs 'Y' et 'N' dans ma base de données et les représente via des cases à cocher vérifiées et non vérifiées sur la page, j'ai ajouté le champ caché pour chaque valeur (case à cocher) avec les valeurs " Y " et "N", utilisez des cases à cocher uniquement pour la représentation visuelle, et utilisez la fonction JavaScript simple check () pour définir la valeur de if selon la sélection.

<input type="hidden" id="N1" name="N1" value="Y" />
<input type="checkbox"<?php if($N1==='Y') echo ' checked="checked"'; ?> onclick="check(this);" />
<label for="N1">Checkbox #1</label>

utilisez un JavaScript onclick listener et call function check () pour chaque checkboxe sur ma page web:

function check(me)
{
  if(me.checked)
  {
    me.previousSibling.previousSibling.value='Y';
  }
  else
  {
    me.previousSibling.previousSibling.value='N';
  }
}

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'y a pas besoin de conversion de la valeur "on" de la boîte de contrôle en 'Y' ou non reçu de la boîte de contrôle en 'N'.

NOTE: l'espace blanc ou la nouvelle ligne est aussi un frère donc ici j'ai besoin .previousSibling.previousSibling.valeur. Si il n'y a pas d'espace entre les alors que .previousSibling.valeur


vous n'avez pas besoin d'ajouter explicitement onclick listener comme avant, vous pouvez utiliser la bibliothèque jQuery pour ajouter dynamiquement click listener avec une fonction pour changer la valeur à tous cases à cocher dans votre page:

$('input[type=checkbox]').click(function()
{
  if(this.checked)
  {
    $(this).prev().val('Y');
  }
  else
  {
    $(this).prev().val('N');
  }
});
1
répondu sbrbot 2014-09-15 18:09:12

le problème avec les cases à cocher est que si elles ne sont pas vérifiées, elles ne sont pas postées avec votre formulaire. Si vous cochez une case et que vous postez un formulaire, vous obtiendrez la valeur de la case 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 cochant l'élément de votre case à cocher isset (). Si l'élément que vous attendez n'est pas défini dans la La variable $_POST alors nous savons que la case à cocher n'est pas cochée et que la valeur peut être fausse.

if(!isset($_POST['checkbox1']))
{
     $checkboxValue = false;
} else {
     $checkboxValue = $_POST['checkbox1'];
}

mais si vous avez créé une forme dynamique alors vous ne connaîtrez pas toujours l'attribut name de vos cases à cocher, si vous ne connaissez pas le nom de la case à cocher alors vous ne pouvez pas utiliser la fonction isset pour vérifier si celle-ci a été envoyée avec la variable $_POST.

1
répondu Daniel Galecki 2016-01-26 15:59:50

cela ne peut être accompli qu'avec du javascript, car les cases à cocher non vérifiées ne sont pas transmises. Vous avez donc besoin de javascript qui, par exemple, ajoute des champs cachés dans les coulisses en décochant une case à cocher. Sans javascript, cela n'aurait pas été possible.

0
répondu RSeidelsohn 2009-11-27 16:04:42

il y a une meilleure solution. Tout d'abord, fournir le nom de l'attribut uniquement les cases qui sont cochées. Ensuite, sur le clic submit , par le biais D'un JavaScript function vous cochez toutes les cases non vérifiées . Donc, quand vous submit seulement ceux qui seront récupérés dans form collection ceux qui ont name propriété.

  //removing name attribute from all checked checkboxes
                  var a = $('input:checkbox:checked');
                   $(a).each(function () {
                       $(this).removeAttr("name");        
                   });

   // checking all unchecked checkboxes
                   var b = $("input:checkbox:not(:checked)");
                   $(b).each(function () {
                       $(this).attr("checked", true);
                   });

avantage: Pas besoin de créer des boîtes cachées supplémentaires,et de les manipuler.

0
répondu Gyanesh Gouraw 2014-09-30 09:33:19

@cpburnz a raison mais pour beaucoup de code, Voici la même idée en utilisant moins de code:

JS:

// jQuery OnLoad
$(function(){
    // Listen to input type checkbox on change event
    $("input[type=checkbox]").change(function(){
        $(this).parent().find('input[type=hidden]').val((this.checked)?1:0);
    });
});

HTML (notez le nom du champ en utilisant un nom de tableau)):

<div>
    <input type="checkbox" checked="checked">
    <input type="hidden" name="field_name[34]" value="1"/>
</div>
<div>
    <input type="checkbox">
    <input type="hidden" name="field_name[35]" value="0"/>
</div>
<div>

et pour PHP:

<div>
    <input type="checkbox"<?=($boolean)?' checked="checked"':''?>>
    <input type="hidden" name="field_name[<?=$item_id?>]" value="<?=($boolean)?1:0?>"/>
</div>
0
répondu Rodrigo Polo 2014-10-22 10:58:41

version jQuery de la réponse de @vishnu.

if($('#testName').is(":checked")){
    $('#testNameHidden').prop('disabled', true);
}

si vous utilisez jQuery 1.5 ou inférieur, veuillez utiliser le .attr() à la place de .prop ()

0
répondu 0x1ad2 2014-10-23 19:10:31

cette solution s'inspire de celle de @desw.

si vos noms d'entrée sont dans le" style de forme", vous perdrez l'association d'index de tableau avec vos valeurs de chekbox dès qu'une chekbox est cochée, augmentant cette" dissociation " par une unité chaque fois qu'une chekbox est cochée. Cela peut être le cas d'un formulaire pour insérer quelque chose comme employés composée par certains domaines, par exemple:

<input type="text" name="employee[]" />
<input type="hidden" name="isSingle[] value="no" />
<input type="checkbox" name="isSingle[] value="yes" />

dans le cas où vous insérez trois employés à la fois et la première et la seconde sont simples, vous finirez avec un tableau de 5 éléments isSingle , de sorte que vous ne pourrez pas itérer à la fois à travers les trois tableaux afin, par exemple, d'insérer des employés dans une base de données.

vous pouvez surmonter cela avec un certain postprocessing tableau facile. J'utilise PHP côté serveur et j'ai fait ceci:

$j = 0;
$areSingles = $_POST['isSingle'];
foreach($areSingles as $isSingle){
  if($isSingle=='yes'){
    unset($areSingles[$j-1]);
  }
  $j++;
}
$areSingles = array_values($areSingles);
0
répondu Pere 2015-01-20 17:25:11

donc cette solution est exagérée pour cette question, mais elle m'a aidé quand j'ai eu la même case à cocher qui s'est produite plusieurs fois pour différentes rangées dans un tableau. J'ai besoin de savoir la ligne de la case représentés et de connaître l'état de la case (cochée/non cochée).

ce que j'ai fait était de retirer l'attribut de nom de mes entrées de case à cocher, leur donner à tous la même classe, et créer une entrée cachée qui tiendrait l'équivalent JSON des données.

HTML

 <table id="permissions-table">
    <tr>
	<td>
	    <input type="checkbox" class="has-permission-cb" value="Jim">
	    <input type="checkbox" class="has-permission-cb" value="Bob">
	    <input type="checkbox" class="has-permission-cb" value="Suzy">
	</td>
    </tr>
 </table>
 <input type="hidden" id="has-permissions-values" name="has-permissions-values" value="">

Javascript à exécuter sur le formulaire de soumission

var perms = {};
$(".has-permission-checkbox").each(function(){
  var userName = this.value;
  var val = ($(this).prop("checked")) ? 1 : 0
  perms[userName] = {"hasPermission" : val};
});
$("#has-permissions-values").val(JSON.stringify(perms));

La chaîne json sera adopté par le formulaire $_POST["a-autorisations-valeurs"]. En PHP, décodez la chaîne dans un tableau et vous aurez un tableau associatif qui a chaque ligne et la valeur true/false pour chaque case à cocher correspondante. Il est alors très facile à parcourir et à comparer aux valeurs actuelles de la base de données.

0
répondu Tmac 2015-02-18 21:58:52

toutes les réponses sont bonnes, mais si vous avez plusieurs cases à cocher dans un formulaire avec le même nom et vous voulez afficher le statut de chaque case à cocher. Alors j'ai résolu ce problème en plaçant un champ caché avec la case à cocher (nom lié à ce que je veux).

<input type="hidden" class="checkbox_handler" name="is_admin[]" value="0" />
<input type="checkbox" name="is_admin_ck[]" value="1" />

contrôle alors le statut de changement de case à cocher par le code ci-dessous jquery:

$(documen).on("change", "input[type='checkbox']", function() {
    var checkbox_val = ( this.checked ) ? 1 : 0;
    $(this).siblings('input.checkbox_handler').val(checkbox_val);
});

maintenant sur le changement de n'importe quelle case à cocher, il changera la valeur du champ caché lié. Et sur serveur vous pouvez regarder seulement aux champs cachés au lieu des cases à cocher.

J'espère que cela aidera quelqu'un à avoir ce type de problème. cheer :)

0
répondu Imran Khan 2015-05-21 05:02:57

Vous pouvez ajouter des éléments cachés avant de soumettre le formulaire.

$('form').submit(function() {
  $(this).find('input[type=checkbox]').each(function (i, el) {
    if(!el.checked) {
      var hidden_el = $(el).clone();
      hidden_el[0].checked = true;
      hidden_el[0].value = '0';
      hidden_el[0].type = 'hidden'
      hidden_el.insertAfter($(el));
    }
  })
});
0
répondu SergA 2015-07-23 13:57:23