vendor/store.shopware.com/dtgsgoogletagmanagersw6/src/Subscriber/GeneralSubscriber.php line 130

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