Массивы POST не показывают непроверенные флажки

php html forms checkbox

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:57

1 плюс

Если вы обрабатываете динамический массив флажков, вы можете попробовать это:

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.

Автор: Nick Tsai Размещён: 05.07.2017 04:08

0 плюса

Попробуйте установить значение для каждого флажка, 1 или true.

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

может быть поэтому его не посылают?

Автор: geilt Размещён: 02.11.2011 11:27

0 плюса

В контроллере:

request()->merge(['cBox' => request()->input('cBox', [])]);

Автор: kjdion84 Размещён: 07.06.2018 06:34
Вопросы из категории :
32x32