これを実現するには、Ajaxを使用できます。Drupal 7は現在、Ajaxを適切にサポートしています。最初の選択リスト(市)で、Ajax情報を追加する必要があります。次に、2番目の選択リストを最初の情報に基づいて入力できます。最初のオプションが選択されるまで、2番目の選択リストを非表示にすることもできます。その方法を少し説明します。最初に、基本フォームをセットアップします。
$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,
);
これは要素の基本的なセットアップにすぎません。ここで、どのオプションが戦隊に入るべきかを決定する方法が必要になります。最初に、「city」選択リストでAjaxコールバックを識別する必要があります。ほとんどの場合、ajax要素をラップする要素、この場合は$ formを返すことができます。
function mymodule_ajax_callback($form, $form_state) {
return $form;
}
ここで、「都市」選択リストが変更されると、フォームの戦隊ラッパー部分が再構築されます。「市」の値は$ form_state ['values']になります。そのため、フォームを再構築するときに、「city」の値に基づいて選択リストに与えるオプションを決定する必要があります。
// 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,
);
}