Gli array POST non mostrano caselle di controllo deselezionate

Non riesco a ottenere i miei array POST per mostrare tutti i valori della casella di controllo dal mio modulo.

Ho un modulo configurato come segue:

Checkbox:
Checkbox:
Checkbox:

Ho un pulsante in basso associato a una funzione jquery che aggiunge altre 5 righe vuote al modulo (da cui gli array per il nome di input cBox []).

Ora, il problema Diciamo che la prima casella è deselezionata e gli ultimi 2 sono spuntati. Quando esco i valori (usando PHP print_r per il debug), otterrò:

 Array ( [0] => on [1] => on) 

Per qualche motivo, la matrice non contiene alcun valore per le caselle di controllo deselezionate.

Ho visto alcune soluzioni in cui una variabile nascosta viene passata con ogni checkbox, ma questa soluzione può essere implementata nella mia situazione (usando gli array)?

Questo comportamento non è sorprendente, in quanto il browser non invia alcun valore per le caselle di controllo che non sono selezionate.

Se ti trovi in ​​una situazione in cui devi inviare un numero esatto di elementi come array, perché non fai la stessa cosa che fai quando c’è un id di qualche tipo associato a ogni checkbox? Basta includere il nome della chiave dell’array PHP come parte del nome dell’elemento :

    Checkbox:    Checkbox:    Checkbox:   

Ciò ti lascia ancora il problema che le caselle deselezionate non saranno ancora presenti nell’array. Questo può o non può essere un problema. Per uno, potrebbe davvero non interessa:

 foreach($incoming as $key => $value) { // if the first $key is 1, do you care that you will never see 0? } 

Anche se ti interessa, puoi facilmente risolvere il problema. Due approcci semplici qui. Uno, basta fare il trucco dell’elemento di input nascosto:

     Checkbox:       Checkbox:    

E due, che trovo preferibili, riempiono invece gli spazi vuoti da PHP:

 // assume this is what comes in: $input = array( '1' => 'foo', '3' => 'bar', ); // set defaults: array with keys 0-4 all set to empty string $defaults = array_fill(0, 5, ''); $input = $input + $defaults; print_r($input); // If you also want order, sort: ksort($input); print_r($input); 

Guardalo in azione .

ONE TRICK sta per sovrascrivere il valore della casella di controllo, se selezionato. altrimenti il ​​suo valore sarà 0.

 

Provare

    

Le caselle di controllo funzionano in questo modo. Se è selezionato, solo allora il valore viene registrato.

Se stai gestendo array checkbox dinamici, puoi provare questo:

HTML:

    

Javascript (jQuery):

 $(document).on("change", "input.checkbox", function() { var value = $(this).is(":checked") ? $(this).val() : null; $(this).siblings("input[name='cBox[]']").val(value); }); 

Risultato back-end (se è stato selezionato solo il secondo):

 // PHP $_POST['cBox'] Array ( [0] => [1] => on ) 

In questo strumento, le caselle di controllo vengono utilizzate per controllare ciascun input nascosto in un gruppo.

Per visualizzare la pagina, è ansible eseguire il rendering di ciascuna coppia di ingressi, assegnando il valore in input nascosti e contrassegnando le caselle di checked come checked .

Prova a impostare un valore per ogni casella di controllo, di 1 o true.

  

questo potrebbe essere il motivo per cui non invia nulla?

Nel controller:

request()->merge(['cBox' => request()->input('cBox', [])]);