Zmień $ form_state w wywołaniu zwrotnym AJAX

16

Tworzę formularz, który korzysta z '#ajax'atrybutu API formularza i muszę wprowadzić zmiany $form_statepo naciśnięciu przycisku obsługującego AJAX. Oto co mam:

Wewnątrz mojej funkcji konstruktora formularzy:

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

...

A oto funkcja oddzwaniania:

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'];
}

Zmiana, którą wprowadziłem, $form_statewydaje się być utracona po zakończeniu oddzwaniania. Czy jest jakiś sposób na zmianę $form_statew tej funkcji, czy jest jakaś inna funkcja, której powinienem użyć do tego?

EDYTOWAĆ

Jak się okazuje, wywołanie zwrotne jest niewłaściwym miejscem do wykonania tej logiki. Zamiast tego u góry funkcji konstruktora formularzy dodałem:

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

Oczywiście musiałem nadać guzikowi nazwę:

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

A teraz to działa!

MW.
źródło

Odpowiedzi:

3

Musisz przekazać $form_statejako odniesienie; funkcję AJAX należy zdefiniować jak w poniższym przykładzie:

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 
pożywka
źródło
Aby to wyjaśnić, musisz użyć &, aby przekazać referencję, a nie wartość. Bez tego modyfikujesz tylko kopię $ form_state.
Malks,
Tak, jeśli tego nie zrobisz, zmodyfikujesz tylko zmienną lokalną.
nourcy,
1
Oczywiście nie myślałem o tym. Niestety nie przyniosło to żadnego efektu - wszelkie zmiany wprowadzone w $ form_state są ignorowane w kreatorze formularzy, a przy następnym wywołaniu AJAX $ form_state jest przywracane. Czy to możliwe, że formularz został już wygenerowany do czasu wykonania wywołania zwrotnego? Czy istnieje sposób, aby zamiast tego uruchomić niestandardową procedurę obsługi przesyłania dla tego przycisku?
MW.
Spróbuj zmienić typ z przycisku, aby przesłać
nourcy
0

Nie jestem pewien, czy jest to bezpośrednia odpowiedź na twoje pytanie, ale może ci się przydać przypadek: Zamiast zmieniać wartość $ form_state, dodaj wartości do formularza $. Jeśli nie chcesz, żeby się wyświetlały, po prostu użyj #hidden.

Malks
źródło