it-swarm.com.de

Mehrere Formulare auf derselben Seite verursachen Konflikte?

Ich habe den folgenden Code.

function mymodule_get_node_create_or_edit_form($nodeType = '', $inputNode = null, $prepopulationFields = array())
{
  if (empty($inputNode))
  {
    $values = array(
      'type' => $nodeType,
    );
    $values = array_merge($values, $prepopulationFields);
    $node = \Drupal::entityTypeManager()
      ->getStorage('node')
      ->create($values);
    $form = \Drupal::service('entity.form_builder')->getForm($node);
  }
  else
  {
    $form = \Drupal::entityTypeManager()
      ->getFormObject('node', 'default')
      ->setEntity($inputNode);
    $form = \Drupal::formBuilder()->getForm($form);
  }

  return \Drupal::service('renderer')->render($form);
}

Ich benutze diese Funktion, um Bearbeitungsformulare für einen Knoten zu erstellen. So kann ich zum Beispiel ein Formular erstellen, mit dem ein Formular erstellt werden kann:

print mymodule_get_node_create_or_edit_form('page', null, array());

Oder ich kann das Bearbeitungsformular bekommen:

$node = node_load(1);
print mymodule_get_node_create_or_edit_form($node->getType(), $node , array());

Das Problem ist, wenn ich beide auf derselben Seite ausführe. Z.B:

print mymodule_get_node_create_or_edit_form('page', null, array());
$node = node_load(1);
print mymodule_get_node_create_or_edit_form($node->getType(), $node , array());

Wenn ich jetzt Änderungen an Knoten 1 vornehme, anstatt ihn zu speichern, wird ein neuer Knoten mit den von mir vorgenommenen Änderungen erstellt, anstatt den vorhandenen Knoten tatsächlich zu bearbeiten.

4
coderama

Ich hatte kürzlich das gleiche Problem und fand eine Problemumgehung im entsprechenden Drupal Kernproblem: Das gleiche Formular zweimal auf einer Seite mit unterschiedlichen Argumenten kann das falsche Formular verarbeiten, wenn es gesendet wird .

Der dritte Kommentar schlägt vor, FormState Caching zu aktivieren, und das hat bei mir großartig funktioniert.

$form_state->setRequestMethod('POST');
$form_state->setCached(TRUE);
2
izus

Um die in Das gleiche Formular zweimal auf einer Seite mit unterschiedlichen Argumenten vorgeschlagene Problemumgehung anzuwenden, wird möglicherweise das falsche Formular verarbeitet, wenn es gesendet wird benötigen Sie eine Instanz einer Klasse, die FormStateInterface implementiert =. Es kann nicht auf den von Ihnen verwendeten Code angewendet werden, da Sie keine Instanz einer Klasse haben, die FormStateInterface implementiert.

Ändern der Formular-ID für jedes Formular, das im Wesentlichen die Drupal 8) ist, um das zu erreichen, was hook_forms() in Drupal 7) erreicht hat (siehe - hook_forms () wurde entfernt ), würde eine Unterklasse erfordern, die als @ internal (the NodeForm class) und ändern Sie die Entität Node, um ihre Bearbeitungsform zu ändern.

Ich würde stattdessen hook_ENTITY_TYPE_prepare_form() implementieren.

function mymodule_node_prepare_form(EntityInterface $entity, $operation, FormStateInterface $form_state) {
  if ($operation == 'edit') {
    $form_state->setRequestMethod('POST');
    $form_state->setCached(TRUE);
  }
}

Die andere Funktion ist weiterhin erforderlich. So würde ich es umsetzen.

function mymodule_get_node_edit_form($node, array $entity_values = []) {
  if (is_string($node)) {
    $node = \Drupal::entityTypeManager()->getStorage('node')
      ->create(array_merge(['type' => $node], $entity_values));
  }
  $form = \Drupal::service('entity.form_builder')->getForm($node, 'edit');
  return \Drupal::service('renderer')->render($form);
}

Im Wesentlichen wende ich die in Das gleiche Formular zweimal auf einer Seite mit unterschiedlichen Argumenten angegebene Problemumgehung kann das falsche Formular verarbeiten, wenn es gesendet wird innerhalb eines Hooks an.

2
kiamlaluno

Gemäß den Kommentaren in der ursprünglichen Frage wird das Problem behoben, indem die Formulare dem Render-Array hinzugefügt werden, anstatt print direkt zu verwenden.

1
Ismail Cherri

Ich bin in Drupal 6 auf dieses Problem gestoßen, und zu der Zeit bestand die Lösung darin, hook_forms Zu verwenden. Diese Funktion war in Drupal 7 noch vorhanden ( siehe Hook_forms-Dokumente für Drupal 7 ), wurde jedoch aus Drupal 8 entfernt. Es gibt einen Änderungsdatensatz für Drupal 8 darüber, wie hook_forms wurde entfernt und wie Code migriert wird.

Vielleicht wird auf diesen Dokumentationsseiten klar, was Sie tun müssen?

0
greggles