Loading commerce_ticketing.services.yml +1 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ services: commerce_ticketing.ticket_receipt_mail: class: Drupal\commerce_ticketing\Mail\TicketReceiptMail arguments: ['@logger.channel.commerce_ticketing', '@entity_type.manager', '@plugin.manager.mail', '@plugin.manager.entity_print.print_engine', '@entity_print.print_builder', '@renderer'] arguments: ['@logger.channel.commerce_ticketing', '@entity_type.manager', '@plugin.manager.mail', '@plugin.manager.entity_print.print_engine', '@entity_print.print_builder', '@renderer', '@account_switcher', '@config.factory', '@language_manager'] commerce_ticketing.uuid_param_converter: class: Drupal\commerce_ticketing\Routing\UuidParamConverter Loading src/Mail/TicketReceiptMail.php +62 −14 Original line number Diff line number Diff line Loading @@ -3,13 +3,17 @@ namespace Drupal\commerce_ticketing\Mail; use Drupal\commerce_ticketing\CommerceTicketInterface; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Logger\LoggerChannelInterface; use Drupal\Core\Mail\MailManagerInterface; use Drupal\Core\Render\RendererInterface; use Drupal\Core\Session\AccountSwitcherInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\entity_print\Plugin\EntityPrintPluginManagerInterface; use Drupal\entity_print\PrintBuilderInterface; use Symfony\Component\HttpFoundation\StreamedResponse; class TicketReceiptMail { Loading Loading @@ -57,6 +61,27 @@ class TicketReceiptMail { */ protected $renderer; /** * The account switcher service. * * @var \Drupal\Core\Session\AccountSwitcherInterface */ protected $accountSwitcher; /** * The configuration factory. * * @var \Drupal\Core\Config\ConfigFactoryInterface */ protected $configFactory; /** * The language manager. * * @var \Drupal\Core\Language\LanguageManagerInterface */ protected $languageManager; /** * TicketReceiptMail constructor. * Loading @@ -72,14 +97,23 @@ class TicketReceiptMail { * Entity Print builder. * @param \Drupal\Core\Render\RendererInterface $renderer * The object renderer. * @param \Drupal\Core\Session\AccountSwitcherInterface $account_switcher * The account switcher service. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * The configuration factory. * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager * The language manager. */ public function __construct(LoggerChannelInterface $logger, EntityTypeManagerInterface $entity_type_manager, MailManagerInterface $mail_manager, EntityPrintPluginManagerInterface $plugin_manager, PrintBuilderInterface $print_builder, RendererInterface $renderer) { $this->entityTypeManager = $entity_type_manager; public function __construct(LoggerChannelInterface $logger, EntityTypeManagerInterface $entity_type_manager, MailManagerInterface $mail_manager, EntityPrintPluginManagerInterface $plugin_manager, PrintBuilderInterface $print_builder, RendererInterface $renderer, AccountSwitcherInterface $account_switcher, ConfigFactoryInterface $config_factory, LanguageManagerInterface $language_manager) { $this->logger = $logger; $this->entityTypeManager = $entity_type_manager; $this->mailManager = $mail_manager; $this->pluginManager = $plugin_manager; $this->printBuilder = $print_builder; $this->renderer = $renderer; $this->accountSwitcher = $account_switcher; $this->configFactory = $config_factory; $this->languageManager = $language_manager; } /** Loading @@ -88,12 +122,21 @@ class TicketReceiptMail { public function send(CommerceTicketInterface $ticket, $to = NULL, $bcc = NULL) { try { $order = $ticket->getOrder(); // If there's no recipient set, fallback to the ticket owner and then the // order owner. $to = $to ?? $ticket->getOwner()->getEmail() ?? $ticket->getOrder(); $customer = $ticket->getOwner() ?? $order->getCustomer(); $to = $to ?? $order->getEmail() ?? $customer->getEmail(); if (!$to) { return FALSE; } // Default site langcode, if the ticket owner is not anonymous, use that // instead. $langcode = $this->languageManager->getCurrentLanguage()->getId(); if ($customer->isAuthenticated()) { $langcode = $customer->getPreferredLangcode(); } if ($ticket->hasTranslation($langcode)) { $ticket = $ticket->getTranslation($langcode); } $subject = $this->t('Ticket for your order #@number', ['@number' => $order->getOrderNumber()]); $body = $this->entityTypeManager->getViewBuilder('commerce_ticket')->view($ticket, 'receipt'); $params = [ Loading @@ -106,24 +149,29 @@ class TicketReceiptMail { ]; $print_engine = $this->pluginManager->createSelectedInstance('pdf'); $config = $this->configFactory->get('entity_print.settings'); // We need to switch accounts to the customer so we can print the ticket // as if we were the user, otherwise it might try to print as anonymous // and show blank tickets. $this->accountSwitcher->switchTo($customer); // PDF generation inline so we don't have to deal with files. ob_start(); $this->printBuilder->deliverPrintable([$ticket], $print_engine, TRUE); (new StreamedResponse(function () use ($ticket, $print_engine, $config) { $this->printBuilder->deliverPrintable([$ticket], $print_engine, FALSE, $config->get('default_css')); }))->send(); $contents = ob_get_contents(); ob_end_clean(); $this->accountSwitcher->switchBack(); $params['attachment'] = [ 'filename' => $ticket->uuid() . '.pdf', 'filecontent' => $contents, 'filemime' => 'application/pdf', ]; // Default site langcode, if the ticket owner is not anonymous, use that // instead. $langcode = \Drupal::languageManager()->getCurrentLanguage()->getId(); if ($ticket->getOwner()->isAuthenticated()) { $langcode = $ticket->getOwner()->getPreferredLangcode(); } $result = $this->mailManager->mail('commerce_ticketing', 'ticket_receipt', $to, $langcode, $params, NULL, TRUE); $result = $this->mailManager->mail('commerce_ticketing', 'ticket_receipt', $to, $langcode, $params); if ($result['result']) { return TRUE; } Loading Loading
commerce_ticketing.services.yml +1 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ services: commerce_ticketing.ticket_receipt_mail: class: Drupal\commerce_ticketing\Mail\TicketReceiptMail arguments: ['@logger.channel.commerce_ticketing', '@entity_type.manager', '@plugin.manager.mail', '@plugin.manager.entity_print.print_engine', '@entity_print.print_builder', '@renderer'] arguments: ['@logger.channel.commerce_ticketing', '@entity_type.manager', '@plugin.manager.mail', '@plugin.manager.entity_print.print_engine', '@entity_print.print_builder', '@renderer', '@account_switcher', '@config.factory', '@language_manager'] commerce_ticketing.uuid_param_converter: class: Drupal\commerce_ticketing\Routing\UuidParamConverter Loading
src/Mail/TicketReceiptMail.php +62 −14 Original line number Diff line number Diff line Loading @@ -3,13 +3,17 @@ namespace Drupal\commerce_ticketing\Mail; use Drupal\commerce_ticketing\CommerceTicketInterface; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Logger\LoggerChannelInterface; use Drupal\Core\Mail\MailManagerInterface; use Drupal\Core\Render\RendererInterface; use Drupal\Core\Session\AccountSwitcherInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\entity_print\Plugin\EntityPrintPluginManagerInterface; use Drupal\entity_print\PrintBuilderInterface; use Symfony\Component\HttpFoundation\StreamedResponse; class TicketReceiptMail { Loading Loading @@ -57,6 +61,27 @@ class TicketReceiptMail { */ protected $renderer; /** * The account switcher service. * * @var \Drupal\Core\Session\AccountSwitcherInterface */ protected $accountSwitcher; /** * The configuration factory. * * @var \Drupal\Core\Config\ConfigFactoryInterface */ protected $configFactory; /** * The language manager. * * @var \Drupal\Core\Language\LanguageManagerInterface */ protected $languageManager; /** * TicketReceiptMail constructor. * Loading @@ -72,14 +97,23 @@ class TicketReceiptMail { * Entity Print builder. * @param \Drupal\Core\Render\RendererInterface $renderer * The object renderer. * @param \Drupal\Core\Session\AccountSwitcherInterface $account_switcher * The account switcher service. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * The configuration factory. * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager * The language manager. */ public function __construct(LoggerChannelInterface $logger, EntityTypeManagerInterface $entity_type_manager, MailManagerInterface $mail_manager, EntityPrintPluginManagerInterface $plugin_manager, PrintBuilderInterface $print_builder, RendererInterface $renderer) { $this->entityTypeManager = $entity_type_manager; public function __construct(LoggerChannelInterface $logger, EntityTypeManagerInterface $entity_type_manager, MailManagerInterface $mail_manager, EntityPrintPluginManagerInterface $plugin_manager, PrintBuilderInterface $print_builder, RendererInterface $renderer, AccountSwitcherInterface $account_switcher, ConfigFactoryInterface $config_factory, LanguageManagerInterface $language_manager) { $this->logger = $logger; $this->entityTypeManager = $entity_type_manager; $this->mailManager = $mail_manager; $this->pluginManager = $plugin_manager; $this->printBuilder = $print_builder; $this->renderer = $renderer; $this->accountSwitcher = $account_switcher; $this->configFactory = $config_factory; $this->languageManager = $language_manager; } /** Loading @@ -88,12 +122,21 @@ class TicketReceiptMail { public function send(CommerceTicketInterface $ticket, $to = NULL, $bcc = NULL) { try { $order = $ticket->getOrder(); // If there's no recipient set, fallback to the ticket owner and then the // order owner. $to = $to ?? $ticket->getOwner()->getEmail() ?? $ticket->getOrder(); $customer = $ticket->getOwner() ?? $order->getCustomer(); $to = $to ?? $order->getEmail() ?? $customer->getEmail(); if (!$to) { return FALSE; } // Default site langcode, if the ticket owner is not anonymous, use that // instead. $langcode = $this->languageManager->getCurrentLanguage()->getId(); if ($customer->isAuthenticated()) { $langcode = $customer->getPreferredLangcode(); } if ($ticket->hasTranslation($langcode)) { $ticket = $ticket->getTranslation($langcode); } $subject = $this->t('Ticket for your order #@number', ['@number' => $order->getOrderNumber()]); $body = $this->entityTypeManager->getViewBuilder('commerce_ticket')->view($ticket, 'receipt'); $params = [ Loading @@ -106,24 +149,29 @@ class TicketReceiptMail { ]; $print_engine = $this->pluginManager->createSelectedInstance('pdf'); $config = $this->configFactory->get('entity_print.settings'); // We need to switch accounts to the customer so we can print the ticket // as if we were the user, otherwise it might try to print as anonymous // and show blank tickets. $this->accountSwitcher->switchTo($customer); // PDF generation inline so we don't have to deal with files. ob_start(); $this->printBuilder->deliverPrintable([$ticket], $print_engine, TRUE); (new StreamedResponse(function () use ($ticket, $print_engine, $config) { $this->printBuilder->deliverPrintable([$ticket], $print_engine, FALSE, $config->get('default_css')); }))->send(); $contents = ob_get_contents(); ob_end_clean(); $this->accountSwitcher->switchBack(); $params['attachment'] = [ 'filename' => $ticket->uuid() . '.pdf', 'filecontent' => $contents, 'filemime' => 'application/pdf', ]; // Default site langcode, if the ticket owner is not anonymous, use that // instead. $langcode = \Drupal::languageManager()->getCurrentLanguage()->getId(); if ($ticket->getOwner()->isAuthenticated()) { $langcode = $ticket->getOwner()->getPreferredLangcode(); } $result = $this->mailManager->mail('commerce_ticketing', 'ticket_receipt', $to, $langcode, $params, NULL, TRUE); $result = $this->mailManager->mail('commerce_ticketing', 'ticket_receipt', $to, $langcode, $params); if ($result['result']) { return TRUE; } Loading