Drupal Dynamic Select на форме

Я уверен, что это легко для экспертов jQuery, но я бэкэнд-парень и не могу найти лучший способ сделать это. У меня есть два массива в Drupal, один - список имен представлений, а другой - массив, который содержит список отображений для каждого представления. Вот код для заполнения двух массивов:

 //load list of views in to array for select lists
$views = views_get_all_views();
$viewnames = array();
$viewdisplays = array();
foreach ($views as $view) {
  $viewnames[$view->name] = $view->name; 
  foreach ($view->display as $k) {
    $id = $k->id;
    $title = $k->display_title;
    $viewdisplays[$view->name]['id'] = $id;
    $viewdisplays[$view->name]['title'] = $title;
  }
}

Вот фрагмент формы, с которой я работаю:

$form['view'] = array(
  '#type' => 'select',
  '#title' => t('Select the view to be used for display'),
  '#options' => $viewnames,
);
$form['view_display'] = array(
  '#type' => 'select',
  '#title' => t('Select the display of the gallery view to be used'),
  '#options' => array(),
);

Я хочу динамически заполнять поле выбора view_display соответствующими значениями. Если пользователь выбрал "Мой любимый вид" в "представлении", я хочу отобразить массив $viewdisplays['Мой любимый вид'] в качестве # вариантов для поля "view_display".

2 ответа

Решение

Это не сложная задача, чтобы сделать то, что вы просите.

  1. Drupal знает, какие опции есть у выбранного элемента формы, поскольку он хранит копию формы. Таким образом, вам нужно предварительно заполнить параметры выбора, который вы хотите изменить, со всеми параметрами, которые он может иметь. Также вам нужно убедиться, что их значения уникальны, поэтому вы не получите такой массив:

    array(
      1 => 'a-a',
      2 => 'a-b',
      3 => 'a-c',
      4 => 'a-d',
      1 => 'b-a',
      2 => 'b-b',
    )
    
  2. Теперь у вас есть два варианта
    1. Вы отправляете свои варианты для каждого представления в JavaScript, используя
      drupal_add_js($array, 'setting'), Это добавит $array к Drupal.settings переменная.
    2. Вы можете получить варианты через AJAX. В этом случае вам придется создать пункт меню с hook_menu,
  3. Теперь вам нужно только отреагировать на изменение выбора для представлений и соответственно добавить их параметры, получая их из вызова ajax или переменной js. Я бы порекомендовал использовать переменный подход. Это может выглядеть примерно так:

    $("#edit-view").change(function(){
        $("#edit-view_display").html(Drupal.settings.myVariable[$(this).val()]);
    }).change();
    

    Вы должны будете добавить это JS к вашей форме. Вы можете положить его в файл JS, обернуть его в $(document).ready и добавить его с drupal_add_js

Вы видели модуль " Иерархический выбор "? Это тип поля CCK.

Еще несколько подробностей об этих модулях (со страницы проекта):

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

Иерархический выбор имеет возможность сохранить всю линию выбора или только самый глубокий выбор. Вы можете настроить его так, чтобы заставить пользователя делать выбор как можно глубже в дереве, или позволить пользователю выбирать элемент в любом месте дерева. Уровни могут быть помечены, вы можете настроить ограничение количества элементов, которые можно выбрать, настроить заголовок для выпадающего списка, выбрать задержку анимации для всего сайта и так далее. Вы даже можете создавать новые предметы и уровни с помощью Hierarchical Select!

Другие вопросы по тегам