Змінення $ 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.