Ändern Sie $ form_state in AJAX Callback

16

Ich erstelle ein Formular, das das Formular-API- '#ajax'Attribut verwendet, und ich muss Änderungen vornehmen, $form_statewenn 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_statescheint verloren zu sein, wenn der Rückruf beendet ist. Gibt es eine Möglichkeit, $form_statediese 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!

MW.
quelle

Antworten:

3

Sie müssen $form_stateals Referenz übergeben; Die AJAX-Funktion muss wie im folgenden Beispiel definiert werden:

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 
nourcy
quelle
Zur Verdeutlichung müssen Sie das & als Referenz und nicht als Wert übergeben. Ohne es ändern Sie nur eine Kopie von $ form_state.
Malks
Ja, wenn Sie dies nicht tun, ändern Sie nur eine lokale Variable.
Nourcy
1
Natürlich habe ich nicht daran gedacht. Leider hatte dies keine Auswirkungen - Änderungen an $ form_state werden im Form Builder ignoriert und beim nächsten AJAX-Aufruf wird $ form_state zurückgesetzt. Könnte es sein, dass das Formular zum Zeitpunkt der Ausführung des Rückrufs bereits generiert wurde? Gibt es eine Möglichkeit, stattdessen einen benutzerdefinierten Submit-Handler für diese Schaltfläche auszuführen?
MW.
Versuchen Sie, die Art von Taste ändern einreichen
nourcy
0

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.

Malks
quelle