ฉันกำลังสร้างแบบฟอร์มที่ใช้'#ajax'
แอตทริบิวต์API แบบฟอร์มและฉันต้องทำการเปลี่ยนแปลง$form_state
เมื่อกดปุ่มเปิดใช้งาน AJAX นี่คือสิ่งที่ฉันได้รับ:
ภายในฟังก์ชันตัวสร้างแบบฟอร์มของฉัน:
...
$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',
),
);
...
และนี่คือฟังก์ชันการเรียกกลับ:
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'];
}
การเปลี่ยนแปลงที่ฉันทำ$form_state
ดูเหมือนจะหายไปเมื่อการโทรกลับเสร็จสิ้น มีวิธีใดบ้างที่จะเปลี่ยนแปลง$form_state
ในฟังก์ชั่นนี้หรือมีฟังก์ชั่นอื่นที่ฉันควรใช้แทนสิ่งนี้?
แก้ไข
เมื่อปรากฎว่าการโทรกลับเป็นสถานที่ที่ผิดในการทำตรรกะนี้ ที่ด้านบนของฟังก์ชั่นตัวสร้างฟอร์มฉันเพิ่มสิ่งนี้แทน:
// 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' => '');
}
แน่นอนฉันต้องให้ชื่อปุ่ม:
$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',
),
);
และตอนนี้มันใช้งานได้!