Commit 152597f8 authored by Dale McGladdery's avatar Dale McGladdery Committed by renatog
Browse files

Issue #3275572 by dale42, apaderno, SocialNicheGuru, RenatoG: Implement hook_mail()

parent fcc68e1c
Loading
Loading
Loading
Loading
+34 −0
Changes for modules/invite_by_email/invite_by_email.module: 34 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -5,8 +5,10 @@
 * Contains invite_by_email.module.
 */

use Drupal\Component\Render\PlainTextOutput;
use Drupal\invite\InviteConstants;
use Drupal\Core\Form\FormStateInterface;
use Drupal\invite_by_email\Plugin\Invite\InviteByEmail;

/**
 * Implements hook_form_alter().
@@ -149,3 +151,35 @@ function invite_by_email_form_user_register_form_alter(&$form, FormStateInterfac
    $form['account']['mail']['#disabled'] = TRUE;
  }
}

/**
 * Implements hook_mail().
 */
function invite_by_email_mail($key, &$message, $params) {
  $token_service = \Drupal::token();
  $language_manager = \Drupal::languageManager();
  $langcode = $message['langcode'];
  $variables = ['invite' => $params['invite']];

  $language = $language_manager->getLanguage($langcode);
  $original_language = $language_manager->getConfigOverrideLanguage();
  $language_manager->setConfigOverrideLanguage($language);

  $invite_type = $params['invite']->get('type')->value;
  $is_html = unserialize(\Drupal::config("invite.invite_type.$invite_type")->get('data'))['html_email'] ?? FALSE;
  $subject = $params['invite']->get('field_invite_email_subject')->value;
  $body = $params['invite']->get('field_invite_email_body')->value;

  $token_options = ['langcode' => $langcode];
  $body_element = [
    '#theme'  => 'invite_by_email',
    '#body'   => $token_service->replace($body, $variables, $token_options),
  ];
  $message['subject'] .= PlainTextOutput::renderFromHtml($token_service->replace($subject, $variables, $token_options));
  $message['body'][] = \Drupal::service('renderer')->render($body_element);
  if ($is_html) {
    $message['headers']['Content-Type'] = 'text/html; charset=UTF-8;';
  }

  $language_manager->setConfigOverrideLanguage($original_language);
}
+43 −51
Changes for modules/invite_by_email/src/Plugin/Invite/InviteByEmail.php: 43 added lines, 51 removed lines.
Original line number Diff line number Diff line
@@ -3,9 +3,10 @@
namespace Drupal\invite_by_email\Plugin\Invite;

use Drupal\Component\Plugin\PluginBase;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Mail\MailManagerInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\invite\InvitePluginInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -30,14 +31,18 @@ class InviteByEmail extends PluginBase implements InvitePluginInterface, Contain
  protected $messenger;

  /**
   * Getter for the messenger service.
   * Mail manager service.
   *
   * @return \Drupal\Core\Messenger\MessengerInterface
   *   will return the messenger.
   * @var \Drupal\Core\Mail\MailManagerInterface
   */
  public function getMessenger() {
    return $this->messenger;
  }
  protected $mailManager;

  /**
   * The language manager.
   *
   * @var \Drupal\Core\Language\LanguageManagerInterface
   */
  protected $languageManager;

  /**
   * Constructs invite_by_email plugin.
@@ -50,10 +55,23 @@ class InviteByEmail extends PluginBase implements InvitePluginInterface, Contain
   *   Plugin Definition.
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger service.
   * @param \Drupal\Core\Mail\MailManagerInterface $mail_manager
   *   The mail manager service.
   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
   *   The language manager service.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, MessengerInterface $messenger) {
  public function __construct(
    array $configuration,
    $plugin_id,
    $plugin_definition,
    MessengerInterface $messenger,
    MailManagerInterface $mail_manager,
    LanguageManagerInterface $language_manager
  ) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->messenger        = $messenger;
    $this->mailManager      = $mail_manager;
    $this->languageManager  = $language_manager;
  }

  /**
@@ -64,7 +82,9 @@ class InviteByEmail extends PluginBase implements InvitePluginInterface, Contain
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('messenger')
      $container->get('messenger'),
      $container->get('plugin.manager.mail'),
      $container->get('language_manager')
    );
  }

@@ -72,56 +92,28 @@ class InviteByEmail extends PluginBase implements InvitePluginInterface, Contain
   * {@inheritdoc}
   */
  public function send($invite) {
    /**
      * @var \Drupal\token\Token $token
      * @var \Drupal\Core\Mail\MailManager $mail
      */
    $bubbleable_metadata = new BubbleableMetadata();
    $token = \Drupal::service('token');
    $mail = \Drupal::service('plugin.manager.mail');
    $mail_key = $invite->get('type')->value;
    // Prepare message.
    $message = $mail->mail('invite_by_email', $mail_key, $invite->get('field_invite_email_address')->value, $invite->activeLangcode, [], $invite->getOwner()
      ->getEmail(), FALSE);
    // If HTML email.
    if (unserialize(\Drupal::config('invite.invite_type.' . $invite->get('type')->value)
      ->get('data'))['html_email']
    ) {
      $message['headers']['Content-Type'] = 'text/html; charset=UTF-8;';
    }
    $message['subject'] = $token->replace($invite->get('field_invite_email_subject')->value, ['invite' => $invite], [], $bubbleable_metadata);
    $body = [
      '#theme' => 'invite_by_email',
      '#body' => $token->replace($invite->get('field_invite_email_body')->value, ['invite' => $invite], [], $bubbleable_metadata),
    $module         = 'invite_by_email';
    $key            = $invite->get('type')->value;
    $to             = $invite->get('field_invite_email_address')->value;
    $from           = $invite->getOwner()->getEmail();
    $language_code  = $this->languageManager->getDefaultLanguage()->getId();
    $send_now       = TRUE;
    $params         = [
      'invite'  => $invite,
    ];
    $message['body'] = \Drupal::service('renderer')
      ->render($body)
      ->__toString();
    // Send.
    $system = $mail->getInstance([
      'module' => 'invite_by_email',
      'key' => $mail_key,
    ]);

    $result = $system->mail($message);
    $result = $this->mailManager->mail($module, $key, $to, $language_code, $params, $from, $send_now);

    if ($result) {

      $this->getMessenger()->addStatus($this->t('Invitation has been sent.'));

      $mail_user = $message['to'];

      \Drupal::logger('invite')->notice('Invitation has been sent for: @mail_user.', [
        '@mail_user' => $mail_user,
      ]);
      $this->messenger->addStatus($this->t('Invitation has been sent.'));
      \Drupal::logger('invite')->notice(
        'Invitation has been sent for: @mail_user.', ['@mail_user' => $to]
      );
    }
    else {

      $this->getMessenger()->addStatus($this->t('Failed to send a message.'), 'error');

      $this->messenger->addStatus($this->t('Failed to send a message.'), 'error');
      \Drupal::logger('invite')->error('Failed to send a message.');
    }

  }

}