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

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