entity_activity-8.x-1.0-beta13/modules/entity_activity_mail/src/MailHandler.php
modules/entity_activity_mail/src/MailHandler.php
<?php
namespace Drupal\entity_activity_mail;
use Drupal\Core\Language\LanguageDefault;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Mail\MailManagerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationManager;
/**
* Class MailHandler.
*
* From the commerce project. Thanks to @bojanz.
*
* @package Drupal\commerce_product_reminder
*/
class MailHandler implements MailHandlerInterface {
use StringTranslationTrait;
/**
* The language default.
*
* @var \Drupal\Core\Language\LanguageDefault
*/
protected $languageDefault;
/**
* The language manager.
*
* @var \Drupal\Core\Language\LanguageManagerInterface
*/
protected $languageManager;
/**
* The mail manager.
*
* @var \Drupal\Core\Mail\MailManagerInterface
*/
protected $mailManager;
/**
* Constructs a new MailHandler object.
*
* @param \Drupal\Core\Language\LanguageDefault $language_default
* The language default.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
* @param \Drupal\Core\Mail\MailManagerInterface $mail_manager
* The mail manager.
*/
public function __construct(LanguageDefault $language_default, LanguageManagerInterface $language_manager, MailManagerInterface $mail_manager) {
$this->languageDefault = $language_default;
$this->languageManager = $language_manager;
$this->mailManager = $mail_manager;
}
/**
* {@inheritdoc}
*/
public function sendMail($to, $subject, array $body, array $params = []) {
if (empty($to)) {
return FALSE;
}
$default_params = [
'headers' => [
'Content-Type' => 'text/html; charset=UTF-8;',
'Content-Transfer-Encoding' => '8Bit',
],
'id' => 'logs_report',
'from' => '',
'subject' => $subject,
'langcode' => $this->languageManager->getCurrentLanguage()->getId(),
// The body will be rendered in entity_activity_mail_mail(), because
// that's what MailManager expects. The correct theme and render context
// aren't setup until then.
'body' => $body,
];
if (!empty($params['bcc'])) {
$default_params['headers']['Bcc'] = $params['bcc'];
}
$params = array_replace($default_params, $params);
// Change the active language to ensure the email is properly translated.
if ($params['langcode'] != $default_params['langcode']) {
$this->changeActiveLanguage($params['langcode']);
}
$message = $this->mailManager->mail('entity_activity_mail', $params['id'], $to, $params['langcode'], $params);
// Revert back to the original active language.
if ($params['langcode'] != $default_params['langcode']) {
$this->changeActiveLanguage($default_params['langcode']);
}
return (bool) $message['result'];
}
/**
* {@inheritdoc}
*/
protected function changeActiveLanguage($langcode) {
if (!$this->languageManager->isMultilingual()) {
return;
}
$language = $this->languageManager->getLanguage($langcode);
if (!$language) {
return;
}
// The language manager has no method for overriding the default
// language, like it does for config overrides. We have to change the
// default language service's current language.
// @see https://www.drupal.org/project/drupal/issues/3029010
$this->languageDefault->set($language);
$this->languageManager->setConfigOverrideLanguage($language);
$this->languageManager->reset();
// The default string_translation service, TranslationManager, has a
// setDefaultLangcode method. However, this method is not present on
// either of its interfaces. Therefore we check for the concrete class
// here so that any swapped service does not break the application.
// @see https://www.drupal.org/project/drupal/issues/3029003
$string_translation = $this->getStringTranslation();
if ($string_translation instanceof TranslationManager) {
$string_translation->setDefaultLangcode($language->getId());
$string_translation->reset();
}
}
}
