Hinzufügen eines benutzerdefinierten Übermittlungshandlers zu einem Formular


19

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.


Sie sollten die vollständige Implementierung von zeigen 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.
kiamlaluno

@kiamlaluno Ich füge meinen hook_form_alter hinzu.
Yusef

Wie lautet Ihr Code noch? $ form ['actions'] ['submit'] ['# submit']? Versuchen Sie, ['submit'] durch [$ action] zu ersetzen.
MrD

Antworten:


25

Wenn Sie verwenden, hook_form_node_form_alter()können Sie Beispielcode verwenden :

function mymodule_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  foreach (array_keys($form['actions']) as $action) {
    if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
      $form['actions'][$action]['#submit'][] = 'mymodule_form_submit';
    }
  }
}

und Funktion einreichen

function mymodule_form_submit(array $form, FormStateInterface $form_state){
    //die("I'm not getting run, why :(");
    drupal_set_message("Why won't this message show?");

}

1
$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'][].
Kein Sssweat


1
Interessant, ja, vielleicht muss er die Aktionen durchlaufen. Obwohl, in diesem anderen Frage: Wie implementieren Sie einen benutzerdefinierten Submit-Handler in hook_form_alter ()? Es ist anzunehmen, dass es so funktioniert, wie er es tut.
Kein Sssweat

3
Jedes Formular hat unterschiedliche Strukturen. Es gibt also keine konkrete Antwort.
MrD

5
Unter drupal.org/node/1901216 und drupal.org/node/2068063 finden Sie weitere Informationen dazu, warum diese Schleife erforderlich ist
Berdir,

18

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:

email:
  '#type': email
  '#title': email
  '#title_display': invisible
  '#placeholder': 'ENTER YOUR EMAIL'
  '#attributes':
    class:
      - my-ip

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:

name: My Form Handler
description: handles form submits, does something with them. 
package: Custom
type: module
version: 1.0
core: 8.x

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

mkdir -p /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/ 

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.

<?php
namespace Drupal\myhandler\Plugin\WebformHandler;

use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Serialization\Yaml;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\webformSubmissionInterface;


/**
 * Form submission handler.
 *
 * @WebformHandler(
 *   id = "myhandler_form_handler",
 *   label = @Translation("MyHandler form handler"),
 *   category = @Translation("Form Handler"),
 *   description = @Translation("Do something extra with form submissions"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 * )
 */
class MyFormHandler extends WebformHandlerBase {

     /**
       * {@inheritdoc}
       */

     public function defaultConfiguration() {
        return [
            'submission_url' => 'https://api.example.org/SOME/ENDPOINT',
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
        $form['submission_url'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Submission URL to api.example.org'),
            '#description' => $this->t('The URL to post the submission data to.'),
            '#default_value' => $this->configuration['submission_url'],
            '#required' => TRUE,
        ];
        return $form;
    }



  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
    // Your code here.
        // Get an array of the values from the submission.

        $values = $webform_submission->getData();

        // Get the URL to post the data to.
        $post_url = $this->configuration['submission_url'];

        $message = "MyHandler got form data:".print_r($values,1); 
        \Drupal::logger('myformhandler')->error($message);

        return true;
 }
}   
?>

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.


1
Wenn ich es richtig verstehe, fehlt im obigen Code nur noch die Methode submitConfigurationForm (), bestehend aus parent::submitConfigurationForm($form, $form_state);und, damit der Handler ordnungsgemäß funktioniert parent::applyFormStateToConfiguration($form_state);.
Hendrik

1
@Hendrik Nein, du brauchst es nicht. Ich habe einen neuen Handler mit nur einer 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 ;-)
RWAM

5

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:

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

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:

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

1

Die akzeptierte Antwort funktionierte mit Drupal 8.7.7 nicht. Ich habe versucht, einem Formular aus dem search_apiModul einen Submit-Handler hinzuzufügen .

Ich habe diesen Fehler bekommen:

TypeError: Argument 2 passed to _my_module_search_api_form_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given in ...

Damit es funktioniert, habe ich meine Funktionssignatur in den vollständigen Namespace der Schnittstelle geändert:

function _my_module_search_api_form_submit(array $form, Drupal\Core\Form\FormStateInterface $form_state) { ...
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.