POST непроверенные флажки HTML - PullRequest
272 голосов
/ 27 ноября 2009

У меня есть множество флажков, которые отмечены по умолчанию. Мои пользователи, вероятно, снимают флажки с нескольких (если они есть), а остальные оставляют отмеченными.

Есть ли способ сделать форму POST флажками, которые не отмечены, вместо тех, которые проверены ?

Ответы [ 40 ]

1 голос
/ 15 сентября 2014

Флажки обычно представляют двоичные данные, которые хранятся в базе данных в виде значений Да / Нет, Y / N или 1/0. HTML-флажки имеют плохую природу для отправки значения на сервер, только если флажок установлен! Это означает, что серверный скрипт на другом сайте должен заранее знать, какие есть все возможные флажки на веб-странице, чтобы иметь возможность хранить положительные (отмеченные) или отрицательные (непроверенные) значения. На самом деле проблема заключается только в отрицательных значениях (когда пользователь снимает флажок с предварительно (предварительно) проверенного значения - как сервер может знать об этом, когда ничего не отправляется, если он не знает заранее, что это имя должно быть отправлено). Если у вас есть серверный скрипт, который динамически создает скрипт UPDATE, то есть проблема, потому что вы не знаете, какие все флажки должны быть получены, чтобы установить значение Y для отмеченных и значение N для непроверенных (не полученных).

Поскольку я храню значения «Y» и «N» в своей базе данных и представляю их с помощью отмеченных и непроверенных флажков на странице, я добавил скрытое поле для каждого значения (флажок) со значениями «Y» и «N», затем использую флажки только для визуального представления и используйте простую функцию JavaScript check (), чтобы установить значение if в соответствии с выбором.

<input type="hidden" id="N1" name="N1" value="Y" />
<input type="checkbox"<?php if($N1==='Y') echo ' checked="checked"'; ?> onclick="check(this);" />
<label for="N1">Checkbox #1</label>

используйте один приемник JavaScript onclick и вызовите функцию check () для каждого флажка на моей веб-странице:

function check(me)
{
  if(me.checked)
  {
    me.previousSibling.previousSibling.value='Y';
  }
  else
  {
    me.previousSibling.previousSibling.value='N';
  }
}

Таким образом, значения 'Y' или 'N' всегда отправляются в серверный скрипт, он знает, какие поля должны быть обновлены, и нет необходимости преобразовывать значение checbox "on" в значение "Y" или не получено. в 'N'.

ПРИМЕЧАНИЕ: пробел или новая строка также является родным братом, поэтому здесь мне нужно .previousSibling.previousSibling.value. Если между ними нет пробела, то только .previousSibling.value


Вам не нужно явно добавлять прослушиватель onclick, как раньше, вы можете использовать библиотеку jQuery для динамического добавления прослушивателя щелчков с функцией для изменения значения для всех флажков на вашей странице:

$('input[type=checkbox]').click(function()
{
  if(this.checked)
  {
    $(this).prev().val('Y');
  }
  else
  {
    $(this).prev().val('N');
  }
});
1 голос
/ 26 января 2016

Проблема с флажками заключается в том, что если они не отмечены, они не публикуются в вашей форме. Если вы отметите флажок и опубликуете форму, вы получите значение флажка в переменной $ _POST, которую можно использовать для обработки формы, если она не отмечена, никакое значение не будет добавлено в переменную $ _POST.

В PHP вы, как правило, можете обойти эту проблему, выполнив проверку isset () для вашего элемента checkbox. Если ожидаемый элемент не задан в переменной $ _POST, тогда мы знаем, что флажок не установлен и значение может быть ложным.

if(!isset($_POST['checkbox1']))
{
     $checkboxValue = false;
} else {
     $checkboxValue = $_POST['checkbox1'];
}

Но если вы создали динамическую форму, то вы не всегда будете знать атрибут name ваших флажков, если вы не знаете имя флажка, то вы не сможете использовать функцию isset, чтобы проверить, имеет ли она было отправлено с переменной $ _POST.

1 голос
/ 25 февраля 2014

Пример действий Ajax (': флажок') использует jQuery вместо .val ();

            var params = {
                books: $('input#users').is(':checked'),
                news : $('input#news').is(':checked'),
                magazine : $('input#magazine').is(':checked')
            };

params получит значение в ИСТИНА ИЛИ ЛОЖЬ.

0 голосов
/ 21 февраля 2018

Может выглядеть глупо, но это работает для меня. Основным недостатком является то, что визуально это переключатель, а не флажок, но он работает без JavaScript.

HTML

Initialy checked
<span><!-- set the check attribute for the one that represents the initial value-->
<input type="radio" name="a" value="1" checked>
<input type="radio" name="a" value="0">
</span>

<br/>
Initialy unchecked
<span><!-- set the check attribute for the one that represents the initial value-->
<input type="radio" name="b" value="1">
<input type="radio" name="b" value="0" checked>
</span>

и CSS

span input
{position: absolute; opacity: 0.99}

span input:checked
{z-index: -10;}

span input[value="0"]
{opacity: 0;}

скрипка здесь

Мне бы хотелось услышать любые проблемы, которые вы обнаружите с этим кодом, потому что я использую его в работе

0 голосов
/ 22 ноября 2017

Однолинейное решение:

$option1ChkBox = array_key_exists('chkBoxName', $_POST) ? true : false;
0 голосов
/ 18 августа 2017

Если вы хотите отправить массив значений флажков (включая непроверенные элементы), то вы можете попробовать что-то вроде этого:

<form>
<input type="hidden" value="0" name="your_checkbox_array[]"><input type="checkbox">Dog
<input type="hidden" value="0" name="your_checkbox_array[]"><input type="checkbox">Cat
</form>

$('form').submit(function(){
    $('input[type="checkbox"]:checked').prev().val(1);
});
0 голосов
/ 07 августа 2017
<input type="checkbox" id="checkbox" name="field_name" value="1">

Вы можете сделать трюк на стороне сервера, не используя скрытые поля,
Использование троичного оператора:

isset($_POST['field_name']) ? $entity->attribute = $_POST['field_name'] : $entity->attribute = 0;

Использование обычного оператора ПЧ:

if (isset($_POST['field_name'])) {
    $entity->attribute = $_POST['field_name'];
} else {
    $entity->attribute = 0;
}
0 голосов
/ 31 мая 2012

Простой ответ. Если в вашем коде есть checked = "checked" , измените его на unchecked = "unchecked"

поэтому ваш текст должен выглядеть примерно так:

input type = "checkbox" name = "yourchosenname" unchecked = "unchecked"

если он не содержит этого, вы всегда можете добавить его

0 голосов
/ 26 апреля 2016
function SubmitCheckBox(obj) {
     obj.value   = obj.checked ? "on" : "off";
     obj.checked = true;
     return obj.form.submit();
}

<input type=checkbox name="foo" onChange="return SubmitCheckBox(this);">
0 голосов
/ 21 июня 2013

" У меня есть множество флажков, которые по умолчанию отмечены " - вот как я решил свою проблему:

  1. if (($ C1) ИЛИ ($ C2) ИЛИ ... ($ C18)) {echo "некоторые проверены!";} еще {$ С1 = 'установить'; $ С2 = 'установить'; $ С3 = 'установить'; $ С4 = 'установлен'; $ С5 = 'установить'; $ С6 = 'установить'; $ С7 = 'установить' ; $ С8 = 'установлен'; $ С9 = 'установлен'; $ С10 = 'установить'; $ С11 = 'установить'; $ С12 = 'установить'; $ С13 = 'установлен'; $ С14 = 'установлен'; $ C15 = 'set'; $ C16 = 'set'; $ C17 = 'set'; $ C18 = 'set';} // (если все не выбрано - установите для них значение 'check', так как это значение по умолчанию) )
  2. вышеприведенная строка выполнит эхо, если некоторые не отмечены
  3. но проверенные будут иметь значение параметра
  4. поэтому, чтобы оставить их установленными, при записи их в форму используйте if ($ C1) {echo "флажок";}
  5. использовать значения в дальнейшей логике ...

!!! ограничение этого метода: вы не можете снять все галочки - они все вернутся обратно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...