farm-2.x-dev/modules/core/data_stream/modules/notification/src/Plugin/DataStream/NotificationDelivery/Email.php
modules/core/data_stream/modules/notification/src/Plugin/DataStream/NotificationDelivery/Email.php
<?php namespace Drupal\data_stream_notification\Plugin\DataStream\NotificationDelivery; use Drupal\Component\Utility\EmailValidatorInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Mail\MailManagerInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Email notification delivery. * * @NotificationDelivery( * id = "email", * label = @Translation("Email"), * context_definitions = { * "value" = @ContextDefinition("float", label = @Translation("value")), * "data_stream" = @ContextDefinition("entity:data_stream", label = @Translation("Data stream")), * "data_stream_notification" = @ContextDefinition("entity:data_stream_notification", label = @Translation("Data stream notification")), * "condition_summaries" = @ContextDefinition("list", label = @Translation("Condition summaries")) * } * ) */ class Email extends NotificationDeliveryBase implements ContainerFactoryPluginInterface { /** * The email validator service. * * @var \Drupal\Component\Utility\EmailValidatorInterface */ protected $emailValidator; /** * The mail manager service. * * @var \Drupal\Core\Mail\MailManagerInterface */ protected $mailManager; /** * Constructs an Email object. * * @param array $configuration * A configuration array containing information about the plugin instance. * @param string $plugin_id * The plugin_id for the plugin instance. * @param mixed $plugin_definition * The plugin implementation definition. * @param \Drupal\Component\Utility\EmailValidatorInterface $email_validator * The email validator service. * @param \Drupal\Core\Mail\MailManagerInterface $mail_manager * The mail manager service. */ public function __construct(array $configuration, $plugin_id, $plugin_definition, EmailValidatorInterface $email_validator, MailManagerInterface $mail_manager) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->emailValidator = $email_validator; $this->mailManager = $mail_manager; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( $configuration, $plugin_id, $plugin_definition, $container->get('email.validator'), $container->get('plugin.manager.mail'), ); } /** * {@inheritdoc} */ public function buildConfigurationForm(array $form, FormStateInterface $form_state) { // Convert array of emails into a single text area. $emails = $this->configuration['email'] ?? []; $default = implode(PHP_EOL, $emails); $form['email'] = [ '#type' => 'textarea', '#title' => $this->t('Email'), '#description' => $this->t('Separate multiple emails with a new line.'), '#default_value' => $default, '#required' => TRUE, '#lines' => 5, ]; return $form; } /** * {@inheritdoc} */ public function validateConfigurationForm(array &$form, FormStateInterface $form_state) { // Process emails from text area. $emails = $this->getEmails($form, $form_state); // Error if there are no emails. if (empty($emails)) { $form_state->setError($form['email'], $this->t('Email is required.')); } // Validate each email. foreach ($emails as $email) { if ($email !== '' && !$this->emailValidator->isValid($email)) { $form_state->setError($form['email'], $this->t('The email address %mail is not valid.', ['%mail' => $email])); } } } /** * {@inheritdoc} */ public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { // Convert the submitted emails into an array. $emails = $this->getEmails($form, $form_state); $form_state->setValue('email', $emails); } /** * Helper function to process emails from a textarea string. * * @param array $form * The form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The form state. * * @return string[] * An array of emails. */ protected function getEmails(array $form, FormStateInterface $form_state) { $raw_emails = $form_state->getValue('email'); $emails = explode(PHP_EOL, $raw_emails); $clean = array_map(function ($email) { return trim($email); }, $emails); return array_filter($clean); } /** * {@inheritdoc} */ public function execute(): bool { // Bail if contexts aren't provided. if ($this->validateContexts()->count()) { return FALSE; } $params = $this->getContextValues(); $result = $this->mailManager->mail('data_stream_notification', 'notification_email', implode(', ', $this->configuration['email']), 'en', $params); return $result['result'] ?? FALSE; } }