2011-11-02 3 views
12

Problemi con i miei array POST per mostrare tutti i valori della casella di controllo dal mio modulo.Gli array POST non mostrano caselle di controllo deselezionate

Ho una forma impostata come segue:

<form name='foo' method='post' action=''> 
    <table> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
    </table> 
</form> 

Ho un pulsante in basso legato ad una funzione jQuery che aggiunge 5 più righe vuote alla forma (quindi le matrici per il nome dell'ingresso cBox []).

Ora, il problema. Diciamo che la prima casella è deselezionata e gli ultimi 2 sono spuntati. Quando uscita I valori (utilizzando print_r PHP per il debug), I otterrà:

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

Per qualche ragione, la matrice non contiene alcun valore per caselle incontrollato.

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)?

+0

sembra abbastanza semplice .. Io ci provo :) grazie – SpaghettiMonster

+0

sfortunatamente non riesco ancora a ottenere i valori non controllati. grazie però – SpaghettiMonster

+0

Mi sono reso conto che il mio commento precedente era motivato da una comprensione totalmente sbagliata della tua domanda da parte mia. Ho aggiunto una risposta corretta qui sotto. – Jon

risposta

16

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

Se ci si trova in una situazione in cui è necessario inviare un numero esatto di elementi come matrice, perché non si fa la stessa cosa che si fa quando c'è un id di qualche tipo associato a ogni checkbox? Basta inserire il nome della chiave array PHP come parte del nome dell'elemento <input>:

<tr> 
                 <!-- NOTE [0] ---> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[0]'/></td> 
    </tr> 
    <tr> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[1]'/></td> 
    </tr> 
    <tr> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[2]'/></td> 
    </tr> 

Che lascia ancora con il problema che le caselle controllate, ancora non essere presente nella matrice. Questo può o non può essere un problema. Per uno, si può davvero non importa:

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

Anche se si fa attenzione, si può facilmente risolvere il problema. Due approcci semplici qui. Uno, basta fare il nascosto elemento input trucco:

<tr> 
     <td class='bla'> 
     <input type="hidden" name="cBox[0]" value="" /> 
     Checkbox: <input type='checkbox' name='cBox[0]'/> 
     </td> 
    </tr> 
    <tr> 
     <td class='bla'> 
     <input type="hidden" name="cBox[1]" value="" /> 
     Checkbox: <input type='checkbox' name='cBox[1]'/> 
     </td> 
    </tr> 

E due, che trovo preferibile, riempire gli spazi vuoti da PHP invece:

// 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); 

See it in action.

+0

Grazie Jon. Esaminerò questa soluzione La mia unica preoccupazione sono i nomi univoci. Ho un numero sconosciuto di input quando vengono aggiunti con jquery .clone(). Inoltre, il tuo link non funziona, puoi usare un abbreviazione URL? – SpaghettiMonster

+1

@SpaghettiMonster: collegamento corretto (copia incolla fallita). Anche se clonando, puoi concatenare un paio di metodi jQuery aggiuntivi per impostare il nome dopo che il clone è stato creato. – Jon

+0

Grazie Jon. Ho aggiunto qualche riga in più di jQuery per contare il numero di righe esistenti e usarlo per incrementare le posizioni dell'array, e ho usato il tuo codice sopra. Funziona perfettamente al 100%! :) – SpaghettiMonster

2

Prova

<input type='checkbox' value="XXX" name='cBox[]'/> 
<input type='checkbox' value="YYY" name='cBox[]'/> 
<input type='checkbox' value="ZZZ" name='cBox[]'/> 

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

+0

Ho provato questo, e il risultato che ottengo è: Array ([0] => YYY [1] => ZZZ). Sfortunatamente non posso dare a ciascun input valori univoci in quanto possono essere aggiunti dinamicamente tramite la funzione jquery di cui ho parlato. – SpaghettiMonster

+1

Bene, quindi sostituire YYY, ZZZ con i valori necessari. Quindi controlla, se $ _POST ['cBox'] (che è un array) contiene i valori necessari. –

0

Provare a impostare un valore per ogni casella di controllo, di 1 o vero.

<input type='checkbox' value='1' name='cBox[1]'/> 

forse perché non invia nulla?

4

ONE TRICK deve sostituire il valore della casella di controllo, se selezionato. altrimenti il ​​suo valore sarà 0.

<form> 
    <input type='hidden' value='0' name="smth"> 
    <input type='checkbox' value='1' name="smth"> 
</form> 
+0

Anche se la tua logica è vera, questo non risponde alla domanda, perché se hai un array allora foreach con la coppia di chiavi non sarà corretto. –

1

Se si sta gestendo serie casella di controllo dinamico, si può provare questo:

HTML:

<label> 
    <input type="hidden" name="cBox[]" value="" /> 
    <input type="checkbox" class="checkbox" value="on" /> 
</label> 
<label> 
    <input type="hidden" name="cBox[]" value="" /> 
    <input type="checkbox" class="checkbox" value="on" /> 
</label> 
<!-- extend --> 

Javascript (jQuery):

$(document).on("change", "input.checkbox", function() { 

    var value = $(this).is(":checked") ? $(this).val() : null; 

    $(this).siblings("input[name='cBox[]']").val(value);  
}); 

risultato Backend (Se solo controllato 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, è possibile eseguire il rendering di ciascuna coppia di ingressi, assegnando il valore in caselle di input e contrassegni nascosti come checked.

+0

Aiuta davvero tutto .. Grazie !! –

+0

Felice di sentirlo :) –