Не удалось получить мои массивы POST, чтобы показать все значения флажка из моей формы.
У меня есть форма, созданная следующим образом:
<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>
У меня есть кнопка внизу, связанная с функцией jquery, которая добавляет еще 5 пустых строк в форму (следовательно, массивы для имени ввода cBox []).
Теперь проблема. Предположим, что первый флажок снят, и проверены последние 2. Когда я вывожу значения (используя PHP print_r для отладки), я получу:
Array ( [0] => on [1] => on)
По какой-то причине массив не содержит значения для снятых флажков.
Я видел некоторые решения, где скрытая переменная передается с каждым флажком, но может ли это решение быть реализовано в моей ситуации (используя массивы)?
Такое поведение неудивительно, поскольку браузер не передает никаких значений для отмеченных флажков.
Если вы находитесь в ситуации, когда вам нужно представить точное количество элементов в виде массива, почему бы вам не сделать то же самое, что и вы, когда есть определенный id
связанный с каждым флажком? Просто укажите имя ключа массива PHP как часть имени элемента <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>
Это все еще оставляет вам проблему с тем, что неконтролируемые поля все равно не будут присутствовать в массиве. Это может быть или не быть проблемой. Во-первых, вам действительно не все равно:
foreach($incoming as $key => $value) { // if the first $key is 1, do you care that you will never see 0? }
Даже если вам все равно, вы можете легко исправить проблему. Здесь есть два простых подхода. Во-первых, просто сделайте скрытый входной трюк:
<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>
И два, которые я считаю предпочтительными, вместо этого заполняем пробелы из 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);
Смотрите в действии .
ONE TRICK переопределяет значение флажка, если отмечено. в противном случае его значение будет равно 0.
<form> <input type='hidden' value='0' name="smth"> <input type='checkbox' value='1' name="smth"> </form>
Пытаться
<input type='checkbox' value="XXX" name='cBox[]'/> <input type='checkbox' value="YYY" name='cBox[]'/> <input type='checkbox' value="ZZZ" name='cBox[]'/>
Флажки работают так. Если он проверен, только после этого значение будет опубликовано.
Если вы работаете с динамическим блоком checkbox, вы можете попробовать следующее:
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); });
Результат бэкэнд (если проверен только второй):
// PHP $_POST['cBox'] Array ( [0] => [1] => on )
В этом инструменте флажки используются для управления каждым скрытым входом в группе.
Для отображения страницы вы можете визуализировать каждую пару входов обратно, назначив значение в скрытые входы и checked
флажки, как checked
.
Попробуйте установить значение для каждого флажка, равного 1 или true.
<input type='checkbox' value='1' name='cBox[1]'/>
может быть, почему он ничего не посылает?