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!

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) { /* … */ } 

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.