Drupal 8 & Drupal 9 - Webform - avoir un destinataire dynamique en fonction d'une catégorie

Posté le Mercredi 4 novembre 2020 - 10:21

Dans le contexte d'un webform, je voulais pouvoir envoyer une notification à un email en particulier en fonction du sujet du message de contact.

Au niveau de mon webform, mon champ sujet est un select dont les options sont issues d'un vocabulaire de taxonomie :

Image
Webform sujet taxonomy

 Dans le vocabulaire en question, j'ai ajouté un champ de type email field_destinataire_message :

Image
Taxo field email

Ainsi pour chaque sujet de contact, l'administrateur pourra saisir un destinataire différent.

Maintenant reste la partie la plus importante, le gestionnaire de notification du webform.

Création d'un plugin EmailWebformHandler :

web/modules/custom/mon_module/src/Plugin/WebformHandler/ContactWebformHandler.php

  1. <?php
  2. namespace Drupal\mon_module\Plugin\WebformHandler;
  3.  
  4. use Drupal\Core\Form\FormStateInterface;
  5. use Drupal\taxonomy\Entity\Term;
  6. use Drupal\webform\Plugin\WebformHandler\EmailWebformHandler;
  7. use Drupal\webform\WebformSubmissionInterface;
  8.  
  9. /**
  10.  * Emails a webform submission.
  11.  *
  12.  * @WebformHandler(
  13.  * id = "contact_email_destinataire",
  14.  * label = @Translation("Email - destinataire dynamique basé sur le sujet"),
  15.  * category = @Translation("Notification"),
  16.  * description = @Translation("Le destinataire de la notification sera fonction de la catégorie du contact"),
  17.  * cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_UNLIMITED,
  18.  * results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
  19.  * )
  20.  */
  21. class ContactWebformHandler extends EmailWebformHandler {
  22.  
  23. public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
  24. $form = parent::buildConfigurationForm($form, $form_state);
  25. $form['to']['#access'] = FALSE;
  26. return $form;
  27. }
  28.  
  29. public function sendMessage(WebformSubmissionInterface $webform_submission, array $message) {
  30. // Je charge un destinataire par défaut si l'email n'est pas renseigné pour le sujet.
  31. $recipient = \Drupal::config('system.site')->get('mail');
  32.  
  33. // Je recupère la valeur du champ « sujet » (un entier : l'id du terme de taxonomy)
  34. $subjectTid = $webform_submission->getRawData()['subject'];
  35. if (($subject = Term::load($subjectTid)) && $destinataire = $subject->get('field_destinataire_message')->value) {
  36. $recipient = $destinataire;
  37. }
  38. // je définis le destinataire
  39. $message['to_mail'] = $recipient;
  40.  
  41. parent::sendMessage($webform_submission, $message);
  42. }
  43.  
  44. }

Pour terminer, il faut activer cette notification cela se passe au niveau de notre webform dans l'administration : onglet « paramètres », sous-onglet « Emails / Handlers » : Ajouter un gestionnaire :

Image
webform handler

Sélectionner le handler que l'on vient de créer puis cliquez sur le lien « Ajouter un gestionnaire ».

Et il ne restera plus qu'à configurer la notification comme classiquement, sauf qu'évidement cette fois le champ destinataire n'est pas disponible !

webform handler destinataire

Aller plus loin ?

 

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...