it-swarm.com.de

$ form_state-> setValue () speichert keinen Wert

Ich habe einen Validierungscode:

public function validateForm(array &$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);

    $form_state->setValue('my_variable', $form_state->getValue('my_variable') + 1);
    $form_state->setRebuild();
}

Und ich habe zuvor my_variable Auf 1 Gesetzt, wenn es NULL ist:

public function buildForm(array $form, FormStateInterface $form_state) {

    if($form_state->getValue('my_variable') == NULL){
        $form_state->setValue('my_variable', 1);
    }
...

Ich verwende Ajax Callback für die Formularübermittlung und die Validierung funktioniert einwandfrei. Nach dem Klicken auf die Schaltfläche "Senden" wird my_variable Angezeigt und 2 Angezeigt (vor dem Senden ist es 1).

Aber wenn ich erneut auf die Schaltfläche "Senden" klicke, wird anstelle von 2 Erneut 3 Angezeigt. Wenn ich die Seite erneut lade, fehlen die Daten (daher wird wieder der Wert 1 Erhalten).

Wie kann man den Wert durchsetzen? Es sieht so aus, als würde ich eine Kopie von $form_state Anstelle einer Referenz verwenden, aber ich kann nicht & $ form_state (public function validateForm(array &$form, FormStateInterface &$form_state)) schreiben, weil es mir einen Fehler gibt (wie es ist) nicht die korrekte Deklaration der validateForm-Methode).

4
PolGraphic

Der Wert in $form_state (eigentlich alles) geht verloren, nachdem der Prozess PHP) beendet ist. Es gibt also keine Möglichkeit, Ihr my_variable Wert über die $form_state. Ihre beste Option ist es, diesen Wert in der Sitzung zu speichern, denke ich.

Beispiel:

  public function validateForm(array &$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);

    $session = \Drupal::request()->getSession();
    $session->set('my_variable', $session->get('my_variable') + 1);
  }

  public function buildForm(array $form, FormStateInterface $form_state) {
    $session = \Drupal::request()->getSession();

    if (empty($session->get('my_variable'))) {
      $session->set('my_variable', 1);
    }
  }

Beachten Sie, dass die Daten verloren gehen, sobald der Benutzer seine Cookies löscht und/oder die Sitzungen ungültig werden. Wenn Sie einen permanenten globalen Speicher benötigen (für alle Benutzer), verwenden Sie State API . Verwenden Sie für einen permanenten Speicher pro Benutzer die Datenbank-API .

1
mvdgun

Wenn es sich um eine benutzerdefinierte Variable handelt, sollten Sie $form_state->set('property_name', 'value') (anstelle von "$form_state->setValue(...)") verwenden.

Beispiel:

public function validateForm(array &$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);

    // Update custom variable (in PHP "null + 1" equals one)
    $form_state->set('my_variable', $form_state->get('my_variable') + 1);

    // Below is only required when your "buildForm(...)" depends on the variable
    $form_state->setRebuild();
}

1
Top-Master

Nur zum Hinzufügen, wenn Sie tatsächlich einen Formularwert speichern möchten. Wenn ich ein Webformular verwende, mache ich Folgendes: Ich kann mir vorstellen, dass es leicht für ein normales Formular geändert werden kann.

$form['elements']['form_element']['#default_value'] = 'my_value'

0
Daniel Dewhurst