Wie implementieren Sie einen benutzerdefinierten Submit-Handler in hook_form_alter ()?


16

Ich habe eines meiner Drupal 7-Module auf 8 aktualisiert und habe ein Problem mit meiner Formularänderung. Ich füge eine Validierungsfunktion und einen Submit-Handler hinzu. Die Validierungsfunktion wird gerade aufgerufen, aber die Submit-Funktion wird nicht ausgelöst. Ich frage mich, ob dies bedeutet, dass es einen Symfony-ähnlichen Ansatz gibt, mit dem Übergabehandler zu vorhandenen Formularen hinzugefügt werden müssen. Ich habe viel gesucht und kann keine Beispiele finden. Ich habe auch einige in Arbeit befindliche D8-Module durchgesehen, aber ich habe dort auch keine wirklichen Arbeitsbeispiele gefunden.

Hat jemand eine Ahnung, was der richtige Drupal 8-Weg dazu ist?


2
Sie sollten Ihren vorhandenen Code posten, damit die Leute ihn sich ansehen und Probleme erkennen / Alternativen vorschlagen können.
Yuriy Babenko

Ab D8 Beta9 gibt es Getter und Setter für Submit-Handler, aber ich konnte sie scheinbar nicht zum Laufen bringen und habe die unten stehende Antwort verwendet. Ich würde hoffen, dass die Node-Schnittstelle in Zukunft einige Ereignisse auslöst, da ich lieber ein Ereignis abonnieren würde, als einen Hook zu verwenden.
Alex Finnarn

Antworten:


13

Entsprechend dem Beispiel in der Dokumentation ist es dasselbe wie für Drupal 7:

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

Sie finden ähnliche (funktionierende) Logik in

Und noch ein paar andere.


1
Ich kann mit den API-Dokumenten nicht streiten. Wahrscheinlich ist etwas verrückt mit meiner Implementierung, ich werde tiefer graben.
Arbee

Siehe mein Update oben, abgesehen von $ form ['actions'] ['submit'] gibt es auch die Abschnitte $ form ['actions'] ['publish'] und ['unpublish'], an die Submit-Handler angehängt werden können.
Arbee

Ich musste $ form ['actions'] ['publish'] ['# submit'] [] anstelle von $ form ['actions'] ['submit'] ['# submit'] [] für meinen submit-Handler verwenden zu arbeiten, als der Knoten veröffentlicht wurde. Es scheint jedoch nicht möglich zu sein, den Rückruf zum Laufen zu bringen, wenn der Knoten zum ersten Mal als unveröffentlicht gespeichert wird.
Alex Finnarn

6

Sie können mit dem folgenden Code hinzufügen, wie viele Submit-Handler Sie möchten:

 $form['actions']['submit']['#submit'][] = 'mymodule_what_ever_function';

Wenn Sie nach dem standardmäßigen Submit-Handler einen Submit-Handler hinzufügen möchten (einen Submit-Handler, der nach dem Submit-Rückruf aufgerufen wird), können Sie Folgendes verwenden.

$form['#submit'][1] = test_function;

So entfernen Sie den Submit-Handler:

unset($form["actions"]['submit']);

3

Das Verhalten ist entweder geändert oder von Fall zu Fall unterschiedlich. Mit dem Bestätigungsformular zum Löschen mehrerer Knoten

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

@ Clives Code bewirkt, dass Drupal den Haupt-Handler ignoriert. In diesem Fall fügen Sie den Handler dem $form['#submit']Abschnitt hinzu:

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';

1

So hängen Sie einen benutzerdefinierten Submit-Handler an das Add / Edit-Formular des Artikelknotens in Drupal 8 an:

<?php

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Use this to reveal the form id.
  //drupal_set_message($form_id);

  // Use this with the devel module to inspect the button action(s).
  //kint($form['actions']);

  switch ($form_id) {

    case 'node_article_form':      // New article nodes.
    case 'node_article_edit_form': // Existing article nodes.

      // Attach our custom submit handler.
      $form['actions']['publish']['#submit'][] = 'my_module_node_article_form_submit';
      break;

  }

}

function my_module_node_article_form_submit($form, FormStateInterface $form_state) {
  drupal_set_message('Running custom submit handler...');
}

Ich konnte einen benutzerdefinierten Submit-Handler nicht erfolgreich anhängen $form['#submit']und die Funktion ordnungsgemäß auslösen. Ich musste es beim Erstellen eines neuen Artikels explizit an die Schaltfläche Speichern und veröffentlichen anhängen und beim Bearbeiten eines vorhandenen Artikels an die Schaltfläche Speichern und veröffentlicht lassen .

Außerdem publishsind hier einige der anderen verfügbaren Tastenaktionen:

unpublish
preview
delete

Ich bin in Drupal 8.7.3 und my_module_node_article_form_submit($form, FormStateInterface $form_statehabe es mir gegeben TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; Ändern Sie es, um _submit($form, $form_state)die Fehler zu beheben.
user1359
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.