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 :
Dans le vocabulaire en question, j'ai ajouté un champ de type email field_destinataire_message :
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 :
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 !
Contenus en rapport
Pour récupérer et retourner un webform où l'on veut via le code (que ce soit dans un bloc, un controller...) on peut utiliser les lignes suivantes :
Ajouter un commentaire