Змінення $ form_state в зворотному дзвінку AJAX


16

Я створюю форму, яка використовує '#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цю функцію, або якась інша функція я повинна використовувати для цього?

EDIT

Як виявляється, зворотний виклик - це неправильне місце для цієї логіки. Натомість у верхній частині функції побудови форми я додав це:

// 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',
  ),
);

А тепер це працює!

Відповіді:


3

Вам потрібно пройти $form_stateяк довідку; функцію AJAX потрібно визначити як у наступному прикладі:

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

Для уточнення вам потрібно пройти & за посиланням, а не за значенням. Без нього ви лише змінюєте копію $ form_state.
Малкс

Так, якщо ви цього не зробите, ви лише змінюєте локальну змінну.
годувати

1
Звичайно, не думав про це. На жаль, це не мало жодного ефекту - будь-яка зміна, внесена до $ form_state, ігнорується в конструкторі форм, і наступного разу, коли буде здійснено виклик AJAX, $ form_state буде повернено. Чи може бути, що форма вже сформована до моменту виконання зворотного дзвінка? Чи існує спосіб замість цього запустити спеціальний обробник подачі для цієї кнопки?
МВт.

Спробуйте змінити тип з кнопки на подання
підготуйте

0

Я не впевнений, що це пряма відповідь на ваше запитання, але це може спрацювати у вашому випадку: Замість того, щоб змінювати $ form_state, додайте значення до вашої форми $. Якщо ви не хочете, щоб вони показували, просто використовуйте #hidden.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.