2010-03-05 15 views
5

Sono sicuro che questo è facile per gli esperti di jQuery, ma sono un backend e non riesco a trovare il modo migliore per farlo. Ho due array in Drupal, uno è un elenco di nomi di viste e l'altro è un array che contiene un elenco di display per ogni vista. Ecco il codice per popolare le due matrici: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; 
    } 
} 

Ecco il frammento di forma che sto lavorando con:

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

Quello che voglio fare, è compilare in modo dinamico la casella di selezione view_display con i valori appropriati. Se l'utente ha selezionato "La mia vista preferita" dalla "vista" seleziona, voglio visualizzare l'array $ viewdisplays ['My Favorite View'] come le #opzioni nel campo 'view_display'.

risposta

4

Non è un compito difficile fare ciò che chiedi.

  1. Drupal sa quali opzioni ha un elemento del modulo selezionato, poiché conserva una copia del modulo. Quindi dovrai prepopolare le opzioni della selezione che desideri modificare con tutte le opzioni che può avere. Inoltre è necessario fare in modo che i loro valori sono unici, in modo da non ottenere un array come questo:

    array(
        1 => 'a-a', 
        2 => 'a-b', 
        3 => 'a-c', 
        4 => 'a-d', 
        1 => 'b-a', 
        2 => 'b-b', 
    ) 
    
  2. Ora avete due opzioni
    1. di inviare le vostre opzioni per ogni visualizzazione al javascript utilizzando
      drupal_add_js($array, 'setting'). Questo aggiungerà il $array alla variabile Drupal.settings.
    2. È possibile ottenere le opzioni tramite AJAX. In tal caso dovresti creare una voce di menu con hook_menu.
  3. Ora è sufficiente intervenire su una modifica della selezione per le viste e aggiungere le rispettive opzioni, sia recuperandole da una chiamata Ajax o dalla variabile js. Consiglierei di utilizzare l'approccio variabile. Potrebbe essere qualcosa del genere:

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

    Dovresti aggiungere questo js al modulo. Si potrebbe mettere in un file js, avvolgerla in $(document).ready e aggiungerlo con drupal_add_js

1

Hai visto il modulo Hierarchical Select? È un tipo di campo CCK.

Alcuni Maggiori informazioni su questo moduli (dalla sua pagina del progetto):

... definisce il "hierarchical_select" elemento di modulo, che è un modo notevolmente migliorato per lasciare i selezionare le voci di utente in una gerarchia.

Selezione gerarchica ha la capacità di salvare l'intero lignaggio di una selezione o solo la selezione "più profonda". È possibile configurarlo per costringere l'utente a effettuare una selezione il più possibile profonda nell'albero o consentire all'utente di selezionare un elemento in qualsiasi punto dell'albero. I livelli possono essere etichettati, è possibile configurare limitare il numero di elementi che possono essere selezionati, configurare un titolo per la casella personale, scegliere un ritardo di animazione a livello di sito e così via. Puoi persino creare nuovi oggetti e livelli attraverso la selezione gerarchica!