Anda dapat menggunakan Ajax untuk mencapai ini. Drupal 7 memiliki dukungan Ajax yang baik sekarang. Pada daftar pilih (kota) pertama Anda, Anda perlu menambahkan informasi Ajax. Kemudian, daftar pilih kedua dapat diisi berdasarkan informasi di yang pertama. Anda bahkan dapat menyembunyikan daftar pilih kedua sampai opsi di yang pertama dipilih, dan saya akan menjelaskan bagaimana melakukannya sedikit. Pertama, untuk mengatur bentuk dasar:
$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,
);
Ini hanya pengaturan dasar elemen. Sekarang Anda akan membutuhkan cara untuk menentukan opsi apa yang harus masuk dalam skuadron. Pertama, Anda perlu membuat panggilan balik Ajax Anda diidentifikasi di daftar pilih 'kota'. Dalam kebanyakan kasus, Anda bisa mengembalikan elemen yang membungkus elemen ajax, dalam hal ini $ form.
function mymodule_ajax_callback($form, $form_state) {
return $form;
}
Sekarang, ketika perubahan daftar pilih 'kota' itu akan membangun kembali bagian skuadron-pembungkus formulir. Nilai 'kota' Anda sekarang akan berada di $ form_state ['nilai']. Jadi, ketika formulir dibangun kembali kita perlu menentukan opsi apa yang akan diberikan ke daftar pilih berdasarkan nilai 'kota'.
// 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,
);
}
Banyak terima kasih kepada jordojuice di atas. Dengan bantuannya saya berhasil menemukan solusi. Saya juga merujuk pada contoh di http://public-action.org/content/drupal-7-form-api-dependent-lists-and-ajax-form-smission . Saya akhirnya menggunakan kode di bawah ini yang berfungsi dalam modul khusus. Untuk beberapa alasan saya tidak dapat menemukan nilai saya di nilai $ form_state, tetapi dapat menemukannya dalam $ form. Akhirnya, ketika saya mengujinya, saya mendapatkan pesan kesalahan bahwa Drupal telah mendeteksi pilihan ilegal di drop-down. Saya menyelesaikan ini dengan mengomentari baris 1290 dalam form.inc:
form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
Kode terakhir yang saya gunakan adalah:
sumber
letakkan baris kode yaitu
$nodes[''] = '- None -';
setelahdi ur Anda
sappers_squadron_squadrons function
dan itu akan menyelesaikan kesalahan Andaform_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
sumber
Akar penyebab "Pilihan ilegal telah terdeteksi. Silakan hubungi administrator situs." adalah bahwa string kosong dengan nilai 0 ditambahkan oleh
$nodes[]="";
tidak valid untuk bidang field_squadron.Lihat Pemrograman dan Pengembangan PHP Lanjutan , tetapi perlu diingat bahwa DANGEROUS_SKIP_CHECK dan flag yang divalidasi tidak digunakan lagi dalam D7 .
Setelah saya menghapus garis itu, kesalahan itu hilang.
sumber
Gunakan modul batas opsi bidang referensi
sumber