Как разместить пустые <select .. множественные> элементы HTML, если они пустые? - PullRequest
12 голосов
/ 15 июля 2009

У меня есть следующее поле множественного выбора в форме HTML, где пользователь может выбрать один или несколько вариантов.

<select id="eng_0" name="eng_0[]" multiple size="3">
  <option value="Privilégier">Privilégier</option>
  <option value="Accepté">Accepté</option>
  <option value="Temporaire">Temporaire</option>
</select>

Когда пользователь не выбирает никакой опции, форма отправляется в PHP-бэкэнд, но не создает пустого значения массива для $ _POST ['eng_0'], как если бы поле не было даже в форме.

Это похоже на не отмеченный флажок, который не представляет проблему.

Есть ли способ, чтобы POST выбрал объект, даже если нет выбранной опции? Это может быть в jQuery, если это поможет.

Ответы [ 8 ]

21 голосов
/ 15 июля 2009

Если ваша форма генерируется динамически, вы можете включить скрытый элемент формы с тем же именем, который содержит фиктивное значение. Затем просто проигнорируйте фиктивное значение, если значение, которое вы получите для этой переменной, равно ['dummy_value'], тогда вы можете рассматривать это как значение "ничего не выбрано" в вашем коде.

12 голосов
/ 15 июля 2009

Есть ли причина, по которой вы не можете рассматривать ситуацию, когда массив не задан, как если бы он был отправлен без содержимого?

if (!isset($_POST['eng_0']))
    $_POST['eng_0'] = array();

EDIT:

Добавить скрытое поле всякий раз, когда множественный выбор присутствует в вашей форме:

<input type="hidden" name="eng_0_exists" value="1"/>

Затем проверьте:

if (!isset($_POST['eng_0']) && isset($_POST['eng_0_exists']))
    $_POST['eng_0'] = array();
5 голосов
/ 13 января 2018

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

Таким образом, я смог различить 2 разных сценария в Laravel / php:

  • Установить все myitems пустыми (требуется скрытый ввод, поэтому PHP получает пустую строку для myitems)
  • Обновите другие свойства модели, не касаясь myitems (исключая любые формы ввода myitems из формы. PHP не получит ключ myitems)

Пример кода:

<input type="hidden" name="myitems" value="" />
<select name="myitems[]" multiple>
  <option value="1">Foo</option>
  <option value="2">Bar</option>
</select>
2 голосов
/ 15 июля 2009

Вы можете добавить - пожалуйста, выберите - запись и предварительно выбрать ее.

<select id="eng_0" name="eng_0[]" multiple size="3">
  <option value="nothing" selected="selected">- please select -</option>
  <option value="Privilégier">Privilégier</option>
  <option value="Accepté">Accepté</option>
  <option value="Temporaire">Temporaire</option>
</select>
1 голос
/ 03 декабря 2016

Добавить что-то вроде

    $("#field").change(function() {
      if (($("#field").val() || []) == "") $("form").append("<input type='hidden' name='field' value=''>");
    });
1 голос
/ 12 октября 2010

что, если даже когда пользователь выберет его, ничего о выборе не появится в $ _POST?

            <form action="cart.php" method="POST">
                <input type="hidden" id="acao" name="acao" value="add" />
                <input type="hidden" id="id" name="id" value="<?=$cnt->cnt_codigo?>" />
                <?php
                    $resOpc = mysql_query("SELECT * FROM loja_opcionais ORDER BY descricao")or die(mysql_error());
                    if(mysql_num_rows($resOpc) > 0){
                ?>
                <select id="opcional" nome="opcional">
                    <?php
                        while($opc = mysql_fetch_object($resOpc)){
                    ?>
                    <option value="<?=$opc->descricao?>"><?=$opc->descricao?></option>
                    <?php
                        }
                    ?>
                </select>
                <?php
                    }
                ?>
                <button class="botao" type="submit">Adicionar ao Carrinho</button>
            </form>

Когда я делаю print_r ($ _ POST); с другой стороны вывод просто: Массив ([acao] => add [id] => 3) и никаких признаков тега выбора, даже когда я изменяю значение на другой стороне;

0 голосов
/ 20 июня 2017

Включите <input type="hidden" name="yourfield" value="" /> в вашу форму, где имя совпадает с вашим multiple="multiple" выбором.


К сожалению, браузеры не отправляют пустые параметры формы для multiple="multiple" выборок, как они делают для не множественных выборок или обычных вводов.

Использование фиктивного значения, предложенного в принятом ответе, не очень чистое решение.

(Этот вопрос не имеет ничего общего с jQuery)

0 голосов
/ 05 ноября 2012

если нет $ _POST, разместить пустую строку (ничего) - абсолютно простое решение.

Здесь мое решение для формы с <select name="related[]" multiple>

просто добавьте следующую строку в раздел php, который обрабатывает сохранение вашей формы:

if (!isset($_POST['related'])) $_POST['related']="";
...