Можно ли выбрать параметры раскрывающегося списка только один раз для каждого элемента списка?

Я, наверное, все неправильно делаю.

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

Возможно ли это или есть лучший способ сделать это?

РЕДАКТИРОВАТЬ. Это для раскрывающегося списка в форме внутреннего плагина.


person Mart    schedule 11.09.2019    source источник
comment
Я ответил на ваш вопрос простым массивом. Для будущих вопросов лучше включить некоторый код, чтобы помочь нам помочь вам. Я не знаю, как вы создаете раскрывающиеся меню, поэтому вам придется настроить мой ответ на свой код. Много проб и ошибок.   -  person Pettis Brandon    schedule 13.09.2019


Ответы (2)


Вероятно, вы можете сделать это с помощью Javascript / Jquery для более изящного способа, но я точно знаю, что вы можете использовать AJAX и Session Octobercms, чтобы сделать это. (Мне нравится использовать то, что предоставляет OctoberCMS) Вот рабочий код, который я сделал специально, используя только страницу CMS October.

  1. Я использовал три части
  2. Я использовал jquery для просмотра тегов <select> и запуска Ajax-запроса.
  3. Я использовал OctoberCMS Session для хранения значений

Это код разметки партиалов: вы заметили, что это будет печатать только значения <option> для элемента select.

<option value="">Select</option>
{% for a in array %}
<option value="{{ a }}" {% if a == selected %}selected{% endif %}>{{ a }}</option>
{% endfor %}

PHP-код партиала будет меняться для каждого партиала, но, например, вот первый: Здесь вы начинаете массив. Затем мы проверяем значения в сеансе с помощью Session::get('select2'). Обратите внимание на -1; Когда вы unset($array[$select2]), он ищет индексный ключ. Наш массив действительно выглядит как [0=>1, 1=>2, 2=>3, 3=>4, 4=>5], и легко просто вычесть единицу, чтобы найти индекс ключа. Нам также сойдет с рук unset($array[-1]), потому что в нашем массиве нет ключа индекса -1. Затем мы получаем выбранное значение для <select>, вызывая его собственное значение сеанса с помощью Session::get('select1'). Затем мы помещаем построенный массив в партиал.

function onStart() {
    $array = [1,2,3,4,5];
    $select2 = Session::get('select2') - 1;
    unset($array[$select2]);
    $select3 = Session::get('select3') - 1;
    unset($array[$select3]);
    $this['selected'] = Session::get('select1');
    $this['array'] = $array;
}

Разметка страницы CMS выглядит следующим образом: Первые три элемента вызывают параметры выбора по их частичному значению. Давайте посмотрим на Jquery. Я наблюдаю за изменением #selectOne, а затем вызываю запрос. Мы обновляем каждый второй частичный. Мы нажимаем атрибут имени и значение с запросом.

<select name="select1" id="selectOne">
{% partial 'select1' %}
</select>
<select name="select2" id="selectTwo">
{% partial 'select2' %}
</select>
<select name="select3" id="selectThree">
{% partial 'select3' %}
</select>

{% put scripts %}
<script>
$('#selectOne').change(function(){

    $(this).request('onUpdate', {
        update: {
            select2: '#selectTwo',
            select3: '#selectThree'
            },
        data: {
            value: $(this).val(),
            name: $(this).attr("name")
            }
    })//*/
});

$('#selectTwo').change(function(){

    $(this).request('onUpdate', {
        update: {
            select1: '#selectOne',
            select3: '#selectThree'
            },
        data: {
            value: $(this).val(),
            name: $(this).attr("name")
            }
    })//*/
});

$('#selectThree').change(function(){

    $(this).request('onUpdate', {
        update: {
            select1: '#selectOne',
            select2: '#selectTwo'
            },
        data: {
            value: $(this).val(),
            name: $(this).attr("name")
            }
    })//*/
});
</script>
{% endput %}

Функция страницы CMS: здесь, если значение больше нуля, мы помещаем информацию в сеанс с помощью Session::put(key, value). Если параметр значения «выбрать», который имеет значение 0 (не больше нуля), мы удаляем значение выбора из сеанса.

function onUpdate() {
    if (Input::get('value') > null) {
        Session::put(Input::get('name'), Input::get('value'));
    } else {
        Session::forget(Input::get('name'));
    }
}

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

person Pettis Brandon    schedule 13.09.2019

Поэтому я не заметил бэкэнд-тега, и вы не упоминаете его в своем вопросе. Я не думаю, что вы делаете так, как я первоначально предложил в бэкэнде. Итак, вот скрипка, которую, я знаю, вы могли бы использовать в бэкенде. Вот используемый javascript, и вам придется настроить его для вашего использования.

  function preventDupes( select, index ) {
      var options = select.options,
          len = options.length;
      while( len-- ) {
          options[ len ].disabled = false;
      }
      select.options[ index ].disabled = true;
      if( index === select.selectedIndex ) {
          alert('You\'ve already selected the item "' + select.options[index].text + '".\n\nPlease choose another.');
          this.selectedIndex = 0;
      }
  }

  var select1 = select = document.getElementById( 'select1' );
  var select2 = select = document.getElementById( 'select2' );

  select1.onchange = function() {
      preventDupes.call(this, select2, this.selectedIndex );
  };

  select2.onchange = function() {
      preventDupes.call(this, select1, this.selectedIndex );
  };
person Pettis Brandon    schedule 13.09.2019
comment
Извините, Петтис, я должен был сказать, что это было для задней части. Я отредактировал свой вопрос, чтобы отразить это. Простите мои нубизмы, куда бы мне поставить этот Javascript? Я понимаю, что вы предлагаете, отличная работа! Я немного новичок в OctoberCMS и его способах MVC. - person Mart; 14.09.2019
comment
Думал, что я ответил на это. Да, вы можете добавить это в htm-файл создания и обновления, найденный в author/plugin/controllers/configs/. Я считаю, что лучше всего поместить скрипт внизу страницы. - person Pettis Brandon; 18.09.2019