Tworzę formularz, który korzysta z '#ajax'
atrybutu API formularza i muszę wprowadzić zmiany $form_state
po 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_state
wydaje się być utracona po zakończeniu oddzwaniania. Czy jest jakiś sposób na zmianę $form_state
w 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!
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
.źródło