Commit ed8a0e8f authored by Pedro Cambra's avatar Pedro Cambra
Browse files

Issue #3281570: Email PDF is generated empty

parent b2960e35
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+62 −14
Original line number Diff line number Diff line
@@ -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 {

@@ -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.
   *
@@ -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;
  }

  /**
@@ -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 = [
@@ -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;
      }