Saya membuat formulir yang menggunakan '#ajax'
atribut API bentuk , dan saya perlu membuat perubahan $form_state
ketika tombol yang diaktifkan AJAX ditekan. Inilah yang saya punya:
Di dalam fungsi form builder saya:
...
$form['some_fieldset']['add_more'] = array(
'#type' => 'button',
'#value' => t('Add more rows'),
'#ajax' => array(
'wrapper' => 'some-fieldset',
'callback' => 'my_module_settings_ajax',
'method' => 'replace',
'effect' => 'fade',
),
);
...
Dan inilah fungsi callback:
function my_module_settings_ajax($form, $form_state) {
// Make a change to $form_state
if ($form_state['some_fieldset']['add_more']) {
$form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
'second_field' => '');
}
return $form['some_fieldset'];
}
Perubahan yang saya buat $form_state
tampaknya hilang begitu panggilan balik selesai. Apakah ada cara untuk melakukan perubahan $form_state
pada fungsi ini, atau ada fungsi lain yang harus saya gunakan untuk ini?
EDIT
Ternyata, panggilan balik adalah tempat yang salah untuk melakukan logika ini. Sebagai gantinya, di bagian atas fungsi pembuat formulir, saya menambahkan ini:
// Respond to AJAX-triggger:
// Add new row
if ($form_state['triggering_element']['#name'] == 'add_more') {
$form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
'second_field' => '');
}
Tentu saja, saya harus memberi tombol nama:
$form['some_fieldset']['add_more'] = array(
'#type' => 'button',
'#name' => 'add_more', // <-- Right here
'#value' => t('Add more rows'),
'#ajax' => array(
'wrapper' => 'some-fieldset',
'callback' => 'my_module_settings_ajax',
'method' => 'replace',
'effect' => 'fade',
),
);
Dan sekarang berhasil!
Saya tidak yakin bahwa itu adalah jawaban langsung untuk pertanyaan Anda, tetapi mungkin berfungsi untuk Anda menggunakan case: Alih-alih mengubah nilai tambah $ form_state ke $ form Anda. Jika Anda tidak ingin mereka tampil, gunakan saja
#hidden
.sumber