it-swarm.com.de

Ändern Sie $ form_state in AJAX Rückruf

Ich erstelle ein Formular, das das Attribut der Formular-API '#ajax' Verwendet, und ich muss Änderungen an $form_state Vornehmen, 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 an $form_state Vorgenommen habe, scheint verloren zu sein, sobald der Rückruf beendet ist. Gibt es eine Möglichkeit, in dieser Funktion eine Änderung an $form_state Vorzunehmen, oder gibt es eine andere Funktion, die ich stattdessen dafür verwenden sollte?

EDIT

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!

16
MW.

Sie müssen $form_state als Referenz; Die Funktion AJAX) muss wie im folgenden Beispiel definiert werden:

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 
3
nourcy

Ich bin nicht sicher, ob es eine direkte Antwort auf Ihre Frage ist, aber es könnte für Sie funktionieren. Anwendungsfall: Anstatt den $ form_state zu ändern, fügen Sie Ihrem $ form Werte hinzu. Wenn Sie nicht möchten, dass sie angezeigt werden, verwenden Sie einfach #hidden.

0
Malks