kgaut.net // Développeur web PHP / Drupal freelance
contactez-moi

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

Cet article a été écrit il y a plus de quatre ans, son contenu n'est peut-être plus d'actualité.

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

snippet · 15 Fév 2018 Drupal 8 - Afficher un webform où l'on veut via le code

Commentaires (0)