custom/plugins/NewsletterSendinblue/src/Subscriber/NewsletterRecipientSubscriber.php line 67

Open in your IDE?
  1. <?php
  2. namespace NewsletterSendinblue\Subscriber;
  3. use NewsletterSendinblue\Service\ConfigService;
  4. use NewsletterSendinblue\Service\NewsletterRecipient\NewsletterRecipientProducer;
  5. use Shopware\Core\Content\MailTemplate\Service\Event\MailBeforeValidateEvent;
  6. use Shopware\Core\Content\Newsletter\Event\NewsletterConfirmEvent;
  7. use Shopware\Core\Content\Newsletter\Event\NewsletterRegisterEvent;
  8. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\Context;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. class NewsletterRecipientSubscriber implements EventSubscriberInterface
  14. {
  15.     /**
  16.      * @var NewsletterRecipientProducer
  17.      */
  18.     private $newsletterRecipientProducer;
  19.     /**
  20.      * @var ConfigService
  21.      */
  22.     private $configService;
  23.     /**
  24.      * @var EntityRepositoryInterface
  25.      */
  26.     private $mailTemplateRepository;
  27.     /**
  28.      * NewsletterRecipientSubscriber constructor.
  29.      *
  30.      * @param NewsletterRecipientProducer $newsletterRecipientProducer
  31.      * @param ConfigService $configService
  32.      * @param EntityRepositoryInterface $mailTemplateRepository
  33.      */
  34.     public function __construct(
  35.         NewsletterRecipientProducer $newsletterRecipientProducer,
  36.         ConfigService               $configService,
  37.         EntityRepositoryInterface   $mailTemplateRepository
  38.     )
  39.     {
  40.         $this->newsletterRecipientProducer $newsletterRecipientProducer;
  41.         $this->configService $configService;
  42.         $this->mailTemplateRepository $mailTemplateRepository;
  43.     }
  44.     /**
  45.      * @return array
  46.      */
  47.     public static function getSubscribedEvents(): array
  48.     {
  49.         return [
  50.             NewsletterConfirmEvent::class => 'onNewsletterConfirmEvent',
  51.             NewsletterRegisterEvent::class => 'onNewsletterRegisterEvent',
  52.             EntityWrittenContainerEvent::class => 'onEntityWrittenContainerEvent',
  53.             MailBeforeValidateEvent::class => 'onMailBeforeValidateEvent',
  54.         ];
  55.     }
  56.     /**
  57.      * @param NewsletterConfirmEvent $event
  58.      */
  59.     public function onNewsletterConfirmEvent(NewsletterConfirmEvent $event): void
  60.     {
  61.         $this->newsletterRecipientProducer->confirmContact($event->getNewsletterRecipient(), $event->getSalesChannelId());
  62.     }
  63.     /**
  64.      * @param NewsletterRegisterEvent $event
  65.      */
  66.     public function onNewsletterRegisterEvent(NewsletterRegisterEvent $event): void
  67.     {
  68.         $this->configService->setSalesChannelId($event->getSalesChannelId());
  69.         if ($this->configService->getSubscriptionMailing()) {
  70.             $this->newsletterRecipientProducer->confirmContact($event->getNewsletterRecipient(), $event->getSalesChannelId());
  71.         }
  72.     }
  73.     /**
  74.      * @param EntityWrittenContainerEvent $event
  75.      */
  76.     public function onEntityWrittenContainerEvent(EntityWrittenContainerEvent $event): void
  77.     {
  78.         foreach ($event->getEvents()->getElements() as $eventElement) {
  79.             if ($eventElement->getName() === 'newsletter_recipient.written') {
  80.                 foreach ($eventElement->getWriteResults() as $writeResult) {
  81.                     if ($writeResult->getOperation() === 'update') {
  82.                         $payload $writeResult->getPayload();
  83.                         $newsletterRecipientId $writeResult->getPrimaryKey();
  84.                         $salesChannelId $payload['salesChannelId'] ?? null;
  85.                         if (isset($payload['status']) && $payload['status'] == 'optOut') {
  86.                             $this->newsletterRecipientProducer->unsubscribeContact($newsletterRecipientId$salesChannelId);
  87.                         } else {
  88.                             $this->newsletterRecipientProducer->updateContact($newsletterRecipientId$salesChannelId);
  89.                         }
  90.                     }
  91.                 }
  92.             }
  93.         }
  94.     }
  95.     /**
  96.      * @param MailBeforeValidateEvent $event
  97.      */
  98.     public function onMailBeforeValidateEvent(MailBeforeValidateEvent $event): void
  99.     {
  100.         $data $event->getData();
  101.         $templateData $event->getTemplateData();
  102.         $context $event->getContext();
  103.         if (!isset($templateData['newsletterRecipient']) || !isset($data['templateId'])) {
  104.             return;
  105.         }
  106.         if (!$this->isNewsletterMailTemplate($data['templateId'], $context)) {
  107.             return;
  108.         }
  109.         $salesChannelId null;
  110.         if (!empty($data['salesChannelId'])) {
  111.             $salesChannelId $data['salesChannelId'];
  112.         }
  113.         if (empty($salesChannelId) && method_exists($context->getSource(), 'getSalesChannelId')) {
  114.             $salesChannelId $context->getSource()->getSalesChannelId();
  115.         }
  116.         if (!empty($salesChannelId)) {
  117.             $this->configService->setSalesChannelId($salesChannelId);
  118.         }
  119.         if (!$this->configService->getSubscriptionMailing()) {
  120.             return;
  121.         }
  122.         $event->stopPropagation();
  123.     }
  124.     /**
  125.      * @param string $templateId
  126.      * @param Context $context
  127.      * @return bool
  128.      */
  129.     private function isNewsletterMailTemplate(string $templateIdContext $context)
  130.     {
  131.         $criteria = new Criteria([$templateId]);
  132.         $criteria->addAssociation('mailTemplateType');
  133.         $mailTemplate $this->mailTemplateRepository->search($criteria$context)->first();
  134.         if (empty($mailTemplate)) {
  135.             return false;
  136.         }
  137.         return in_array($mailTemplate->getMailTemplateType()->getTechnicalName(), ['newsletterDoubleOptIn''newsletterRegister']);
  138.     }
  139. }