Wie kann ich einen benutzerdefinierten Formularübermittlungshandler hinzufügen?
Ich habe versucht , das Hinzufügen $form['#submit'][] = 'mymodule_form_submit';
oder $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';
zu hook_form_alter()
.
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\HttpFoundation\Request;
function MYMODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if ($form_id == 'node_trends_form' || $form_id == 'node_trends_edit_form') {
foreach (array_keys($form['actions']) as $action) {
if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
$form['actions']['submit']['#submit'][] = 'mymodule_form_submit';
}
}
}
}
function mymodule_form_submit(array $form, FormStateInterface $form_state){
//die("why won't this execute? :(");
drupal_set_message("Why won't this message show?");
}
Es scheint drupal_set_message()
nicht aufgerufen. Ich habe auch versucht, den Cache neu zu erstellen, aber die Funktion wird immer noch nicht aufgerufen.
Ich benutze Drupal 8.2.3.
hook_form_alter()
, sonst ist es etwas schwieriger, Ihnen mitzuteilen, was Sie falsch machen. Außerdem sollten Sie angeben, welche Form Sie ändern möchten.Antworten:
Wenn Sie verwenden,
hook_form_node_form_alter()
können Sie Beispielcode verwenden :und Funktion einreichen
quelle
$form['actions'][$action]['#submit'][]
Welche Dokumentation sehen Sie? oder hast du einen Tippfehler gemacht? In diesem hook_form_alter doc sagt sie$form['actions']['submit']['#submit'][]
.Erstellen eines benutzerdefinierten Webform-Handler-Plugins für Drupal 8.
In diesem Dokument wird davon ausgegangen, dass Sie Webform und Webform-UI bereits installiert und aktiviert haben
1) Erstellen Sie Ihr Webformular. - Gehen Sie zu Struktur -> Webformulare und klicken Sie auf die Schaltfläche "+ Webformular hinzufügen". - Sie können entweder die Benutzeroberfläche oder Yaml verwenden, das liegt ganz bei Ihnen. Beispiel-Yaml für ein Ein-Feld-Formular, das eine E-Mail-Adresse enthält:
Die Einrückung ist wichtig für yaml, stellen Sie also sicher, dass Sie es richtig machen. Einrückungen sind Leerzeichen.
Speichern Sie nun Ihr Formular.
2) Erstellen eines Webform-Handler-Plugins
Als nächstes können wir ein neues Plugin erstellen, das beim Bearbeiten des Webformulars im Abschnitt "E-Mails / Handler" angezeigt wird. Ich werde es myhandler nennen, Sie können es so nennen, wie Sie möchten, vorausgesetzt, Sie ersetzen alle Erwähnungen von myhandler durch den Namen, den Sie auswählen.
a) Erstellen Sie einen neuen Ordner für Ihr Plugin. Befolgen Sie dies in Ihrem Drupal-Stammverzeichnis (hier als / var / www / html / bezeichnet) im folgenden Unterordner: / var / www / html / modules / Custom / myhandler
b) Erstellen Sie eine neue Datei im obigen Verzeichnis mit dem Namen myhandler.info.yml. Diese Datei enthält folgende Informationen:
3) Erstellen Sie ein src-Verzeichnis in Ihrem Modulverzeichnis, z. B .: / var / www / html / modules / Custom / myhandler / src in src Plugin erstellen in Plugin erstellen WebformHandler
(Dies kann in einem Durchgang mit erreicht werden
Dadurch wird die gesamte Struktur in einem Durchgang mit dem Flag -p zu mkdir.)
4) Erstellen Sie eine neue Datei
/var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php
In dieser Datei befindet sich der folgende PHP-Code. Ich habe das Konfigurationsformular verlassen, damit Sie bei Bedarf sehen können, wie Sie Ihr Plugin konfigurieren.
5) Aktivieren Sie Ihr MyHandler-Modul (mit drush oder extend menu) und erstellen Sie dann Ihren Drupal-Cache neu ("drush cr" von irgendwo unter Ihrem Drupal-Stammverzeichnis (/ var / www / html hier) würde dies tun, wenn Sie drush verwenden)
6) bearbeite dein Webformular, gehe zu "Email / Handlers" und klicke auf "+ Handler hinzufügen". Du solltest dein Plugin aufgelistet sehen, klicke auf "Handler hinzufügen". Klicken Sie auf die Schaltfläche Speichern. Wenn etwas nicht richtig aussieht oder nicht funktioniert, überprüfen Sie das Apache-Fehlerprotokoll. Möglicherweise finden Sie dort etwas Hilfreiches.
7) Testen Sie Ihr Formular - reichen Sie eine Übermittlung an das Formular ein und überprüfen Sie dann das Watchdog-Protokoll (drush ws). Sie sollten die Werte sehen, die an das Formular gesendet wurden. Sie könnten in der Ausgabe abgeschnitten sein, keine Panik, es ist alles da. Was Sie jetzt damit machen, liegt bei Ihnen.
Hoffe das hilft jemandem. Ich habe es aus Sachen zusammengeschustert, die ich in der Gegend gefunden habe, und es in ein einziges Dokument geschrieben. Vielen Dank an die anderen, die mich hierher gebracht haben.
quelle
parent::submitConfigurationForm($form, $form_state);
und, damit der Handler ordnungsgemäß funktioniertparent::applyFormStateToConfiguration($form_state);
.submitForm()
Funktion erstellt und es funktioniert. Alle anderen Funktionen befinden sich in der Basisklasse und ich muss sie nicht überschreiben. Übrigens: eine ganz nette und einfache Lösung, sobald Sie es herausgefunden haben ;-)Wenn Hook_form_BASE_FORM_ID_alter in Drupal 8 Core 8.4.3 verwendet wurde, funktionierten die Methoden zum Hinzufügen des benutzerdefinierten Submit-Handlers nicht. Dies funktionierte zum Hinzufügen des Submit-Handler-Funktionsnamens:
In einer anderen Situation, in der hook_form_FORM_ID_alter in Drupal 8.4.5 verwendet wurde, konnte der benutzerdefinierte Submit-Handler nicht hinzugefügt werden. Stattdessen funktionierte dies:
quelle
Die akzeptierte Antwort funktionierte mit Drupal 8.7.7 nicht. Ich habe versucht, einem Formular aus dem
search_api
Modul einen Submit-Handler hinzuzufügen .Ich habe diesen Fehler bekommen:
Damit es funktioniert, habe ich meine Funktionssignatur in den vollständigen Namespace der Schnittstelle geändert:
quelle