Puedes usar Ajax para lograr esto. Drupal 7 tiene buen soporte Ajax ahora. En su primera lista de selección (ciudad) deberá agregar información de Ajax. Luego, la segunda lista de selección se puede completar según la información de la primera. Incluso puede ocultar la segunda lista de selección hasta que se seleccione una opción en la primera, y explicaré cómo hacerlo en un momento. Primero, para configurar la forma básica:
$form['city'] = array(
'#type' => 'select',
'#title' => t('City'),
'#options' => $options,
'#ajax' => array(
'event' => 'change',
'wrapper' => 'squadron-wrapper',
'callback' => 'mymodule_ajax_callback',
'method' => 'replace',
),
);
$form['squadron_wrapper'] = array('#prefix' => '<div class="squadron-wrapper">', '#suffix' => '</div>');
$form['squadron_wrapper']['squadron'] = array(
'#type' => 'select',
'#title' => t('Squadron'),
'#options' => $squadron_options,
);
Esta es solo la configuración básica de los elementos. Ahora necesitará una manera de determinar qué opciones deben ir en el escuadrón. Primero debe hacer que su devolución de llamada Ajax se identifique en la lista de selección 'ciudad'. En la mayoría de los casos, puede devolver el elemento que envuelve el elemento ajax, en este caso $ form.
function mymodule_ajax_callback($form, $form_state) {
return $form;
}
Ahora, cuando la lista de selección 'ciudad' cambie, reconstruirá la parte de envoltura del escuadrón del formulario. Su valor de 'ciudad' ahora estará en $ form_state ['valores']. Entonces, cuando se reconstruye el formulario, necesitamos determinar qué opciones dar a la lista de selección en función del valor de 'ciudad'.
// Get the value of the 'city' field.
$city = isset($form_state['values']['city']) ? $form_state['values']['city'] : 'default';
switch ($city) {
case 'default':
// Set default options.
break;
case 'losangeles':
// Set up $squadron_options for los angeles.
break;
}
// If you want to hide the squadron select list until a city is
// selected then you can do another conditional.
if ($city !== 'default') {
$form['squadron_wrapper']['squadron'] = array(
'#type' => 'select',
'#title' => t('Squadron'),
'#options' => $squadron_options,
);
}
Muchas gracias a jordojuice arriba. Con su ayuda logré encontrar una solución. También me referí al ejemplo en http://public-action.org/content/drupal-7-form-api-dependent-lists-and-ajax-form-submission . Finalmente utilicé el siguiente código que funcionaba en un módulo personalizado. Por alguna razón, no pude encontrar ninguno de mis valores en los valores $ form_state, pero pude encontrarlos en $ form. Finalmente, cuando probé, recibí un mensaje de error de que Drupal había detectado una elección ilegal en el menú desplegable. Lo resolví comentando la línea 1290 en form.inc:
form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
El código final que utilicé fue:
fuente
poner la línea de código, es decir,
$nodes[''] = '- None -';
despuésen tu
sappers_squadron_squadrons function
y eso resolverá tu errorform_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
fuente
La causa raíz de "Se ha detectado una elección ilegal. Póngase en contacto con el administrador del sitio". es que la cadena vacía con el valor de 0 agregado por
$nodes[]="";
no es válida para el campo field_squadron.Consulte Programación y desarrollo avanzado de PHP , pero tenga en cuenta que DANGEROUS_SKIP_CHECK y los indicadores validados están en desuso en D7 .
Después de eliminar esa línea, el error desapareció.
fuente
Utilice el módulo de límite de opción de campo de referencia
fuente