Come passare un arrays di valori di checkbox selezionati / non selezionati al generatore di email PHP?

Ho aggiunto una casella di controllo a un module a cui l'utente può aggiungere dynamicmente le righe. Puoi vedere il module qui .

Io uso un arrays per passare i valori di each row a un generatore di email PHP e tutto funziona bene per altri input, ma non riesco a far funzionare la casella di controllo. L'input della casella di controllo attualmente è simile a questo:

<input type="checkbox" name="mailing[]" value="Yes"> 

Poi nel PHP ho questo:

 $mailing = trim(stripslashes($_POST['mailing'][$i])); 

Ma non funziona come previsto, cioè sto vedendo solo "Sì" per la prima casella selezionata, e nulla per le caselle di controllo successive che vengono controllate.

Un ulteriore problema è che vorrei che il valore 'No' fosse generato per le caselle di controllo non selezionate.

Qualcuno potrebbe aiutare con questo?

Grazie,

tacca

Modulo:

 <form method="post" action="bookingenginetest.php"> <p> <input type="checkbox" name="mailing[]" value="Yes"> <label>Full Name:</label> <input type="text" name="name[]"> <label>Email:</label> <input type="text" name="email[]"> <label>Telephone:</label> <input type="text" name="telephone[]"> <span class="remove">Remove</span> </p> <p> <span class="add">Add person</span><br /><br /><input type="submit" name="submit" id="submit" value="Submit" class="submit-button" /> </p> </form> 

Script di clonazione:

 $(document).ready(function() { $(".add").click(function() { var x = $("form > p:first-child").clone(true).insertBefore("form > p:last-child"); x.find('input').each(function() { this.value = ''; }); return false; }); $(".remove").click(function() { $(this).parent().remove(); }); }); 

 $mailing = arrays(); foreach($_POST as $v){ $mailing[] = trim(stripslashes($v)); } 

Per gestire caselle deselezionate, sarebbe meglio impostare each casella di controllo con un valore univoco:

 <input type="checkbox" name="mailing[1]" value="Yes"> <input type="checkbox" name="mailing[2]" value="Yes"> 

o

 <input type="checkbox" name="mailing[a]" value="Yes"> <input type="checkbox" name="mailing[b]" value="Yes"> 

Quindi avere un elenco delle caselle di controllo:

 $boxes = arrays(1,2,3); $mailing = arrays(); $p = arrays_key_exists('mailing',$_POST) ? $_POST['mailing'] : arrays(); foreach($boxes as $v){ if(arrays_key_exists($v,$p)){ $mailing[$v] = trim(stripslashes($p[$v])); }else{ $mailing[$v] = 'No'; } } print_r($mailing); 

Puoi anche usarlo con un numero di checkboxes:

 $boxes = 3; $mailing = arrays(); $p = arrays_key_exists('mailing',$_POST) ? $_POST['mailing'] : arrays(); for($v = 0; $v < $boxes; $v++){ if(arrays_key_exists($v,$p)){ $mailing[$v] = trim(stripslashes($p[$v])); }else{ $mailing[$v] = 'No'; } } print_r($mailing); 

Cambia il valore di ciascuna casella di controllo in qualcosa di unico:

 <input type="checkbox" name="mailing[]" value="Yes-1"> <input type="checkbox" name="mailing[]" value="Yes-2"> 

ecc. Per fare ciò dal codice jQuery, aggiungi un'altra row che assegna il valore alla nuova casella di controllo:

 x.find('input:checkbox').each(function() { this.value='Yes-'+n; }); 

Dovrai definire n sul caricamento iniziale della pagina. Supponendo che inizi con una sola "persona", aggiungi appena sopra il tuo $(".add").click handler:

 var n=1; 

E poi:

  • nel tuo $(".add").click gestore di $(".add").click , incrementa il valore di n
  • nel tuo $(".remove").click handler, decrementa il valore di n

Per verificare e deselect entrambi i valori in POST posizionare un field nascosto con esattamente lo stesso nome ma con valore opposto rispetto al valore originale di chkbox tale che in questo caso il valore sarà '0'

 <input type="hidden" name="chk_name[]" value="0" /> <input type="checkbox" name="chk_name[]" value="1"/> <input type="hidden" name="chk_name[]" value="0" /> <input type="checkbox" name="chk_name[]" value="1"/> <?php function getAllChkboxValues($chk_name) { $found = arrays(); //create a new arrays foreach($chk_name as $key => $val) { //echo "KEY::".$key."VALue::".$val."<br>"; if($val == '1') { //replace '1' with the value you want to search $found[] = $key; } } foreach($found as $kev_f => $val_f) { unset($chk_name[$val_f-1]); //unset the index of un-necessary values in arrays } final_arr = arrays(); //create the final arrays return $final_arr = arrays_values($chk_name); //sort the resulting arrays again } $chkox_arr = getAllChkboxValues($_POST['chk_name']); //Chkbox Values echo"<pre>"; print_r($chkox_arr); ?> 

Ecco la mia soluzione:

Con una serie di checkbox in html come così …

 <input type="hidden" name="something[]" value="off" /> <input type="checkbox" name="something[]" /> <input type="hidden" name="something[]" value="off" /> <input type="checkbox" name="something[]" /> <input type="hidden" name="something[]" value="off" /> <input type="checkbox" name="something[]" /> 

Correggo quindi l'arrays postato con questa function …

 $_POST[ 'something' ] = $this->fixArrayOfCheckboxes( $_POST[ 'something' ] ); function fixArrayOfCheckboxes( $checks ) { $newChecks = arrays(); for( $i = 0; $i < count( $checks ); $i++ ) { if( $checks[ $i ] == 'off' && $checks[ $i + 1 ] == 'on' ) { $newChecks[] = 'on'; $i++; } else { $newChecks[] = 'off'; } } return $newChecks; } 

Questo mi fornirà un arrays con valori di "on" o "off" per each (e each) casella di controllo.

Si noti che l'input nascosto DEVE essere PRIMA dell'ingresso della casella di controllo affinché la function funzioni correttamente.

Ecco la mia soluzione:

 <span> <input class="chkBox" onchange="if($(this).is(':checked')){$(this).parent().find('.hidVal').prop('disabled',true);}else{$(this).parent().find('.hidVal').prop('disabled', false);}" type="checkbox" checked name="session[]" value="checked_value_here" /> <input type="hidden" class="hidVal" name="session[]" value="un_checked_value_here" /> </span> <span> <input class="chkBox" onchange="if($(this).is(':checked')){$(this).parent().find('.hidVal').prop('disabled',true);}else{$(this).parent().find('.hidVal').prop('disabled', false);}" type="checkbox" checked name="session[]" value="checked_value_here" /> <input type="hidden" class="hidVal" name="session[]" value="un_checked_value_here" /> </span>