custom/plugins/WbmTagManagerEcomm/src/Subscriber/StorefrontRenderSubscriber.php line 48

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Wbm\TagManagerEcomm\Subscriber;
  3. use Shopware\Storefront\Event\StorefrontRenderEvent;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  6. use Wbm\TagManagerEcomm\Cookie\CustomCookieProvider;
  7. use Wbm\TagManagerEcomm\Services\DataLayerModules;
  8. use Wbm\TagManagerEcomm\Services\DataLayerRenderer;
  9. use Wbm\TagManagerEcomm\Utility\SessionUtility;
  10. class StorefrontRenderSubscriber implements EventSubscriberInterface
  11. {
  12.     /**
  13.      * @var DataLayerModules
  14.      */
  15.     private $modules;
  16.     /**
  17.      * @var DataLayerRenderer
  18.      */
  19.     private $dataLayerRenderer;
  20.     /**
  21.      * @var SessionInterface
  22.      */
  23.     private $session;
  24.     public function __construct(
  25.         DataLayerModules  $modules,
  26.         DataLayerRenderer $dataLayerRenderer,
  27.         SessionInterface  $session
  28.     )
  29.     {
  30.         $this->modules = $modules;
  31.         $this->dataLayerRenderer = $dataLayerRenderer;
  32.         $this->session = $session;
  33.     }
  34.     public static function getSubscribedEvents(): array
  35.     {
  36.         return [
  37.             StorefrontRenderEvent::class => ['onRender', -1],
  38.         ];
  39.     }
  40.     public function onRender(StorefrontRenderEvent $event): void
  41.     {
  42.         $salesChannelId = $event->getSalesChannelContext()->getSalesChannel()->getId();
  43.         $containerId = $this->modules->getContainerId($salesChannelId);
  44.         $isActive = !empty($containerId) && $this->modules->isActive($salesChannelId);
  45.         $route = $event->getRequest()->attributes->get('_route');
  46.         if (!$isActive) {
  47.             return;
  48.         }
  49.         if ($this->session->has(SessionUtility::ATTRIBUTE_NAME)) {
  50.             if (in_array($route, $this->modules->getResponseRoutes(), true)) {
  51.                 $dataLayer = json_decode($this->session->get(SessionUtility::ATTRIBUTE_NAME), true);
  52.             }
  53.         } else {
  54.             $parameters = $event->getParameters();
  55.             $modules = $this->modules->getModules();
  56.             if (array_key_exists($route, $modules)) {
  57.                 $dataLayer = $this->dataLayerRenderer->setVariables($route, $parameters)->renderDataLayer($route);
  58.                 $dataLayer = $dataLayer->getDataLayer($route);
  59.             }
  60.         }
  61.         if (!$event->getRequest()->isXmlHttpRequest()) {
  62.             $event->setParameter(
  63.                 'wbmTagManagerConfig',
  64.                 [
  65.                     'gtmContainerId' => $containerId,
  66.                     'isTrackingProductClicks' => $this->modules->isTrackingProductClicks($salesChannelId),
  67.                     'wbmCookieEnabledName' => CustomCookieProvider::WBM_GTM_ENABLED_COOKIE_NAME,
  68.                     'hasSWConsentSupport' => $this->modules->hasSWConsentSupport($salesChannelId),
  69.                     'scriptTagAttributes' => $this->modules->getScriptTagAttributes($salesChannelId),
  70.                     'dataLayerScriptTagAttributes' => $this->modules->getDataLayerScriptTagAttributes($salesChannelId),
  71.                     'extendedUrlParameter' => $this->modules->getExtendedURLParameter($salesChannelId),
  72.                     'gtmFunctionOverwrite' => $this->modules->getGtmFunctionOverwrite($salesChannelId)
  73.                 ]
  74.             );
  75.             if (!empty($dataLayer)) {
  76.                 $event->setParameter(
  77.                     'dataLayer',
  78.                     $dataLayer['default']
  79.                 );
  80.                 if (array_key_exists('onEvent', $dataLayer)) {
  81.                     $event->setParameter(
  82.                         'onEvent',
  83.                         $dataLayer['onEvent']
  84.                     );
  85.                 }
  86.             }
  87.         }
  88.     }
  89. }