คุณสามารถใช้ Ajax เพื่อทำสิ่งนี้ให้สำเร็จ Drupal 7 ได้รับการสนับสนุน Ajax ที่ดีในขณะนี้ ในรายการเลือก (เมือง) แรกของคุณคุณจะต้องเพิ่มข้อมูล Ajax จากนั้นรายการที่เลือกที่สองสามารถเติมข้อมูลตามข้อมูลในรายการแรก นอกจากนี้คุณยังสามารถซ่อนรายการตัวเลือกที่สองได้จนกว่าจะมีการเลือกตัวเลือกในตัวเลือกแรกและฉันจะอธิบายวิธีทำเช่นนั้นในอีกสักครู่ ก่อนอื่นให้ตั้งค่ารูปแบบพื้นฐาน:
$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,
);
นี่เป็นเพียงการตั้งค่าพื้นฐานขององค์ประกอบ ตอนนี้คุณต้องมีวิธีในการพิจารณาว่าตัวเลือกใดควรเป็นฝูงบิน ก่อนอื่นคุณต้องทำการโทรกลับ Ajax ของคุณที่ระบุไว้ในรายการเลือก 'เมือง' ในกรณีส่วนใหญ่คุณสามารถส่งคืนองค์ประกอบที่ล้อมรอบองค์ประกอบ ajax ในรูปแบบ $ case
function mymodule_ajax_callback($form, $form_state) {
return $form;
}
ตอนนี้เมื่อรายการ 'เลือกเมือง' เปลี่ยนไปมันจะสร้างส่วนห่อหุ้มฝูงบินของแบบฟอร์มใหม่ ค่า 'เมือง' ของคุณจะเป็น $ form_state ['values'] ดังนั้นเมื่อมีการสร้างแบบฟอร์มขึ้นใหม่เราจำเป็นต้องพิจารณาว่าตัวเลือกใดบ้างที่จะมอบให้กับรายการที่เลือกตามค่าของ 'เมือง'
// 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,
);
}