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

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

Image

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

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

use Drupal\Core\Form\FormStateInterface;
use Drupal\taxonomy\Entity\Term;
use Drupal\webform\Plugin\WebformHandler\EmailWebformHandler;
use Drupal\webform\WebformSubmissionInterface;

/**
 * Emails a webform submission.
 *
 * @WebformHandler(
 *   id = "contact_email_destinataire",
 *   label = @Translation("Email - destinataire dynamique basé sur le sujet"),
 *   category = @Translation("Notification"),
 *   description = @Translation("Le destinataire de la notification sera fonction de la catégorie du contact"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_UNLIMITED,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 * )
 */
class ContactWebformHandler extends EmailWebformHandler {

  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);
    $form['to']['#access'] = FALSE;
    return $form;
  }

  public function sendMessage(WebformSubmissionInterface $webform_submission, array $message) {
    // Je charge un destinataire par défaut si l'email n'est pas renseigné pour le sujet.
    $recipient = \Drupal::config('system.site')->get('mail');

    // Je recupère la valeur du champ « sujet » (un entier : l'id du terme de taxonomy)
    $subjectTid = $webform_submission->getRawData()['subject'];
    if (($subject = Term::load($subjectTid)) && $destinataire = $subject->get('field_destinataire_message')->value) {
      $recipient = $destinataire;
    }
    // je définis le destinataire
    $message['to_mail'] = $recipient;

    parent::sendMessage($webform_submission, $message);
  }

}

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

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é

CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...