vendor/pimcore/pimcore/bundles/EcommerceFrameworkBundle/Tracking/TrackingManager.php line 186

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Bundle\EcommerceFrameworkBundle\Tracking;
  15. use Pimcore\Bundle\EcommerceFrameworkBundle\CartManager\CartInterface;
  16. use Pimcore\Bundle\EcommerceFrameworkBundle\CheckoutManager\CheckoutStepInterface as CheckoutManagerCheckoutStepInterface;
  17. use Pimcore\Bundle\EcommerceFrameworkBundle\EnvironmentInterface;
  18. use Pimcore\Bundle\EcommerceFrameworkBundle\EventListener\Frontend\TrackingCodeFlashMessageListener;
  19. use Pimcore\Bundle\EcommerceFrameworkBundle\Model\AbstractOrder;
  20. use Pimcore\Bundle\EcommerceFrameworkBundle\Model\ProductInterface;
  21. use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException;
  22. use Symfony\Component\HttpFoundation\RequestStack;
  23. use Symfony\Component\HttpFoundation\Session\Session;
  24. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  25. class TrackingManager implements TrackingManagerInterface
  26. {
  27.     /**
  28.      * @var TrackerInterface[]
  29.      */
  30.     protected $trackers = [];
  31.     /**
  32.      * @var TrackerInterface[]
  33.      */
  34.     protected $activeTrackerCache = [];
  35.     /**
  36.      * @var string
  37.      */
  38.     protected $cachedAssortmentTenant null;
  39.     /**
  40.      * @var string
  41.      */
  42.     protected $cachedCheckoutTenant null;
  43.     /**
  44.      * @var null|EnvironmentInterface
  45.      */
  46.     protected $enviroment null;
  47.     /**
  48.      *
  49.      * @deprecated will be removed in Pimcore 11
  50.      *
  51.      * @var Session
  52.      */
  53.     protected $session;
  54.     /**
  55.      * @var RequestStack
  56.      */
  57.     protected RequestStack $requestStack;
  58.     /**
  59.      * @param TrackerInterface[] $trackers
  60.      * @param EnvironmentInterface $environment
  61.      */
  62.     public function __construct(EnvironmentInterface $environment, array $trackers = [])
  63.     {
  64.         foreach ($trackers as $tracker) {
  65.             $this->registerTracker($tracker);
  66.         }
  67.         $this->enviroment $environment;
  68.     }
  69.     /**
  70.      * @deprecated
  71.      *
  72.      * @param Session $session
  73.      *
  74.      * @required
  75.      */
  76.     public function setSession(SessionInterface $session)
  77.     {
  78.         $this->session $session;
  79.     }
  80.     /**
  81.      * @TODO move to constructor injection in Pimcore 11
  82.      *
  83.      * @required
  84.      *
  85.      * @internal
  86.      *
  87.      * @param RequestStack $requestStack
  88.      */
  89.     public function setRequestStack(RequestStack $requestStack): void
  90.     {
  91.         $this->requestStack $requestStack;
  92.     }
  93.     /**
  94.      * Register a tracker
  95.      *
  96.      * @param TrackerInterface $tracker
  97.      */
  98.     public function registerTracker(TrackerInterface $tracker)
  99.     {
  100.         $this->trackers[] = $tracker;
  101.     }
  102.     /**
  103.      * Get all registered trackers
  104.      *
  105.      * @return TrackerInterface[]
  106.      */
  107.     public function getTrackers(): array
  108.     {
  109.         return $this->trackers;
  110.     }
  111.     /**
  112.      * Get all for current tenants active trackers
  113.      *
  114.      * @return TrackerInterface[]
  115.      */
  116.     public function getActiveTrackers(): array
  117.     {
  118.         $currentAssortmentTenant $this->enviroment->getCurrentAssortmentTenant() ?: 'default';
  119.         $currentCheckoutTenant $this->enviroment->getCurrentCheckoutTenant() ?: 'default';
  120.         if ($currentAssortmentTenant !== $this->cachedAssortmentTenant || $currentCheckoutTenant !== $this->cachedCheckoutTenant) {
  121.             $this->cachedCheckoutTenant $currentCheckoutTenant;
  122.             $this->cachedAssortmentTenant $currentAssortmentTenant;
  123.             $this->activeTrackerCache = [];
  124.             foreach ($this->trackers as $tracker) {
  125.                 $active false;
  126.                 if (empty($tracker->getAssortmentTenants()) || in_array($currentAssortmentTenant$tracker->getAssortmentTenants())) {
  127.                     $active true;
  128.                 }
  129.                 if (empty($tracker->getCheckoutTenants()) || in_array($currentCheckoutTenant$tracker->getCheckoutTenants())) {
  130.                     $active true;
  131.                 }
  132.                 if ($active) {
  133.                     $this->activeTrackerCache[] = $tracker;
  134.                 }
  135.             }
  136.         }
  137.         return $this->activeTrackerCache;
  138.     }
  139.     /**
  140.      * Tracks a category page view
  141.      *
  142.      * @param array|string $category One or more categories matching the page
  143.      * @param mixed $page            Any kind of page information you can use to track your page
  144.      */
  145.     public function trackCategoryPageView($category$page null)
  146.     {
  147.         foreach ($this->getActiveTrackers() as $tracker) {
  148.             if ($tracker instanceof CategoryPageViewInterface) {
  149.                 $tracker->trackCategoryPageView($category$page);
  150.             }
  151.         }
  152.     }
  153.     /**
  154.      * Track product impression
  155.      *
  156.      * @param ProductInterface $product
  157.      * @param string $list
  158.      */
  159.     public function trackProductImpression(ProductInterface $productstring $list 'default')
  160.     {
  161.         foreach ($this->getActiveTrackers() as $tracker) {
  162.             if ($tracker instanceof ProductImpressionInterface) {
  163.                 $tracker->trackProductImpression($product$list);
  164.             }
  165.         }
  166.     }
  167.     /**
  168.      * Track product view
  169.      *
  170.      * @param ProductInterface $product
  171.      */
  172.     public function trackProductView(ProductInterface $product)
  173.     {
  174.         foreach ($this->getActiveTrackers() as $tracker) {
  175.             if ($tracker instanceof ProductViewInterface) {
  176.                 $tracker->trackProductView($product);
  177.             }
  178.         }
  179.     }
  180.     /**
  181.      * Track a cart update
  182.      *
  183.      * @param CartInterface $cart
  184.      */
  185.     public function trackCartUpdate(CartInterface $cart)
  186.     {
  187.         foreach ($this->getActiveTrackers() as $tracker) {
  188.             if ($tracker instanceof CartUpdateInterface) {
  189.                 $tracker->trackCartUpdate($cart);
  190.             }
  191.         }
  192.     }
  193.     /**
  194.      * Track product add to cart
  195.      *
  196.      * @param CartInterface $cart
  197.      * @param ProductInterface $product
  198.      * @param int|float $quantity
  199.      */
  200.     public function trackCartProductActionAdd(CartInterface $cartProductInterface $product$quantity 1)
  201.     {
  202.         foreach ($this->getActiveTrackers() as $tracker) {
  203.             if ($tracker instanceof CartProductActionAddInterface) {
  204.                 $tracker->trackCartProductActionAdd($cart$product$quantity);
  205.             }
  206.         }
  207.     }
  208.     /**
  209.      * Track product remove from cart
  210.      *
  211.      * @param CartInterface $cart
  212.      * @param ProductInterface $product
  213.      * @param int|float $quantity
  214.      */
  215.     public function trackCartProductActionRemove(CartInterface $cartProductInterface $product$quantity 1)
  216.     {
  217.         foreach ($this->getActiveTrackers() as $tracker) {
  218.             if ($tracker instanceof CartProductActionRemoveInterface) {
  219.                 $tracker->trackCartProductActionRemove($cart$product$quantity);
  220.             }
  221.         }
  222.     }
  223.     /**
  224.      * Track start checkout with first step
  225.      *
  226.      * @param CartInterface $cart
  227.      */
  228.     public function trackCheckout(CartInterface $cart)
  229.     {
  230.         foreach ($this->getActiveTrackers() as $tracker) {
  231.             if ($tracker instanceof CheckoutInterface) {
  232.                 $tracker->trackCheckout($cart);
  233.             }
  234.         }
  235.     }
  236.     /**
  237.      * Track checkout complete
  238.      *
  239.      * @param AbstractOrder $order
  240.      */
  241.     public function trackCheckoutComplete(AbstractOrder $order)
  242.     {
  243.         if ($order->getProperty('os_tracked')) {
  244.             return;
  245.         }
  246.         // add property to order object in order to prevent multiple checkout complete tracking
  247.         $order->setProperty('os_tracked''bool'true);
  248.         $order->save();
  249.         foreach ($this->getActiveTrackers() as $tracker) {
  250.             if ($tracker instanceof CheckoutCompleteInterface) {
  251.                 $tracker->trackCheckoutComplete($order);
  252.             }
  253.         }
  254.     }
  255.     /**
  256.      * Track checkout step
  257.      *
  258.      * @param CheckoutManagerCheckoutStepInterface $step
  259.      * @param CartInterface $cart
  260.      * @param string|null $stepNumber
  261.      * @param string|null $checkoutOption
  262.      */
  263.     public function trackCheckoutStep(CheckoutManagerCheckoutStepInterface $stepCartInterface $cart$stepNumber null$checkoutOption null)
  264.     {
  265.         foreach ($this->getActiveTrackers() as $tracker) {
  266.             if ($tracker instanceof CheckoutStepInterface) {
  267.                 $tracker->trackCheckoutStep($step$cart$stepNumber$checkoutOption);
  268.             }
  269.         }
  270.     }
  271.     public function getTrackedCodes(): string
  272.     {
  273.         $result '';
  274.         foreach ($this->getTrackers() as $tracker) {
  275.             if ($tracker instanceof TrackingCodeAwareInterface) {
  276.                 if (count($tracker->getTrackedCodes())) {
  277.                     $result .= implode(PHP_EOL$tracker->getTrackedCodes()).PHP_EOL.PHP_EOL;
  278.                 }
  279.             }
  280.         }
  281.         return $result;
  282.     }
  283.     public function forwardTrackedCodesAsFlashMessage(): TrackingManagerInterface
  284.     {
  285.         $trackedCodes = [];
  286.         foreach ($this->getTrackers() as $tracker) {
  287.             if ($tracker instanceof TrackingCodeAwareInterface) {
  288.                 if (count($tracker->getTrackedCodes())) {
  289.                     $trackedCodes[get_class($tracker)] = $tracker->getTrackedCodes();
  290.                 }
  291.             }
  292.         }
  293.         try {
  294.             $session $this->requestStack->getSession();
  295.         } catch (SessionNotFoundException $e) {
  296.             trigger_deprecation('pimcore/pimcore''10.5',
  297.                 sprintf('Session used with non existing request stack in %s, that will not be possible in Pimcore 11.'__CLASS__));
  298.             $session $this->session;
  299.         }
  300.         // @phpstan-ignore-next-line
  301.         $session->getFlashBag()->set(TrackingCodeFlashMessageListener::FLASH_MESSAGE_BAG_KEY$trackedCodes);
  302.         return $this;
  303.     }
  304.     public function trackEvent(
  305.         string $eventCategory,
  306.         string $eventAction,
  307.         string $eventLabel null,
  308.         int $eventValue null
  309.     ) {
  310.         foreach ($this->getTrackers() as $tracker) {
  311.             if ($tracker instanceof TrackEventInterface) {
  312.                 $tracker->trackEvent($eventCategory$eventAction$eventLabel$eventValue);
  313.             }
  314.         }
  315.     }
  316. }