custom/plugins/DtgsGoogleTagManagerSw6/src/Subscriber/GeneralSubscriber.php line 137

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Dtgs\GoogleTagManager\Subscriber;
  3. use Dtgs\GoogleTagManager\Services\AdwordsService;
  4. use Dtgs\GoogleTagManager\Services\CustomerTagsService;
  5. use Dtgs\GoogleTagManager\Services\DatalayerService;
  6. use Dtgs\GoogleTagManager\Services\EnhancedEcommerceService;
  7. use Dtgs\GoogleTagManager\Services\Ga4Service;
  8. use Dtgs\GoogleTagManager\Services\GeneralTagsService;
  9. use Dtgs\GoogleTagManager\Services\RemarketingService;
  10. use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
  11. use Shopware\Core\Content\Cms\SalesChannel\Struct\ProductListingStruct;
  12. use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
  13. use Shopware\Core\Framework\Struct\ArrayEntity;
  14. use Shopware\Core\Framework\Struct\Struct;
  15. use Shopware\Core\PlatformRequest;
  16. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  17. use Shopware\Core\System\SystemConfig\SystemConfigService;
  18. use Shopware\Storefront\Page\Account\Login\AccountLoginPageLoadedEvent;
  19. use Shopware\Storefront\Page\Account\Order\AccountEditOrderPageLoadedEvent;
  20. use Shopware\Storefront\Page\Account\Order\AccountOrderPageLoadedEvent;
  21. use Shopware\Storefront\Page\Account\Overview\AccountOverviewPageLoadedEvent;
  22. use Shopware\Storefront\Page\Account\PaymentMethod\AccountPaymentMethodPageLoadedEvent;
  23. use Shopware\Storefront\Page\Account\Profile\AccountProfilePageLoadedEvent;
  24. use Shopware\Storefront\Page\Address\Listing\AddressListingPageLoadedEvent;
  25. use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
  26. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  27. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  28. use Shopware\Storefront\Page\Checkout\Register\CheckoutRegisterPageLoadedEvent;
  29. use Shopware\Storefront\Page\Contact\ContactPageLoadedEvent;
  30. use Shopware\Storefront\Page\LandingPage\LandingPageLoadedEvent;
  31. use Shopware\Storefront\Page\Maintenance\MaintenancePageLoadedEvent;
  32. use Shopware\Storefront\Page\Navigation\Error\ErrorPageLoadedEvent;
  33. use Shopware\Storefront\Page\Navigation\NavigationPageLoadedEvent;
  34. use Shopware\Storefront\Page\Newsletter\Register\NewsletterRegisterPageLoadedEvent;
  35. use Shopware\Storefront\Page\Newsletter\Subscribe\NewsletterSubscribePageLoadedEvent;
  36. use Shopware\Storefront\Page\Page;
  37. use Shopware\Storefront\Page\PageLoadedEvent;
  38. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  39. use Shopware\Storefront\Page\Search\SearchPageLoadedEvent;
  40. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  41. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  42. use Symfony\Component\HttpKernel\KernelEvents;
  43. class GeneralSubscriber implements EventSubscriberInterface
  44. {
  45.     /**
  46.      * @var SystemConfigService
  47.      */
  48.     private $systemConfigService;
  49.     /**
  50.      * @var DatalayerService
  51.      */
  52.     private $datalayerService;
  53.     /**
  54.      * @var Ga4Service
  55.      */
  56.     private $ga4Service;
  57.     /**
  58.      * @var EnhancedEcommerceService
  59.      */
  60.     private $enhancedEcomService;
  61.     /**
  62.      * @var RemarketingService
  63.      */
  64.     private $remarketingService;
  65.     /**
  66.      * @var AdwordsService
  67.      */
  68.     private $adwordsService;
  69.     /**
  70.      * @var GeneralTagsService
  71.      */
  72.     private $generalTagsService;
  73.     /**
  74.      * @var CustomerTagsService
  75.      */
  76.     private $customerTagsService;
  77.     public function __construct(SystemConfigService $systemConfigService,
  78.                                 DatalayerService $datalayerService,
  79.                                 Ga4Service $ga4Service,
  80.                                 EnhancedEcommerceService $enhancedEcomService,
  81.                                 RemarketingService $remarketingService,
  82.                                 AdwordsService $adwordsService,
  83.                                 GeneralTagsService $generalTagsService,
  84.                                 CustomerTagsService $customerTagsService)
  85.     {
  86.         $this->systemConfigService $systemConfigService;
  87.         $this->datalayerService $datalayerService;
  88.         $this->ga4Service $ga4Service;
  89.         $this->enhancedEcomService $enhancedEcomService;
  90.         $this->remarketingService $remarketingService;
  91.         $this->adwordsService $adwordsService;
  92.         $this->generalTagsService $generalTagsService;
  93.         $this->customerTagsService $customerTagsService;
  94.     }
  95.     public static function getSubscribedEvents(): array
  96.     {
  97.         return [
  98.             ProductPageLoadedEvent::class => 'onPageLoaded',
  99.             //
  100.             CheckoutCartPageLoadedEvent::class => 'onPageLoaded',
  101.             CheckoutConfirmPageLoadedEvent::class => 'onPageLoaded',
  102.             CheckoutRegisterPageLoadedEvent::class => 'onPageLoaded',
  103.             CheckoutFinishPageLoadedEvent::class => 'onPageLoaded',
  104.             //
  105.             AccountOverviewPageLoadedEvent::class => 'onPageLoaded',
  106.             AccountProfilePageLoadedEvent::class => 'onPageLoaded',
  107.             AccountLoginPageLoadedEvent::class => 'onPageLoaded',
  108.             AccountOrderPageLoadedEvent::class => 'onPageLoaded',
  109.             AccountPaymentMethodPageLoadedEvent::class => 'onPageLoaded',
  110.             AddressListingPageLoadedEvent::class => 'onPageLoaded',
  111.             //
  112.             SearchPageLoadedEvent::class => 'onPageLoaded',
  113.             //
  114.             NavigationPageLoadedEvent::class => 'onPageLoaded',
  115.             LandingPageLoadedEvent::class => 'onPageLoaded',
  116.             //
  117.             ErrorPageLoadedEvent::class => 'onPageLoaded',
  118.             MaintenancePageLoadedEvent::class => 'onPageLoaded',
  119.             ContactPageLoadedEvent::class => 'onPageLoaded',
  120.             //
  121.             NewsletterRegisterPageLoadedEvent::class => 'onPageLoaded',
  122.             NewsletterSubscribePageLoadedEvent::class => 'onPageLoaded',
  123.         ];
  124.     }
  125.     /**
  126.      * Event für alle Seiten
  127.      *
  128.      * @param PageLoadedEvent $event
  129.      * @throws \Exception
  130.      */
  131.     public function onPageLoaded($event)
  132.     {
  133.         /** @var Page $page */
  134.         $page $event->getPage();
  135.         $status 'enabled';
  136.         $salesChannelId $event->getSalesChannelContext()->getSalesChannel()->getId();
  137.         $containerIds $this->datalayerService->getContainerIds($salesChannelId);
  138.         if(!$containerIds) {
  139.             $status 'disabled';
  140.         }
  141.         //The following tags will always be there
  142.         $generalTags $this->generalTagsService->getGeneralTags($page$event->getSalesChannelContext()->getContext(), $event->getRequest());
  143.         $customerTags $this->customerTagsService->getCustomerTags($event->getSalesChannelContext()->getCustomer(), $event->getSalesChannelContext()->getContext());
  144.         $utmTags $this->generalTagsService->getUtmTags($event->getRequest());
  145.         //Specific page tags
  146.         $navigationTags = [];
  147.         $accountTags = [];
  148.         $detailTags = [];
  149.         $checkoutTags = [];
  150.         $searchTags = [];
  151.         //Remarketing - V6.0.1
  152.         $remarketingTags = [];
  153.         //EnhancedEcommerce - 6.0.2
  154.         $enhancedEcomTags = [];
  155.         //GA4 - 6.2.0
  156.         $ga4Tags = [];
  157.         switch (get_class($event)) {
  158.             case ProductPageLoadedEvent::class:
  159.                 $detailTags $this->datalayerService->getDetailTags($event->getPage()->getProduct(), $event->getSalesChannelContext());
  160.                 $remarketingTags $this->remarketingService->getDetailTags($event->getPage()->getProduct(), $event->getSalesChannelContext());
  161.                 $ga4Tags $this->ga4Service->getDetailTags($event->getPage()->getProduct(), $event->getSalesChannelContext());
  162.                 $enhancedEcomTags $this->enhancedEcomService->getDetailTags($event->getPage()->getProduct(), $event->getSalesChannelContext());
  163.                 $page->addExtension('GtmAddToCartInfo', new ArrayEntity([
  164.                     'price' => $enhancedEcomTags['ecommerce']['detail']['products'][0]['price'],
  165.                     'sku' => $enhancedEcomTags['ecommerce']['detail']['products'][0]['id'],
  166.                 ]));
  167.                 break;
  168.             case CheckoutCartPageLoadedEvent::class:
  169.             case CheckoutConfirmPageLoadedEvent::class:
  170.             case CheckoutRegisterPageLoadedEvent::class:
  171.                 $checkoutTags $this->datalayerService->getCheckoutTags($page->getCart(), $event->getSalesChannelContext());
  172.                 $remarketingTags $this->remarketingService->getCheckoutTags($page->getCart(), $event->getSalesChannelContext());
  173.                 $ga4Tags $this->ga4Service->getCheckoutTags($page->getCart(), $event);
  174.                 $enhancedEcomTags $this->enhancedEcomService->getCheckoutTags($page->getCart(), $event);
  175.                 break;
  176.             case CheckoutFinishPageLoadedEvent::class:
  177.                 $checkoutTags $this->datalayerService->getFinishTags($page->getOrder(), $event->getSalesChannelContext());
  178.                 $remarketingTags $this->remarketingService->getPurchaseConfirmationTags($page->getOrder(), $event->getSalesChannelContext());
  179.                 $ga4Tags $this->ga4Service->getPurchaseConfirmationTags($page->getOrder(), $event->getSalesChannelContext());
  180.                 $enhancedEcomTags $this->enhancedEcomService->getPurchaseConfirmationTags($page->getOrder(), $event->getSalesChannelContext());
  181.                 break;
  182.             case AccountOverviewPageLoadedEvent::class:
  183.             case AccountProfilePageLoadedEvent::class:
  184.             case AccountLoginPageLoadedEvent::class:
  185.             case AccountEditOrderPageLoadedEvent::class:
  186.             case AccountOrderPageLoadedEvent::class:
  187.             case AddressListingPageLoadedEvent::class:
  188.             case AccountPaymentMethodPageLoadedEvent::class:
  189.                 $accountTags $this->datalayerService->getAccountTags();
  190.                 $remarketingTags $this->remarketingService->getBasicTags($event->getRequest());
  191.                 break;
  192.             case SearchPageLoadedEvent::class:
  193.                 $searchTags $this->datalayerService->getSearchTags($page->getSearchTerm(), $page->getListing());
  194.                 $remarketingTags $this->remarketingService->getSearchTags($event->getRequest());
  195.                 $enhancedEcomTags $this->enhancedEcomService->getSearchTags($page->getSearchTerm(), $page->getListing(), $event->getSalesChannelContext());
  196.                 break;
  197.             case NavigationPageLoadedEvent::class:
  198.                 $navigationId $event->getRequest()->get('navigationId'$event->getSalesChannelContext()->getSalesChannel()->getNavigationCategoryId());
  199.                 $navigationTags $this->datalayerService->getNavigationTags($navigationId$event->getSalesChannelContext());
  200.                 /** @var SalesChannelProductEntity[] $products */
  201.                 $listing $this->getListingOnNavigationPage($event->getPage());
  202.                 if($listing) {
  203.                     $remarketingTags $this->remarketingService->getNavigationTags($navigationId$listing$event->getSalesChannelContext(), $event->getRequest());
  204.                     $enhancedEcomTags $this->enhancedEcomService->getNavigationTags($navigationId$listing$event->getSalesChannelContext());
  205.                     $ga4Tags $this->ga4Service->getNavigationTags($navigationId$listing$event->getSalesChannelContext());
  206.                 }
  207.                 else {
  208.                     $remarketingTags $this->remarketingService->getBasicTags($event->getRequest());
  209.                     $enhancedEcomTags $this->enhancedEcomService->getBasicTags($event->getSalesChannelContext());
  210.                 }
  211.                 break;
  212.             case ErrorPageLoadedEvent::class:
  213.             case NewsletterRegisterPageLoadedEvent::class:
  214.             case NewsletterSubscribePageLoadedEvent::class:
  215.             case MaintenancePageLoadedEvent::class:
  216.             case ContactPageLoadedEvent::class:
  217.             case LandingPageLoadedEvent::class:
  218.             default:
  219.                 $remarketingTags $this->remarketingService->getBasicTags($event->getRequest());
  220.                 $enhancedEcomTags $this->enhancedEcomService->getBasicTags($event->getSalesChannelContext());
  221.                 break;
  222.         }
  223.         $datalayerTags $this->datalayerService->prepareTagsForView(
  224.             $generalTags,
  225.             $navigationTags,
  226.             $accountTags,
  227.             $detailTags,
  228.             $checkoutTags,
  229.             $customerTags,
  230.             $utmTags,
  231.             $searchTags
  232.         );
  233.         $remarketingTags $this->remarketingService->prepareTagsForView($remarketingTags);
  234.         $ga4Tags $this->ga4Service->prepareTagsForView($ga4Tags);
  235.         $enhancedEcomTags $this->enhancedEcomService->prepareTagsForView($enhancedEcomTags);
  236.         $tagManagerConfig $this->datalayerService->getGtmConfig($salesChannelId);
  237.         $adwords_tracking_enabled = isset($tagManagerConfig['googleAdwordsId']) && $tagManagerConfig['googleAdwordsId'] != '';
  238.         /**
  239.          * UserCentrics compatiblity & CookieFirst compatiblity - since 6.1.26
  240.          */
  241.         $additionalServiceCode '';
  242.         if(isset($tagManagerConfig['usercentricsEnabled']) && $tagManagerConfig['usercentricsEnabled'] === true) {
  243.             $additionalServiceCode .= ' type="text/plain" data-usercentrics="Google Tag Manager"';
  244.         }
  245.         if(isset($tagManagerConfig['cookiefirstEnabled']) && $tagManagerConfig['cookiefirstEnabled'] === true) {
  246.             $additionalServiceCode .= ' type="text/plain" data-cookiefirst-script="google_tag_manager"';
  247.         }
  248.         $page->addExtension('GoogleTagManagerConfig', new ArrayEntity([
  249.             'containerIds' => $containerIds,
  250.             'tags' => $datalayerTags,
  251.             'remarketing_tags' => $remarketingTags,
  252.             'ga4_tags' => $ga4Tags,
  253.             'enhancedecommerce_tags' => $enhancedEcomTags,
  254.             'adwords_tracking_enabled' => $adwords_tracking_enabled,
  255.             'status' => $status,
  256.             'additionalServiceCode' => $additionalServiceCode,
  257.         ]));
  258.     }
  259.     /**
  260.      * @param Struct $page
  261.      * @return array|void
  262.      */
  263.     private function getListingOnNavigationPage(Struct $page)
  264.     {
  265.         $cmsPage $page->getCmsPage();
  266.         if (!$cmsPage || $cmsPage->getType() !== 'product_list') {
  267.             return;
  268.         }
  269.         $slots $cmsPage->getSections()->getBlocks()->getSlots();
  270.         foreach($slots as $slot) {
  271.             /** @var CmsSlotEntity $slot */
  272.             if($slot->getType() == 'product-listing') {
  273.                 /** @var ProductListingStruct $productListingStruct */
  274.                 $productListingStruct $slot->getData();
  275.                 break;
  276.             }
  277.         }
  278.         if(!isset($productListingStruct) || !is_a($productListingStruct'Shopware\Core\Content\Cms\SalesChannel\Struct\ProductListingStruct')) return;
  279.         return $productListingStruct->getListing()->getElements();
  280.     }
  281. }