Vous pouvez utiliser Ajax pour cela. Drupal 7 a maintenant un bon support Ajax. Sur votre première liste de sélection (ville), vous devrez ajouter des informations Ajax. Ensuite, la deuxième liste de sélection peut être remplie en fonction des informations de la première. Vous pouvez également masquer la deuxième liste de sélection jusqu'à ce qu'une option de la première soit sélectionnée, et je vais vous expliquer comment le faire dans un instant. Tout d'abord, pour configurer le formulaire de base:
$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,
);
Ce n'est que la configuration de base des éléments. Maintenant, vous aurez besoin d'un moyen de déterminer quelles options devraient aller dans l'escadron. Vous devez d'abord faire votre rappel Ajax identifié dans la liste de sélection «ville». Dans la plupart des cas, vous pouvez simplement renvoyer l'élément qui enveloppe l'élément ajax, dans ce cas $ form.
function mymodule_ajax_callback($form, $form_state) {
return $form;
}
Désormais, lorsque la liste de sélection «ville» change, elle reconstruit la partie enveloppe de l'escadron du formulaire. Votre valeur 'city' sera désormais dans $ form_state ['values']. Ainsi, lorsque le formulaire est reconstruit, nous devons déterminer les options à donner à la liste de sélection en fonction de la valeur de «ville».
// 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,
);
}