business_rules-8.x-1.0-beta1/src/Plugin/BusinessRulesAction/SendEmail.php

src/Plugin/BusinessRulesAction/SendEmail.php
<?php

namespace Drupal\business_rules\Plugin\BusinessRulesAction;

use Drupal\business_rules\ActionInterface;
use Drupal\business_rules\Events\BusinessRulesEvent;
use Drupal\business_rules\ItemInterface;
use Drupal\business_rules\Plugin\BusinessRulesActionPlugin;
use Drupal\Core\Form\FormStateInterface;
use Drupal\language\ConfigurableLanguageManagerInterface;

/**
 * Class SendEmail.
 *
 * @package Drupal\business_rules\Plugin\BusinessRulesAction
 *
 * @BusinessRulesAction(
 *   id = "send_email",
 *   label = @Translation("Send email"),
 *   group = @Translation("System"),
 *   description = @Translation("Sent email action."),
 *   isContextDependent = FALSE,
 *   hasTargetEntity = FALSE,
 *   hasTargetBundle = FALSE,
 *   hasTargetField = FALSE,
 * )
 */
class SendEmail extends BusinessRulesActionPlugin {

  /**
   * The mail manager.
   *
   * @var \Drupal\Core\Mail\MailManagerInterface
   */
  protected $mailManager;

  /**
   * {@inheritdoc}
   */
  public function __construct(array $configuration, $plugin_id = 'send_email', $plugin_definition = []) {

    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->mailManager = $this->util->container->get('plugin.manager.mail');
  }

  /**
   * {@inheritdoc}
   */
  public function getSettingsForm(array &$form, FormStateInterface $form_state, ItemInterface $item) {

    $form_state->set('business_rules_item', $item);

    // Only show settings form if the item is already saved.
    if ($item->isNew()) {
      return [];
    }

    $settings['subject'] = [
      '#type'          => 'textfield',
      '#title'         => t('Subject'),
      '#required'      => TRUE,
      '#default_value' => $item->getSettings('subject'),
      '#desctiption'   => t('Mail subject'),
    ];

    $site_mail = \Drupal::config('system.site')->get('mail');

    $settings['use_site_mail_as_sender'] = [
      '#type'          => 'select',
      '#title'         => t('Use site mail as sender'),
      '#options'       => [
        TRUE  => t('Yes'),
        FALSE => t('No'),
      ],
      '#required'      => TRUE,
      '#default_value' => ($item->getSettings('use_site_mail_as_sender') === FALSE) ? FALSE : TRUE,
      '#description'   => t('Use %mail as sender', ['%mail' => $site_mail]),
    ];

    $settings['from'] = [
      '#type'          => 'textfield',
      '#title'         => t('From'),
      '#default_value' => $item->getSettings('from'),
      '#description'   => t('You can use variables on this field.'),
      '#states'        => [
        'visible' => [
          'select[name="use_site_mail_as_sender"]' => ['value' => '0'],
        ],
      ],
    ];

    $settings['to'] = [
      '#type'          => 'textfield',
      '#title'         => t('To'),
      '#required'      => TRUE,
      '#default_value' => $item->getSettings('to'),
      '#description'   => t('For multiple recipients, use semicolon(;). You can use variables on this field. The variable can contain one email or an array of emails'),
    ];

    $settings['subject'] = [
      '#type'          => 'textfield',
      '#title'         => t('Subject'),
      '#required'      => TRUE,
      '#default_value' => $item->getSettings('subject'),
      '#description'   => t('You can use variables on this field.'),
    ];

    $settings['body'] = [
      '#type'          => 'textarea',
      '#title'         => t('Message'),
      '#required'      => TRUE,
      '#default_value' => $item->getSettings('body'),
      '#description'   => t('You can use variables on this field.'),
    ];

    return $settings;
  }

  /**
   * {@inheritdoc}
   */
  public function processSettings(array $settings, ItemInterface $item) {

    if (isset($settings['use_site_mail_as_sender']) && $settings['use_site_mail_as_sender'] === 1) {
      $settings['from'] = NULL;
    }

    return $settings;
  }

  /**
   * {@inheritdoc}
   */
  public function execute(ActionInterface $action, BusinessRulesEvent $event) {

    $event_variables = $event->getArgument('variables');
    $query_service   = \Drupal::getContainer()->get('entity.query');
    $to              = $this->processVariables($action->getSettings('to'), $event_variables);
    $arr_to          = explode(';', $to);
    $result          = [];

    if ($action->getSettings('use_site_mail_as_sender')) {
      $from = \Drupal::config('system.site')->get('mail');
    }
    else {
      $from = $action->getSettings('from');
      $from = $this->processVariables($from, $event_variables);
    }

    foreach ($arr_to as $to) {
      // Check if $to is an email registered on database.
      /** @var \Drupal\Core\Entity\Query\Sql\Query $query */
      $query = $query_service->get('user');
      $query->condition('mail', $to);
      $ids = $query->execute();

      $entityManager = \Drupal::entityTypeManager()->getStorage('user');
      $users         = $entityManager->loadMultiple($ids);

      // If email address is duplicated on user table, use the first email to
      // get the user language.
      if (count($users)) {
        foreach ($users as $user) {
          $langcode = $user->language()->getId();
          break;
        }

      }
      else {
        // If user not found, use the site language.
        $langcode = \Drupal::config('system.site')->get('langcode');
      }

      // Send the email.
      $languageManager = \Drupal::languageManager();
      if ($languageManager instanceof ConfigurableLanguageManagerInterface) {
        $action_translated   = $languageManager->getLanguageConfigOverride($langcode, 'business_rules.action.' . $action->id());
        $settings_translated = $action_translated->get('settings');
      }

      $subject = isset($settings_translated['subject']) ? $settings_translated['subject'] : $action->getSettings('subject');
      $message = isset($settings_translated['body']) ? $settings_translated['body'] : $action->getSettings('body');
      $subject = $this->processVariables($subject, $event_variables);
      $message = $this->processVariables($message, $event_variables);

      $params = [
        'from'    => $from,
        'subject' => $subject,
        'message' => $message,
      ];

      $send_result = $this->mailManager->mail('business_rules', 'business_rules_mail', $to, $langcode, $params, $from);

      $result = [
        '#type'   => 'markup',
        '#markup' => t('Send mail result: %result. Subject: %subject, from: %from, to: %to, message: %message.', [
          '%result'  => $send_result['result'] ? t('success') : t('fail'),
          '%subject' => $subject,
          '%from'    => $from,
          '%to'      => implode('; ', $arr_to),
          '%message' => $message,
        ]),
      ];
    }

    return $result;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc