it-swarm.com.de

Formatieren der mit dem Kontaktformular gesendeten E-Mail

Ich habe mit dem Kontaktmodul aus dem Kern von Drupal 8 ein benutzerdefiniertes Formular erstellt (einige zusätzliche Felder hinzugefügt).

Wenn ich das Formular abschicke, wird eine E-Mail gesendet, die alle Werte enthält, aber es ist wirklich schlecht formatiert . Die E-Mail enthält nur die Werte des Formulars ohne Feldbezeichnung und ist nicht lesbar .

Wie kann ich die Vorlage der E-Mail anpassen, die beim Senden des Formulars gesendet wird?


Was ich schon versucht habe

hook_mail_alter

Ich habe eine Antwort auf das gleiche Problem für Drupal 7) gefunden, die vorschlägt, eine benutzerdefinierte hook_mail_alter - Funktion zu implementieren (zum Beispiel: 1 , 2) ).

Also habe ich mit meiner Funktion ein benutzerdefiniertes Modul erstellt:

/**
 * Implements hook_mail_alter().
 */
function mymodule_mail_alter(&$message) {

  // Process only 'contact_page_mail' messages
  if ($message['id'] != 'contact_page_mail') {
    return;
  }

  $params = $message['params'];

  // Body
  $message['body'] = [];
  $message['body'][] = t('Some custom message');

  // I don't know what should I do here?
  // How can I access values of all fields in the form?
  // ...

  return;
}

Die Funktion wird korrekt ausgelöst, bevor die E-Mail gesendet wird. Ich kann jedoch nicht auf die Feldwerte zugreifen, sodass ich keine benutzerdefinierte E-Mail erstellen kann.

Außerdem kann ich die ID des Formulars nicht erhalten (nur ein generisches 'contact_page_mail', Das auf allen Kontaktformularen gültig ist), sodass ich in dieser Funktion nicht mit verschiedenen Kontaktformularen umgehen kann.

Schneller Mailer

Wie in diese andere ähnliche Frage vorgeschlagen, habe ich es mit dem Swift Mailer-Modul versucht.

Nach etwas Mühe kann ich es zum Laufen bringen und jetzt habe ich eine swiftmailer.html.twig - Vorlagendatei mit folgendem Inhalt:

<div>

  {{ body }}

</div>

Bei der hook_mail_alter - Lösung kann ich jedoch nicht auf die Feldwerte des Formulars zugreifen, sodass ich das E-Mail-Format nicht anpassen kann.

Darüber hinaus ist das Swift Mailer-Modul derzeit eine alpha Version (8.x-1.0-alpha1) und das Mailsystem-Modul (erforderlich, um die Dinge zum Laufen zu bringen) a beta version. Daher möchte ich vermeiden, instabile Module auf einer Produktionswebsite zu installieren (dies kann ohnehin die letzte Lösung sein, wenn keine andere funktioniert).


[~ # ~] edit [~ # ~]

Dank @Berdir kann ich jetzt innerhalb der Funktion hook_mail_alter Auf Feldwerte zugreifen mit:

$contactMessage = $message['params']['contact_message'];

// Value of 'field_my_field_name'
$contactMessage->get('field_my_field_name')->getString();

Also kann ich sie in den $message['body'] Einfügen.

Ziemlich kompliziert, aber es funktioniert.

Gibt es eine Möglichkeit, Feldwerte innerhalb der Swift Mailer-Vorlage? Ich habe es mit {{ params.contact_message.field_work_with_us_name }} Versucht, aber es funktioniert nicht.

Was passiert, wenn ich zwei oder mehr Kontaktformulare habe? Die Funktion hook_mail_alter Wird bei allen ausgelöst. Gibt es eine Möglichkeit, für jedes Kontaktformular eine bestimmte Funktion zu haben?

5
Andrea

Stellen Sie eine Antwort basierend auf den Kommentaren/Diskussionen dort zusammen, damit diese akzeptiert/geschlossen werden kann.

  • Allgemeine Anweisungen zum Thema einer E-Mail finden Sie in dieser vorhandenen Antwort: Wie kann ich die ausgehende Kontakt-E-Mail thematisieren?

  • Vielleicht möchten Sie https://www.drupal.org/node/2680731 ansehen. Sobald dies behoben ist, können Sie sich darauf verlassen, dass Sie die E-Mail anstelle Ihres eigenen Codes als HTML senden.

  • Um eine benutzerdefinierte Vorlage für die inneren Teile der E-Mail zu verwenden, können Sie in hook_contact_message_view() eine benutzerdefinierte Vorlage festlegen. Oder verwenden Sie Feldvorlagen für bestimmte Felder.

  • Um nach einem bestimmten Kontaktformular zu suchen, können Sie die Methode bundle() der Kontaktnachrichtenentität verwenden, die Sie in $message['params]['contact_message'] In hook_mail_alter() finden. Stellen Sie sicher, dass Sie dies mit einer Überprüfung, ob es vorhanden ist, und einem Entitätsobjekt kombinieren. Andernfalls können schwerwiegende Fehler für andere E-Mails auftreten.

2
Berdir