Drupal Dynamic Select в форме - PullRequest
       33

Drupal Dynamic Select в форме

5 голосов
/ 05 марта 2010

Я уверен, что это легко для экспертов 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 ['My Favorite View'] в качестве # вариантов для поля «view_display».

Ответы [ 2 ]

4 голосов
/ 06 марта 2010

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

  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

1 голос
/ 11 марта 2010

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

Некоторые подробности об этих модулях (со страницы его проекта):

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

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

...