it-swarm.com.de

Formularfelder nach AJAX submit) löschen

Gegeben:

  • Ich benutze Drupal 8.
  • Ich habe ein benutzerdefiniertes "Formular hinzufügen" des benutzerdefinierten Entitätstyps.
  • Formular hat eine Ajax-Einreichung.

Problem:

  • Wenn ich ein Formular abschicke, bleiben alle Werte in Feldern.

Erwartet:

  • Formularfelder sollten nach dem Absenden gelöscht werden.

Formularquellcode:

<?php

namespace Drupal\mymodule\Form;

use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Form\FormStateInterface;

/**
 * Form controller for the add/edit entity forms.
 */
class MymoduleForm extends ContentEntityForm {

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildForm($form, $form_state);

    $form['#prefix'] = "<div id=\"{$this->getFormId()}-wrapper\">";
    $form['#suffix'] = '</div>';

    $form['actions']['submit']['#ajax'] = [
      'wrapper' => $this->getFormId() . '-wrapper',
      'callback' => array($this, 'ajaxRebuildCallback'),
      'effect' => 'fade',
    ];

    return $form;
  }

  /**
   * Callback for ajax form submission.
   *
   * @param array $form
   *   An associative array containing the structure of the form.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The current state of the form.
   *
   * @return array
   *   The rebuilt form.
   */
  public function ajaxRebuildCallback(array $form, FormStateInterface $form_state) {
    drupal_set_message(t('Entity was successfully created'));

    // @todo Clear form values.
    //$form_state->setRebuild(TRUE);
    //$form_state->setValues([]);
    /*$entity = \Drupal::entityTypeManager()->getStorage('liveblog_post')->create([]);
    $form_object = \Drupal::entityTypeManager()
      ->getFormObject('liveblog_post', 'add')
      ->setEntity($entity);*/
    //$new_form_state = new FormState();
    //$form = \Drupal::formBuilder()->rebuildForm($this->getFormId(), $form_state);

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function save(array $form, FormStateInterface $form_state) {
    $entity = $this->getEntity();
    $entity->save();
  }

}

P.S. Sie finden meine Versuche in der Methode ajaxRebuildCallback().

7
milkovsky

@ Berdirs Antwort half mir, die Lösung herauszufinden. Wir sollten zwar die Benutzereingaben löschen, aber wir können nicht einfach $form_state->setUserInput([]) sagen, da es einige Systemwerte gibt, die bleiben sollten (z. B. form_id, form_token, _triggering_element_name Usw.).

Ich habe eine benutzerdefinierte Methode dafür erstellt:

  /**
   * Clears form input.
   *
   * @param array $form
   *   The form.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form state.
   */
  protected function clearFormInput(array $form, FormStateInterface $form_state) {
    // Replace the form entity with an empty instance.
    $this->entity = $this->entityTypeManager->getStorage('my_entity_type')->create([]);
    // Clear user input.
    $input = $form_state->getUserInput();
    // We should not clear the system items from the user input.
    $clean_keys = $form_state->getCleanValueKeys();
    $clean_keys[] = 'ajax_page_state';
    foreach ($input as $key => $item) {
      if (!in_array($key, $clean_keys) && substr($key, 0, 1) !== '_') {
        unset($input[$key]);
      }
    }
    $form_state->setUserInput($input);
    // Rebuild the form state values.
    $form_state->setRebuild();
    $form_state->setStorage([]);
  }

Ich rufe $this->clearFormInput($form, $form_state); in der Methode MymoduleForm::save() auf (der allerletzte Schritt der Übermittlung).

8
milkovsky

Sie suchen nach https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormStateInterface.php/function/FormStateInterface%3A%3AsetUserInput/8.2.x .

Die Werte sind die validierte Eingabe. Zum Festlegen der Standardwerte berücksichtigt das Formularsystem die ursprüngliche Benutzereingabe, die Sie mit der obigen Methode ändern können.

Bei Entitätsformularen ist dies jedoch etwas komplizierter. $ this-> entity ist ein Verweis auf die Entität, das haben Sie immer noch und es wird darauf zurückgreifen. Was Sie wahrscheinlich tun müssen, ist, eine neue Entität in save zu erstellen, sie $ this-> entity zuzuweisen, dann die Benutzereingabe zu leeren und $ form_state-> setRebuild (). Das sollte dann das Formular mit einer neuen und leeren Entität neu erstellen.

8
Berdir