2010-03-05 43 views
5

Estoy seguro de que es una tarea fácil para los expertos de jQuery, pero soy un backend y no puedo encontrar la mejor manera de hacerlo. Tengo dos matrices en Drupal, una es una lista de nombres de vistas y la otra es una matriz que contiene una lista de pantallas para cada vista. Aquí está el código para rellenar las dos matrices:Drupal Dynamic Select en un Formulario

//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; 
    } 
} 

Aquí está el fragmento de la forma que estoy trabajando 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(), 
); 

Lo que yo quiero hacer, es llenar dinámicamente la caja de selección view_display con los valores apropiados Si el usuario seleccionó "Mi vista favorita" de la vista "seleccionar", quiero mostrar la matriz $ viewdisplays ['Mi vista favorita'] como el campo #options to the 'view_display'.

Respuesta

4

No es una tarea difícil hacer lo que pide.

  1. Drupal sabe qué opciones tiene un elemento de formulario seleccionado, ya que conserva una copia del formulario. Por lo tanto, deberá rellenar previamente las opciones de la selección que desee cambiar con todas las opciones que pueda tener. También es necesario asegurarse de que sus valores son únicos, por lo que no obtiene una matriz de esta manera:

    array(
        1 => 'a-a', 
        2 => 'a-b', 
        3 => 'a-c', 
        4 => 'a-d', 
        1 => 'b-a', 
        2 => 'b-b', 
    ) 
    
  2. Ahora usted tiene dos opciones
    1. Usted enviar sus opciones para cada vista a la javascript usando
      drupal_add_js($array, 'setting'). Esto agregará el $array a la variable Drupal.settings.
    2. Puede obtener las opciones a través de AJAX. En ese caso, deberá crear un elemento de menú con hook_menu.
  3. Ahora solo necesita reaccionar sobre un cambio en la selección de las vistas y agregar sus opciones en consecuencia, ya sea obteniéndolas de una llamada ajax o la variable js. Yo recomendaría usar el enfoque variable. Eso podría verse más o menos así:

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

    Necesitará agregar esta JS a su formulario. Se puede poner en un archivo js, ​​envolverlo en $(document).ready y añadirlo con drupal_add_js

1

¿Usted ha visto el módulo Hierarchical Select? Es un tipo de campo CCK.

algunos detalles más sobre estos módulos (de la página del proyecto):

... define la "hierarchical_select" elemento de formulario, que es una forma muy mejorada para permitir que los artículos seleccionados por el usuario en una jerarquía.

Hierarchical Select tiene la capacidad de guardar todo el linaje de una selección o solo la selección "más profunda". Puede configurarlo para obligar al usuario a realizar una selección lo más profundo posible en el árbol, o permitir que el usuario seleccione un elemento en cualquier lugar del árbol. Los niveles se pueden etiquetar, puede configurar el límite de la cantidad de elementos que se pueden seleccionar, configurar un título para la Dropbox, elegir un retraso de la animación en todo el sitio, y así sucesivamente. ¡Incluso puede crear nuevos elementos y niveles a través de Hierarchical Select!

Cuestiones relacionadas