Commit 79ac65fd authored by Dale McGladdery's avatar Dale McGladdery Committed by renatog
Browse files

Issue #3227581 by kalpaitch, RenatoG, dale42: InviteByEmail $message['body'] should be an (array)

parent f17bf1d0
Loading
Loading
Loading
Loading
+26 −3
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
 * Contains invite_by_email.module.
 */

use Drupal\Component\Render\PlainTextOutput;
use Drupal\invite\InviteConstants;
use Drupal\Core\Form\FormStateInterface;

@@ -154,8 +155,30 @@ function invite_by_email_form_user_register_form_alter(&$form, FormStateInterfac
 * 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;';
  }

  $message['subject'] = $params['subject'];
  $message['body'] = $params['body'];

  $language_manager->setConfigOverrideLanguage($original_language);
}
+48 −52
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;
@@ -39,6 +40,20 @@ class InviteByEmail extends PluginBase implements InvitePluginInterface, Contain
    return $this->messenger;
  }

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

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

  /**
   * Constructs invite_by_email plugin.
   *
@@ -50,10 +65,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 +92,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,62 +102,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;
    $params['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,
    ];
    $body = \Drupal::service('renderer')
      ->render($body)
      ->__toString();
    $params['body'] = explode(PHP_EOL, str_replace("\r", '', $body));

    // Prepare message.
    $message = $mail->mail('invite_by_email', $mail_key, $invite->get('field_invite_email_address')->value, $invite->activeLangcode, $params, $invite->getOwner()
      ->getEmail(), FALSE);

    // If HTML email.
    $config = \Drupal::config('invite.invite_type.' . $invite->get('type')->value);
    $data = unserialize($config->get('data'));
    if ($data['html_email']) {
      $message['headers']['Content-Type'] = 'text/html; charset=UTF-8;';
      // Body has been converted from an array to a string by above mail() call.
      $message['body'] = html_entity_decode($message['body']);
    }
    // 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.');
    }

  }

}