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

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

<?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
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

Contenus en rapport

Ajouter un commentaire

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