OrderSender.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Model\Order\Email\Sender;
  7. use Magento\Payment\Helper\Data as PaymentHelper;
  8. use Magento\Sales\Model\Order;
  9. use Magento\Sales\Model\Order\Email\Container\OrderIdentity;
  10. use Magento\Sales\Model\Order\Email\Container\Template;
  11. use Magento\Sales\Model\Order\Email\Sender;
  12. use Magento\Sales\Model\ResourceModel\Order as OrderResource;
  13. use Magento\Sales\Model\Order\Address\Renderer;
  14. use Magento\Framework\Event\ManagerInterface;
  15. use Magento\Framework\DataObject;
  16. /**
  17. * Class OrderSender
  18. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  19. */
  20. class OrderSender extends Sender
  21. {
  22. /**
  23. * @var PaymentHelper
  24. */
  25. protected $paymentHelper;
  26. /**
  27. * @var OrderResource
  28. */
  29. protected $orderResource;
  30. /**
  31. * Global configuration storage.
  32. *
  33. * @var \Magento\Framework\App\Config\ScopeConfigInterface
  34. */
  35. protected $globalConfig;
  36. /**
  37. * @var Renderer
  38. */
  39. protected $addressRenderer;
  40. /**
  41. * Application Event Dispatcher
  42. *
  43. * @var ManagerInterface
  44. */
  45. protected $eventManager;
  46. /**
  47. * @param Template $templateContainer
  48. * @param OrderIdentity $identityContainer
  49. * @param Order\Email\SenderBuilderFactory $senderBuilderFactory
  50. * @param \Psr\Log\LoggerInterface $logger
  51. * @param PaymentHelper $paymentHelper
  52. * @param OrderResource $orderResource
  53. * @param \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
  54. * @param Renderer $addressRenderer
  55. * @param ManagerInterface $eventManager
  56. */
  57. public function __construct(
  58. Template $templateContainer,
  59. OrderIdentity $identityContainer,
  60. \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory,
  61. \Psr\Log\LoggerInterface $logger,
  62. Renderer $addressRenderer,
  63. PaymentHelper $paymentHelper,
  64. OrderResource $orderResource,
  65. \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig,
  66. ManagerInterface $eventManager
  67. ) {
  68. parent::__construct($templateContainer, $identityContainer, $senderBuilderFactory, $logger, $addressRenderer);
  69. $this->paymentHelper = $paymentHelper;
  70. $this->orderResource = $orderResource;
  71. $this->globalConfig = $globalConfig;
  72. $this->addressRenderer = $addressRenderer;
  73. $this->eventManager = $eventManager;
  74. }
  75. /**
  76. * Sends order email to the customer.
  77. *
  78. * Email will be sent immediately in two cases:
  79. *
  80. * - if asynchronous email sending is disabled in global settings
  81. * - if $forceSyncMode parameter is set to TRUE
  82. *
  83. * Otherwise, email will be sent later during running of
  84. * corresponding cron job.
  85. *
  86. * @param Order $order
  87. * @param bool $forceSyncMode
  88. * @return bool
  89. */
  90. public function send(Order $order, $forceSyncMode = false)
  91. {
  92. $order->setSendEmail(true);
  93. if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
  94. if ($this->checkAndSend($order)) {
  95. $order->setEmailSent(true);
  96. $this->orderResource->saveAttribute($order, ['send_email', 'email_sent']);
  97. return true;
  98. }
  99. } else {
  100. $order->setEmailSent(null);
  101. $this->orderResource->saveAttribute($order, 'email_sent');
  102. }
  103. $this->orderResource->saveAttribute($order, 'send_email');
  104. return false;
  105. }
  106. /**
  107. * Prepare email template with variables
  108. *
  109. * @param Order $order
  110. * @return void
  111. */
  112. protected function prepareTemplate(Order $order)
  113. {
  114. $transport = [
  115. 'order' => $order,
  116. 'billing' => $order->getBillingAddress(),
  117. 'payment_html' => $this->getPaymentHtml($order),
  118. 'store' => $order->getStore(),
  119. 'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
  120. 'formattedBillingAddress' => $this->getFormattedBillingAddress($order),
  121. ];
  122. $transportObject = new DataObject($transport);
  123. /**
  124. * Event argument `transport` is @deprecated. Use `transportObject` instead.
  125. */
  126. $this->eventManager->dispatch(
  127. 'email_order_set_template_vars_before',
  128. ['sender' => $this, 'transport' => $transportObject, 'transportObject' => $transportObject]
  129. );
  130. $this->templateContainer->setTemplateVars($transportObject->getData());
  131. parent::prepareTemplate($order);
  132. }
  133. /**
  134. * Get payment info block as html
  135. *
  136. * @param Order $order
  137. * @return string
  138. */
  139. protected function getPaymentHtml(Order $order)
  140. {
  141. return $this->paymentHelper->getInfoBlockHtml(
  142. $order->getPayment(),
  143. $this->identityContainer->getStore()->getStoreId()
  144. );
  145. }
  146. }