commerce-8.x-2.8/modules/order/src/EventSubscriber/OrderReceiptSubscriber.php
modules/order/src/EventSubscriber/OrderReceiptSubscriber.php
<?php
namespace Drupal\commerce_order\EventSubscriber;
use Drupal\commerce_order\OrderTotalSummaryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Mail\MailManagerInterface;
use Drupal\Core\Render\RenderContext;
use Drupal\Core\Render\Renderer;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\state_machine\Event\WorkflowTransitionEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Sends a receipt email when an order is placed.
*/
class OrderReceiptSubscriber implements EventSubscriberInterface {
use StringTranslationTrait;
/**
* The order type entity storage.
*
* @var \Drupal\Core\Entity\EntityStorageInterface
*/
protected $orderTypeStorage;
/**
* The order total summary.
*
* @var \Drupal\commerce_order\OrderTotalSummaryInterface
*/
protected $orderTotalSummary;
/**
* The entity view builder for profiles.
*
* @var \Drupal\profile\ProfileViewBuilder
*/
protected $profileViewBuilder;
/**
* The language manager.
*
* @var \Drupal\Core\Language\LanguageManagerInterface
*/
protected $languageManager;
/**
* The mail manager.
*
* @var \Drupal\Core\Mail\MailManagerInterface
*/
protected $mailManager;
/**
* The renderer.
*
* @var \Drupal\Core\Render\RendererInterface
*/
protected $renderer;
/**
* Constructs a new OrderReceiptSubscriber object.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
* @param \Drupal\Core\Mail\MailManagerInterface $mail_manager
* The mail manager.
* @param \Drupal\commerce_order\OrderTotalSummaryInterface $order_total_summary
* The order total summary.
* @param \Drupal\Core\Render\Renderer $renderer
* The renderer.
*/
public function __construct(EntityTypeManagerInterface $entity_type_manager, LanguageManagerInterface $language_manager, MailManagerInterface $mail_manager, OrderTotalSummaryInterface $order_total_summary, Renderer $renderer) {
$this->orderTypeStorage = $entity_type_manager->getStorage('commerce_order_type');
$this->orderTotalSummary = $order_total_summary;
$this->profileViewBuilder = $entity_type_manager->getViewBuilder('profile');
$this->languageManager = $language_manager;
$this->mailManager = $mail_manager;
$this->renderer = $renderer;
}
/**
* Sends an order receipt email.
*
* @param \Drupal\state_machine\Event\WorkflowTransitionEvent $event
* The event we subscribed to.
*/
public function sendOrderReceipt(WorkflowTransitionEvent $event) {
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
$order = $event->getEntity();
/** @var \Drupal\commerce_order\Entity\OrderTypeInterface $order_type */
$order_type = $this->orderTypeStorage->load($order->bundle());
if (!$order_type->shouldSendReceipt()) {
return;
}
$to = $order->getEmail();
if (!$to) {
// The email should not be empty, unless the order is malformed.
return;
}
$params = [
'headers' => [
'Content-Type' => 'text/html; charset=UTF-8;',
'Content-Transfer-Encoding' => '8Bit',
],
'from' => $order->getStore()->getEmail(),
'subject' => $this->t('Order #@number confirmed', ['@number' => $order->getOrderNumber()]),
'order' => $order,
];
if ($receipt_bcc = $order_type->getReceiptBcc()) {
$params['headers']['Bcc'] = $receipt_bcc;
}
$build = [
'#theme' => 'commerce_order_receipt',
'#order_entity' => $order,
'#totals' => $this->orderTotalSummary->buildTotals($order),
];
if ($billing_profile = $order->getBillingProfile()) {
$build['#billing_information'] = $this->profileViewBuilder->view($billing_profile);
}
$params['body'] = $this->renderer->executeInRenderContext(new RenderContext(), function () use ($build) {
return $this->renderer->render($build);
});
// Replicated logic from EmailAction and contact's MailHandler.
if ($customer = $order->getCustomer()) {
$langcode = $customer->getPreferredLangcode();
}
else {
$langcode = $this->languageManager->getDefaultLanguage()->getId();
}
$this->mailManager->mail('commerce_order', 'receipt', $to, $langcode, $params);
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
$events = ['commerce_order.place.post_transition' => ['sendOrderReceipt', -100]];
return $events;
}
}
