web-dev-qa-db-fra.com

Formatage de l'e-mail envoyé avec le formulaire de contact

J'ai créé un formulaire personnalisé (en ajoutant des champs supplémentaires) en utilisant le module de contact à partir du noyau de Drupal 8 .

Lorsque je soumets le formulaire est envoyé un e-mail contenant toutes les valeurs, mais il est vraiment mal formaté . L'e-mail contient uniquement les valeurs du formulaire sans étiquette de champ et il est illisible .

Comment puis-je personnaliser le modèle de l'e-mail envoyé lors de l'envoi du formulaire?


Ce que j'ai déjà essayé

hook_mail_alter

J'ai trouvé une réponse au sujet du même problème pour Drupal 7 suggérant d'implémenter une fonction hook_mail_alter Personnalisée (par exemple: 1 , 2 ).

J'ai donc créé un module personnalisé avec ma fonction:

/**
 * 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;
}

La fonction est correctement déclenchée avant l'envoi de l'e-mail, mais je ne peux pas accéder aux valeurs des champs, je ne suis donc pas en mesure de créer un e-mail personnalisé.

De plus, je ne peux pas obtenir l'ID du formulaire (uniquement un 'contact_page_mail' Générique valide sur tous les formulaires de contact), donc je ne suis pas en mesure de gérer différents formulaires de contact dans cette fonction.

Swift Mailer

Comme suggéré dans cette autre question similaire , j'ai essayé avec le module Swift Mailer .

Après n peu d'effort , je peux le faire fonctionner et maintenant j'ai un fichier de modèle swiftmailer.html.twig Avec ce contenu:

<div>

  {{ body }}

</div>

Mais comme pour la solution hook_mail_alter, Je ne sais pas comment accéder aux valeurs des champs du formulaire, donc je ne peux pas personnaliser le format de l'email.

De plus, le module Swift Mailer est actuellement une version alpha (8.x-1.0-alpha1) et le module Mailsystem (requis pour que les choses fonctionnent) est une version beta. Je voudrais donc éviter d'installer des modules instables sur un site de production (de toute façon cela peut être la dernière solution, si aucune autre ne fonctionne).


[~ # ~] modifier [~ # ~]

Grâce à @Berdir, maintenant dans la fonction hook_mail_alter Je peux accéder aux valeurs des champs avec:

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

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

Je peux donc les mettre dans le $message['body'].

Assez compliqué, mais ça marche.

Existe-t-il un moyen d'obtenir des valeurs de champ dans le modèle Swift Mailer? J'ai essayé avec {{ params.contact_message.field_work_with_us_name }} Mais cela ne fonctionne pas.

Que se passe-t-il si j'ai deux formulaires de contact ou plus? La fonction hook_mail_alter Sera déclenchée sur chacun d'eux. Existe-t-il un moyen d'avoir une fonction spécifique pour chaque formulaire de contact?

5
Andrea

Mettre en place une réponse basée sur les commentaires/discussion afin que cela puisse être accepté/fermé.

  • Des instructions générales sur la façon de thématiser un courrier peuvent être trouvées dans cette réponse existante: Comment puis-je thème le courrier de contact sortant?

  • Vous voudrez peut-être regarder https://www.drupal.org/node/2680731 , une fois résolu, vous pouvez compter sur cela au lieu de votre propre code personnalisé pour envoyer le courrier au format HTML.

  • Pour utiliser un modèle personnalisé pour les parties internes du courrier, vous pouvez définir un modèle personnalisé dans hook_contact_message_view(). Ou utilisez des modèles de champs pour des champs spécifiques.

  • Pour rechercher un formulaire de contact spécifique, vous pouvez utiliser la méthode bundle() de l'entité de message de contact, que vous pouvez trouver dans $message['params]['contact_message'] Dans hook_mail_alter(). Assurez-vous de combiner cela avec une vérification de sa présence et d'un objet entité, sinon vous pourriez avoir des erreurs fatales pour d'autres courriers.

2
Berdir