2010-03-05 10 views
5

Jestem pewien, że jest to łatwe dla ekspertów jQuery, ale jestem facetem z backendu i nie mogę znaleźć najlepszego sposobu na zrobienie tego. Mam dwie tablice w Drupalu, jedna to lista nazw widoków, a druga to tablica zawierająca listę wyświetlaczy dla każdego widoku. Oto kod, aby wypełnić te dwie tablice: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; 
    } 
} 

Oto fragment postaci, że pracuję z:

$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(), 
); 

Co chcę zrobić, jest dynamicznie wypełnić pole zaznaczania view_display z odpowiednie wartości. Jeśli użytkownik wybrał opcję "Mój ulubiony widok" z menu "Widok", chcę wyświetlić tablicę $ viewdisplays ["Mój ulubiony widok"] jako #options w polu "view_display".

Odpowiedz

4

Wykonanie tego, o co prosisz, nie jest trudne.

  1. Drupal wie, jakie opcje ma wybrana pozycja formularza, ponieważ zachowuje kopię formularza. Musisz więc wstępnie wypełnić opcje wyboru, które chcesz zmienić, wraz z wszystkimi opcjami, jakie może ono mieć. Również należy upewnić się, że ich wartości są unikalne, więc nie dostać tablicę takiego:

    array(
        1 => 'a-a', 
        2 => 'a-b', 
        3 => 'a-c', 
        4 => 'a-d', 
        1 => 'b-a', 
        2 => 'b-b', 
    ) 
    
  2. Teraz masz dwie opcje
    1. wysyłać swoje opcje dla każdego celu javascript przy użyciu
      drupal_add_js($array, 'setting'). Spowoduje to dodanie zmiennej $array do zmiennej .
    2. Możesz uzyskać opcje poprzez AJAX. W takim przypadku należy utworzyć element menu o numerze hook_menu.
  3. Teraz wystarczy tylko zareagować na zmianę zaznaczenia dla widoków i odpowiednio dodać ich opcje, albo pobierając je z wywołania ajaxowego, albo z zmiennej js. Polecam stosowanie podejścia zmiennego. To może wyglądać mniej więcej tak:

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

    Musisz dodać ten js do swojego formularza. Można go umieścić w pliku js, zawinąć go w $(document).ready i dodać go drupal_add_js

1

Widziałeś moduł Hierarchical Select? Jest to typ pola CCK.

Nieco więcej szczegółów na temat tej modułów (z jego strony projektu):

... definiuje „hierarchical_select” element formularza, który jest znacznie zwiększona sposób pozwalając użytkownikowi wybrać pozycje w hierarchii.

Hierarchiczna selekcja ma możliwość zapisania całego rodowodu zaznaczenia lub tylko "najgłębszego" zaznaczenia. Możesz go skonfigurować, aby zmusić użytkownika do dokonania wyboru w drzewie tak głęboko, jak to możliwe, lub pozwolić użytkownikowi wybrać element w dowolnym miejscu w drzewie. Poziomy można oznaczać etykietami, można skonfigurować ograniczenie liczby elementów, które można wybrać, skonfigurować tytuł skrzynki referencyjnej, wybrać opóźnienie animacji dla całej witryny itd. Możesz nawet tworzyć nowe przedmioty i poziomy poprzez Hierarchical Select!