2010-03-05 2 views
5

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

//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'] в качестве поля #options в поле view_display.

ответ

4

Непростая задача - сделать то, что вы просите.

  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

Вы видели Hierarchical Select модуль? Это тип поля CCK.

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

... определяет «hierarchical_select» элемент формы, который является значительно повысить способ позволяя пользователю выбрать элементы в иерархии.

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