Множественный выбор Select2 возвращает только первый выбранный элемент

#jquery-select2 #jquery-select2-4

#jquery-select2 #jquery-select2-4

Вопрос:

У меня есть форма конфигурации с несколькими тегами множественного выбора, использующими select2. Выбранные параметры отображаются правильно при использовании $('#selectitem').select2('data'); , но при отправке формы передается только первый выбранный элемент.

фрагмент (он находится в шаблоне jinja2, приложении Flask, с UiKit3):

 <form action="" method="post">
...
                        {% if param['param_type'] == 'list' %}
                          <select id="{{'node_%s' % param['node_id']}}" name="{{'node_%s' % param['node_id']}}" multiple='multiple' class="uk-select uk-form-width-large">
                            {% for p in param['param_value'] %}
                              <option value='{{ p }}'>{{ p }}</option>
                            {% endfor %}
                          </select>
                        {% else %}
                          <textarea id="{{'node_%s' % param['node_id']}}" name="{{'node_%s' % param['node_id']}}" class='uk-textarea uk-form-width-large'>{{ param['param_value'] }}</textarea>
                        {% endif %}
...
      <button type='submit' name='submit' class='uk-button-default'>Change Settings</button>
</form>
  

и select2 JS:

   $(document).ready(function() {
      $(".uk-select").select2({closeOnSelect: false});
  });
  

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

Я попытался присвоить name тегу select значение name[] , как предлагалось в другом месте, но это не возымело никакого эффекта. Я много искал решение в Интернете, но ничего не нашел.

Ответ №1:

При выборе значения из выпадающего списка вы можете сохранить выбранные значения в переменной javascript, а затем передать эту переменную на сервер с помощью вызова ajax.

Ниже приведен пример, который сохраняет выбранные значения в ajaxOptions.data.selectedValues при выборе значений из выпадающего списка.

 var ajaxOptions = {};
var ajaxOptions.data = {};

$(".uk-select").change(function(){
    ajaxOptions.data.selectedValues = $(this).val();
    console.log(ajaxOptions);
  });
  

Пример JsFiddle:https://jsfiddle.net/g7nkfpca /

ОТРЕДАКТИРОВАННЫЙ ОТВЕТ:

Вы также можете использовать отправку собственной HTML-формы. Для этого прежде всего вам нужно указать имя тега select в формате массива, как показано ниже.

 <select id="{{'node_%s' % param['node_id']}}" name="{{'node_%s' % param['node_id']}}[]" multiple='multiple' class="uk-select uk-form-width-large">
  

И в вашем PHP-коде повторите $_POST данные, чтобы получить все выбранные параметры один за другим, смотрите код ниже.

 // Check if any option is selected 
if(isset($_POST["node_XXX"]))  
{ 
   // Retrieving each selected option 
   foreach ($_POST['node_XXX'] as $node)  
   print "You selected $node<br/>"; 
} 
  

В приведенном выше коде XXX — это param['node_id'] тот, который вы можете заменить.

Комментарии:

1. Спасибо. Могу ли я присвоить это значение объекту select, чтобы оно передавалось при отправке формы в обычном режиме? В противном случае мне придется вручную собирать значения всех полей (их много, и они создаются динамически) и выполнять ajax-вызов с формой вместо простого использования стандартной html-формы (что является причиной использования Select2 в первую очередь).).

2. @user11075824, основываясь на вашем комментарии, я обновил свой ответ, пожалуйста, ознакомьтесь с моим обновленным ответом, надеюсь, это поможет.

Ответ №2:

Вы можете просто добавить скобки к названию элемента:

 <select class="form-control" multiple="multiple" data-plugin="select2" id="id_country" name="id_country[]" required="">
  

Тогда он уже есть в массиве.