Tôi đang tạo một biểu mẫu sử dụng '#ajax'
thuộc tính API của biểu mẫu và tôi cần thay đổi $form_state
khi nhấn nút kích hoạt AJAX. Đây là những gì tôi đã có:
Bên trong chức năng xây dựng biểu mẫu của tôi:
...
$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',
),
);
...
Và đây là chức năng gọi lại:
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'];
}
Thay đổi tôi đã thực hiện $form_state
dường như bị mất sau khi cuộc gọi lại kết thúc. Có cách nào để thực hiện thay đổi $form_state
trong chức năng này không, hoặc có bất kỳ chức năng nào khác tôi nên sử dụng cho việc này thay thế không?
BIÊN TẬP
Hóa ra, cuộc gọi lại là nơi sai lầm để thực hiện logic này. Thay vào đó, ở đầu hàm xây dựng biểu mẫu, tôi đã thêm vào đây:
// 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' => '');
}
Tất nhiên, tôi phải đặt tên cho nút:
$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',
),
);
Và bây giờ nó hoạt động!