Я добавил флажок в форму, в которую пользователь может динамически добавлять строки. Вы можете увидеть форму здесь .
Я использую массив для передачи значений для каждой строки в генератор электронной почты PHP, и все работает отлично для других входов, но я не могу установить этот флажок. В настоящий момент флажок выглядит следующим образом:
<input type="checkbox" name="mailing[]" value="Yes">
Тогда в PHP у меня есть это:
$mailing = trim(stripslashes($_POST['mailing'][$i]));
Но он работает не так, как ожидалось, т.е. я вижу только «Да» для первого флажка, и ничего для последующих флажков, которые были проверены.
Еще одна проблема заключается в том, что я хотел бы, чтобы значение «Нет» было создано для снятых флажков.
Может ли кто-нибудь помочь с этим?
Благодаря,
Ник
Форма:
<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>
Сценарий клонирования:
$(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 = array(); foreach($_POST as $v){ $mailing[] = trim(stripslashes($v)); }
Для обработки непроверенных боксов было бы лучше установить каждый флажок с уникальным значением:
<input type="checkbox" name="mailing[1]" value="Yes"> <input type="checkbox" name="mailing[2]" value="Yes">
или
<input type="checkbox" name="mailing[a]" value="Yes"> <input type="checkbox" name="mailing[b]" value="Yes">
Затем укажите список флажков:
$boxes = array(1,2,3); $mailing = array(); $p = array_key_exists('mailing',$_POST) ? $_POST['mailing'] : array(); foreach($boxes as $v){ if(array_key_exists($v,$p)){ $mailing[$v] = trim(stripslashes($p[$v])); }else{ $mailing[$v] = 'No'; } } print_r($mailing);
Вы также можете использовать это с несколькими флажками:
$boxes = 3; $mailing = array(); $p = array_key_exists('mailing',$_POST) ? $_POST['mailing'] : array(); for($v = 0; $v < $boxes; $v++){ if(array_key_exists($v,$p)){ $mailing[$v] = trim(stripslashes($p[$v])); }else{ $mailing[$v] = 'No'; } } print_r($mailing);
Измените значение для каждого флажка на что-то уникальное:
<input type="checkbox" name="mailing[]" value="Yes-1"> <input type="checkbox" name="mailing[]" value="Yes-2">
и т. д. Чтобы сделать это из вашего кода jQuery, добавьте еще одну строку, которая присваивает значение новому флажку:
x.find('input:checkbox').each(function() { this.value='Yes-'+n; });
Вы должны определить n
на начальной загрузке страницы. Предполагая, что вы начинаете с только одного «человека», просто добавьте прямо над вашим $(".add").click
handler:
var n=1;
А потом:
$(".add").click
обработчик $(".add").click
, увеличьте значение n
$(".remove").click
Обработчик $(".remove").click
, уменьшите значение n
Чтобы проверить и снять флажки, оба значения в POST помещают скрытое поле с точно таким же именем, но с противоположным значением по сравнению с исходным значением chkbox, так что в этом случае значение будет равно «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 = array(); //create a new array 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 array } final_arr = array(); //create the final array return $final_arr = array_values($chk_name); //sort the resulting array again } $chkox_arr = getAllChkboxValues($_POST['chk_name']); //Chkbox Values echo"<pre>"; print_r($chkox_arr); ?>
с<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 = array(); //create a new array 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 array } final_arr = array(); //create the final array return $final_arr = array_values($chk_name); //sort the resulting array again } $chkox_arr = getAllChkboxValues($_POST['chk_name']); //Chkbox Values echo"<pre>"; print_r($chkox_arr); ?>
Вот мое решение:
С массивом флажков в html, как …
<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[]" />
Затем я фиксирую опубликованный массив с помощью этой функции …
$_POST[ 'something' ] = $this->fixArrayOfCheckboxes( $_POST[ 'something' ] ); function fixArrayOfCheckboxes( $checks ) { $newChecks = array(); for( $i = 0; $i < count( $checks ); $i++ ) { if( $checks[ $i ] == 'off' && $checks[ $i + 1 ] == 'on' ) { $newChecks[] = 'on'; $i++; } else { $newChecks[] = 'off'; } } return $newChecks; }
Это даст мне массив со значениями «on» или «off» для каждого (и каждого) флажка.
Обратите внимание, что скрытый ввод ДОЛЖЕН быть ДО ДОПОЛНИТЕЛЬНОЙ ФУНКЦИИ, чтобы функция работала правильно.
Вот мое решение:
<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>