Ich erstelle ein Formular, das das Formular-API- '#ajax'
Attribut verwendet, und ich muss Änderungen vornehmen, $form_state
wenn die AJAX-fähige Schaltfläche gedrückt wird. Folgendes habe ich:
In meiner Form Builder-Funktion:
...
$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',
),
);
...
Und hier ist die Rückruffunktion:
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'];
}
Die Änderung, die ich vorgenommen habe, $form_state
scheint verloren zu sein, wenn der Rückruf beendet ist. Gibt es eine Möglichkeit, $form_state
diese Funktion zu ändern , oder eine andere Funktion, die ich stattdessen verwenden sollte?
BEARBEITEN
Wie sich herausstellt, ist der Rückruf der falsche Ort, um diese Logik auszuführen. Stattdessen habe ich oben in der Form Builder-Funktion Folgendes hinzugefügt:
// 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' => '');
}
Natürlich musste ich dem Button den Namen geben:
$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',
),
);
Und jetzt funktioniert es!
Ich bin mir nicht sicher, ob es eine direkte Antwort auf Ihre Frage ist, aber es kann in Ihrem Anwendungsfall funktionieren: Anstatt den $ form_state zu ändern, fügen Sie Werte zu Ihrem $ form hinzu. Wenn Sie nicht möchten, dass sie angezeigt werden, verwenden Sie einfach
#hidden
.quelle