custom/plugins/theme/src/Core/Content/Flow/Dispatching/Action/NewNewsletterSubscriptionAction.php line 61

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace DonCarneTheme\Core\Content\Flow\Dispatching\Action;
  3. use Psr\Log\LoggerInterface;
  4. use DonCarneTheme\Service\GraphQLClient;
  5. use Shopware\Core\Content\Flow\Dispatching\Action\FlowAction;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  7. use Shopware\Core\Framework\Event\FlowEvent;
  8. use Shopware\Core\Framework\Event\SalesChannelAware;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  12. use Shopware\Core\System\SystemConfig\SystemConfigService;
  13. use Symfony\Component\HttpFoundation\RequestStack;
  14. class NewNewsletterSubscriptionAction extends FlowAction
  15. {
  16.     private EntityRepository $newsletterRecipientRepository;
  17.     private SystemConfigService $systemConfigService;
  18.     private GraphQLClient $graphQLClient;
  19.     private LoggerInterface $logger;
  20.     private RequestStack $requestStack;
  21.     public function __construct(
  22.         EntityRepository $newsletterRecipientRepository
  23.         SystemConfigService $systemConfigService,
  24.         GraphQLClient $graphQLClient,
  25.         LoggerInterface $logger,
  26.         RequestStack $requestStack
  27.     )
  28.     {
  29.         $this->systemConfigService $systemConfigService;
  30.         $this->newsletterRecipientRepository $newsletterRecipientRepository;
  31.         $this->graphQLClient $graphQLClient;
  32.         $this->logger $logger;
  33.         $this->requestStack $requestStack;
  34.     }
  35.     public static function getName(): string
  36.     {
  37.         return 'action.send.newsletter.subscription';
  38.     }
  39.     public static function getSubscribedEvents(): array
  40.     {
  41.         return [
  42.             self::getName() => 'handle',
  43.         ];
  44.     }
  45.     public function requirements(): array
  46.     {
  47.         return [SalesChannelAware::class];
  48.     }
  49.     public function handle(FlowEvent $event): void
  50.     {
  51.         $request $this->requestStack->getMainRequest();
  52.         $baseEvent $event->getEvent();
  53.         if (!$baseEvent instanceof SalesChannelAware) {
  54.             $this->logger->error("Event is not of type SalesChannelAware");
  55.             return;
  56.         }
  57.         $context $baseEvent->getContext();
  58.         
  59.         $email $baseEvent->getNewsletterRecipient()->getEmail();
  60.         try {
  61.             $criteria = new Criteria();
  62.             $criteria->addFilter(new EqualsFilter('email'$email));
  63.             $criteria->addFilter(new EqualsFilter('salesChannelId'$baseEvent->getSalesChannelId()));
  64.             
  65.             $criteria->addSorting(new FieldSorting('createdAt'FieldSorting::DESCENDING));
  66.             $criteria->addAssociation('salutation');
  67.             $recipient $this->newsletterRecipientRepository->search($criteria$context)->first(); 
  68.             if ($recipient) {
  69.                 $salutationKey $recipient->getSalutation()->getSalutationKey();
  70.                 switch ($salutationKey) {
  71.                     case 'mr':
  72.                         $salutation 'MR';     
  73.                         break;
  74.                     case 'mrs':
  75.                         $salutation 'MRS';
  76.                         break;
  77.                     default:
  78.                         $salutation '';
  79.                         break;
  80.                 }
  81.                 $firstName $recipient->getFirstName() ?? '';
  82.                 $lastName $recipient->getLastName() ?? '';
  83.                 $hashedEmail hash('sha1'$email);
  84.                 $urlTemplate $this->systemConfigService->get(
  85.                     'core.newsletter.subscribeUrl',
  86.                     $baseEvent->getSalesChannelId()
  87.                 );
  88.     
  89.                 $url str_replace(
  90.                     [
  91.                         '%%HASHEDEMAIL%%',
  92.                         '%%SUBSCRIBEHASH%%',
  93.                     ],
  94.                     [
  95.                         $hashedEmail,
  96.                         $recipient->getHash(),
  97.                     ],
  98.                     $urlTemplate
  99.                 );
  100.                 // 426: this part if code needs to be finished -- waiting CP answer
  101.                 
  102.                 // $absoluteUrl = $request->attributes->get('sw-storefront-url') . $relativeUrl;
  103.                 $response $this->graphQLClient->sendNewsletterData($salutation$firstName$lastName$email$url)->getResults()->data->sfRequestNewsletter;
  104.                 // if ($response->success) {
  105.                 if (true) {
  106.                     $this->logger->info("Newsletter data correctly sent -- recipient id: "$recipient->getId());
  107.                     
  108.                     try {
  109.                         // $this->newsletterRecipientRepository->upsert([
  110.                         //     [
  111.                         //         'id' => $recipient->getId(),
  112.                         //         'customFields' => [
  113.                         //             'doncarne_newsletter_id' => $recipient->getHash()
  114.                         //         ],
  115.                         //     ]
  116.                         // ], $context);
  117.             
  118.                         $this->logger->info("Newsletter custom fields correctly inserted -- recipient id: "$recipient->getId());
  119.                     } catch (\Exception $e) {
  120.                         $this->logger->error(
  121.                             "Error inserting custom fields:\n"
  122.                             $e->getMessage() . "\n"
  123.                             'Error Code:' $e->getCode() . "\n"
  124.                         );
  125.                     }
  126.                 } else {
  127.                     $this->logger->error("GraphQLClient->sendNewsletterData() not successful.");
  128.                 }
  129.             } else {
  130.                 $this->logger->error("Missing newsletter recipient. Email: $email");
  131.             }
  132.         } catch (\Exception $e) {
  133.             $this->logger->error(
  134.                 "Error sending newsletter data:\n"
  135.                 $e->getMessage() . "\n"
  136.                 'Error Code:' $e->getCode() . "\n"
  137.             );
  138.         }
  139.     }
  140. }