HTML-элементы-флажки отправляются, только если они отмечены? - PullRequest
5 голосов
/ 18 ноября 2010

Я пытаюсь работать на существующем веб-сайте, и я нашел ошибку, но я не уверен, почему это ошибка или как ее обойти.

На сайте в основном перечислены некоторые коммерческиеобъекты недвижимости, которые сдаются в аренду в одном городе.Есть класс, который берет списки из базы данных и создает объект из каждого.В каждом объекте есть массив изображений, которые связаны с этим свойством.

Когда пользователь редактирует список, он получает страницу редактирования со списком изображений и флажок «удалить» рядом с ними.,Все флажки имеют одно и то же имя, поэтому, когда они отправляются обратно на сервер, приложение получает массив изображений для удаления.

Что должно произойти, так это то, что приложение имеет этот массивзначения on / off (где on = delete), а индекс каждого значения в массиве соответствует индексу изображения в объекте листинга - когда одно из значений «включено», имя файла в массиве изображений соответствуетзначение «on» удаляется из файловой системы, а изображение удаляется из базы данных.

Однако при отправке формы приложение получает 0-индексированный массив только отмеченных флажков.Поэтому, если я установлю три произвольных изображения для удаления, приложение получит

Array {
   [0] => "on",
   [1] => "on",
   [2] => "on"
}

Это, очевидно, не работает, первые 3 изображения в списке будут удалены независимо от того, какие флажки установлены.

Как я могу это исправить?Я бы не хотел называть каждый флажок (delete_1, delete_2, delete_3 и т. Д.), Поскольку система уже построена для работы со всеми флажками с одинаковым именем.Есть ли способ заставить все флажки быть отправленными с включенным или выключенным?

Ответы [ 6 ]

6 голосов
/ 18 ноября 2010

Нет способа форсировать, но вы могли бы просто добавить скрытое право перед флажком с тем же именем и необходимым значением:

<input type="hidden" name="delete[42]" value="off" />
<input type="checkbox" name="delete[42]" value="on" />
5 голосов
/ 18 ноября 2010

Нет, вы не можете принудительно отправлять непроверенные флажки, но вы можете дать им уникальные значения (вместо «вкл.» Для всех), чтобы определить, какие из них проверяются, не меняя имен.

1 голос
/ 18 ноября 2010

Решение Фреда Нурка хорошее, и я проголосовал за него. Лично, когда у меня была такая ситуация, я всегда давал полям разные имена. Я использую общий префикс, за которым следует подчеркивание, чтобы его было легко узнать, а затем какой-то идентификатор. Я часто буду создавать набор полей с одинаковым шаблоном, например, «name_1», «amount_1», «foobar_1», «name_2», «amount_2» и т. Д. Довольно легко перебрать поля и взять эти имена Кроме. (В Java просто indexOf ('_').)

1 голос
/ 18 ноября 2010

Вы можете решить эту проблему, добавив следующий jQuery:

$(function () {
  $("#myform").submit(function(){
    $("input[name='delete']:not(:checked)").attr("checked","checked").val("off");  
  });
}); 

myform - идентификатор вашей формы и delete - название флажков.

1 голос
/ 18 ноября 2010

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

В jQuery это будет выглядеть примерно так ...

$('#yourForm').submit(function(){
    var array = new Array();
    $('input[name="nameOfCheckboxes"]').each(function(index){
        array[index] = $(this).value();
    }
    var r = $.param(array);
    $('#someHiddenFieldInForm').value(r);
 }

(код, конечно, не проверен)

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

Другой способ обойти эту проблему - принять странность HTML-форм и перехватить ее с помощью локальной переменной, которая использует троичные операторы во время объявления.

Например, с учетом флажка

<input type="checkbox" name="notify_users" id="notify_cb">

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

// normal boolean value    
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on' );    
// explicitly set a 1 or 0
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on' )? 1 : 0);
// explicitly set 'yes' or 'no'
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on' )? 'yes' : 'no');

На мой взгляд, это предпочтительнее, чем добавление дополнительного Javascript к клиенту, хотя бы потому, что его обслуживание чуть меньше (и, возможно, понятнее, чтобы преемник / другой разработчик уклонялся от происходящего)

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