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,
);
}
Un grand merci à jordojuice ci-dessus. Avec son aide, j'ai réussi à trouver une solution. J'ai également fait référence à l'exemple à http://public-action.org/content/drupal-7-form-api-dependent-lists-and-ajax-form-submission . J'ai finalement utilisé le code ci-dessous qui fonctionnait dans un module personnalisé. Pour une raison quelconque, je n'ai trouvé aucune de mes valeurs dans les valeurs $ form_state, mais j'ai pu les trouver sous $ form. Enfin, lorsque j'ai testé, je recevais un message d'erreur indiquant que Drupal avait détecté un choix illégal dans la liste déroulante. J'ai contourné cela en commentant la ligne 1290 dans form.inc:
form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
Le code final que j'ai utilisé était:
la source
mettre la ligne de code c'est
$nodes[''] = '- None -';
à dire aprèsen ur
sappers_squadron_squadrons function
et cela résoudra votre erreurform_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
la source
La cause première de "Un choix illégal a été détecté. Veuillez contacter l'administrateur du site." est que la chaîne vide avec la valeur 0 ajoutée par
$nodes[]="";
n'est pas valide pour le champ field_squadron.Voir Advance PHP Programming and Development , mais gardez à l'esprit que le DANGEROUS_SKIP_CHECK et les drapeaux validés sont déconseillés dans D7 .
Après avoir supprimé cette ligne, l'erreur a disparu.
la source
Utiliser le module de limite d'option Champ de référence
la source