Массивы POST не показывают непроверенные флажки
16284 просмотра
6 ответа
Возникли проблемы при получении моих массивов 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 []).
Теперь проблема. Допустим, первый флажок снят, а последние два отмечены. Когда я выведу значения (используя PHP print_r для отладки), я получу:
Array ( [0] => on [1] => on)
По какой-то причине массив не содержит никаких значений для непроверенных флажков.
Я видел некоторые решения, в которых скрытая переменная передается с каждым флажком, но может ли это решение быть реализовано в моей ситуации (с использованием массивов)?
Автор: SpaghettiMonster Источник Размещён: 12.11.2019 09:09Ответы (6)
20 плюса
Такое поведение неудивительно, так как браузер не предоставляет никаких значений для флажков, которые не отмечены.
Если вы находитесь в ситуации, когда вам нужно представить точное количество элементов в виде массива, почему бы вам не сделать то же самое, что вы делаете, когда есть какой 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);
Автор: Jon
Размещён: 02.11.2011 10:57
4 плюса
ONE TRICK - переопределить значение флажка, если установлен. в противном случае его значение будет равно 0.
<form>
<input type='hidden' value='0' name="smth">
<input type='checkbox' value='1' name="smth">
</form>
Автор: T.Todua
Размещён: 14.05.2013 07:06
2 плюса
Пытаться
<input type='checkbox' value="XXX" name='cBox[]'/>
<input type='checkbox' value="YYY" name='cBox[]'/>
<input type='checkbox' value="ZZZ" name='cBox[]'/>
Флажки работают таким образом. Если это проверено, только тогда значение отправлено.
Автор: Mārtiņš Briedis Размещён: 02.11.2011 10:571 плюс
Если вы обрабатываете динамический массив флажков, вы можете попробовать это:
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
.
0 плюса
Попробуйте установить значение для каждого флажка, 1 или true.
<input type='checkbox' value='1' name='cBox[1]'/>
может быть поэтому его не посылают?
Автор: geilt Размещён: 02.11.2011 11:270 плюса
В контроллере:
request()->merge(['cBox' => request()->input('cBox', [])]);
Вопросы из категории :
- php Как вы отлаживаете PHP-скрипты?
- php Заставьте XAMPP / Apache обслуживать файл вне htdocs
- php Как включить файлы PHP, которые требуют абсолютного пути?
- php Скрипт входа со скрытыми кнопками
- php How can I find unused functions in a PHP project
- html Определить часовой пояс пользователя
- html Как определить, какой из указанных шрифтов был использован на веб-странице?
- html Как мне дать моим веб-сайтам значок для iPhone?
- html Как отключить автозаполнение браузера в поле веб-формы / теге ввода?
- html Как автоматически изменить размер текстовой области с помощью Prototype?
- forms Как установить фокус на первый элемент ввода в форме HTML независимо от идентификатора?
- forms Как построить строку запроса с Javascript
- forms В форме Django как сделать поле доступным только для чтения (или отключенным), чтобы его нельзя было редактировать?
- forms Как получить ответ формы.
- forms Когда я должен использовать метод GET или POST? Какая разница между ними?
- checkbox Установка "проверил" для флажка с JQuery?
- checkbox Флажок в приложении iOS
- checkbox Как остановить всплывающее событие при нажатии кнопки-флажка
- checkbox Как я могу установить флажок «Выбрать все» в моем приложении ASP.NET MVC?
- checkbox Столбец флажка DataGridView - значение и функциональность