Thay đổi $ form_state trong cuộc gọi lại AJAX


16

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_statekhi 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_statedườ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_statetrong 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!

Câu trả lời:


3

Bạn cần phải vượt qua $form_statenhư tham khảo; hàm AJAX cần được định nghĩa như trong ví dụ sau:

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 

Để làm rõ, bạn cần & chuyển qua tham chiếu thay vì theo giá trị. Không có nó, bạn chỉ sửa đổi một bản sao của $ form_state.
Malks

Có, nếu bạn không làm điều này, bạn chỉ sửa đổi một biến cục bộ.
nuôi dưỡng

1
Tất nhiên, đã không nghĩ về điều đó. Thật không may, nó không có bất kỳ ảnh hưởng nào - mọi thay đổi được thực hiện đối với $ form_state đều bị bỏ qua trong trình tạo biểu mẫu và lần tiếp theo cuộc gọi AJAX được thực hiện, $ form_state được hoàn nguyên. Có thể là biểu mẫu đã được tạo vào thời điểm cuộc gọi lại thực thi? Thay vào đó, có cách nào để chạy trình xử lý trình tùy chỉnh cho nút này không?
MW.

Cố gắng thay đổi loại từ nút để gửi
nourcy

0

Tôi không chắc chắn rằng đó là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng nó có thể phù hợp với trường hợp sử dụng của bạn: Thay vì thay đổi giá trị $ form_state thêm vào biểu mẫu $ của bạn. Nếu bạn không muốn họ thể hiện chỉ sử dụng #hidden.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.