custom/plugins/OttEmarsysIntegration/src/Subscriber/StorefrontSubscriber.php line 35

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Ott\EmarsysIntegration\Subscriber;
  3. use Ott\EmarsysIntegration\Client\TpgOneClient;
  4. use Ott\EmarsysIntegration\Gateway\EmarsysCustomerGateway;
  5. use Shopware\Core\Content\Newsletter\Event\NewsletterRegisterEvent;
  6. use Shopware\Core\Framework\Struct\ArrayStruct;
  7. use Shopware\Storefront\Page\Navigation\NavigationPageLoadedEvent;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. class StorefrontSubscriber implements EventSubscriberInterface
  11. {
  12.     private const SALUTATION_NONE 'prefer not to say';
  13.     private const SALUTATION_MALE 'male';
  14.     private const SALUTATION_FEMALE 'female';
  15.     public function __construct(
  16.         private readonly TpgOneClient $tpgOneClient,
  17.         private readonly RequestStack $requestStack,
  18.         private readonly EmarsysCustomerGateway $emarsysCustomerGateway,
  19.     )
  20.     {
  21.     }
  22.     public static function getSubscribedEvents(): array
  23.     {
  24.         return [
  25.             NavigationPageLoadedEvent::class => 'onNavigationPageLoaded',
  26.             NewsletterRegisterEvent::class   => 'onNewsletterRegister',
  27.         ];
  28.     }
  29.     public function onNavigationPageLoaded(NavigationPageLoadedEvent $event): void
  30.     {
  31.         $url $event->getSalesChannelContext()->getSalesChannel()->getDomains()->first()->getUrl();
  32.         $departments = [];
  33.         foreach ($this->tpgOneClient->getDepartments()['suites'] ?? [] as $suite) {
  34.             if ($suite['media']) {
  35.                 $suite['media'] = TpgOneClient::MEDIA_URL $suite['media'];
  36.             }
  37.             $suite['preselection'] = false;
  38.             if ('moebel_wohnen' === $suite['mapping_name']) {
  39.                 $suite['preselection'] = true;
  40.             }
  41.             $departments[] = $suite;
  42.         }
  43.         $event->getPage()->addExtension('ottEmarsys', new ArrayStruct([
  44.             'departments' => $departments,
  45.             'salutations' => $this->emarsysCustomerGateway->getSalutations(),
  46.         ]));
  47.     }
  48.     public function onNewsletterRegister(NewsletterRegisterEvent $event): void
  49.     {
  50.         $email $event->getNewsletterRecipient()->getEmail();
  51.         $payload $this->requestStack->getMainRequest()->request->all();
  52.         $departments = [];
  53.         foreach ($this->tpgOneClient->getDepartments()['suites'] ?? [] as $suite) {
  54.             $departments[] = $suite;
  55.         }
  56.         $storeDepartments = [];
  57.         foreach ($payload as $parameter => $value) {
  58.             foreach ($departments as $department) {
  59.                 if (
  60.                     $parameter === $department['name']
  61.                     && 'on' === $value
  62.                 ) {
  63.                     $storeDepartments[$department['name']] = 'on';
  64.                 }
  65.             }
  66.         }
  67.         if ($email) {
  68.             $urlParts explode('/'str_replace('https://'''$event->getUrl()));
  69.             try {
  70.                 $this->tpgOneClient->save(
  71.                     array_merge([
  72.                         'id'       => $email,
  73.                         'origin'   => 'https://' $urlParts[0],
  74.                         'locale'   => 'de_DE',
  75.                         'userData' => [
  76.                             'included' => [],
  77.                             'data'     => [
  78.                                 'attributes' => [
  79.                                     'email'     => $email,
  80.                                     'firstName' => $payload['firstName'],
  81.                                     'lastName'  => $payload['lastName'],
  82.                                     'gender'    => $this->convertSalutationToGender($payload['salutationId']),
  83.                                 ],
  84.                             ],
  85.                             'optin'    => 1,
  86.                         ],
  87.                     ], $storeDepartments)
  88.                 );
  89.             } catch (\Exception $e) {
  90.             }
  91.         }
  92.     }
  93.     private function convertSalutationToGender(string $salutationId): string
  94.     {
  95.         $salutationKey $this->emarsysCustomerGateway->getSalutationById($salutationId);
  96.         if (null === $salutationKey) {
  97.             return self::SALUTATION_NONE;
  98.         }
  99.         return match ($salutationKey) {
  100.             'not_specified' => self::SALUTATION_NONE,
  101.             'mrs'           => self::SALUTATION_FEMALE,
  102.             'mr'            => self::SALUTATION_MALE,
  103.         };
  104.     }
  105. }