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

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 Enterprise License (PEL)
  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 PEL
  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\Session\Session;
  22. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  23. class TrackingManager implements TrackingManagerInterface
  24. {
  25.     /**
  26.      * @var TrackerInterface[]
  27.      */
  28.     protected $trackers = [];
  29.     /**
  30.      * @var TrackerInterface[]
  31.      */
  32.     protected $activeTrackerCache = [];
  33.     /**
  34.      * @var string
  35.      */
  36.     protected $cachedAssortmentTenant null;
  37.     /**
  38.      * @var string
  39.      */
  40.     protected $cachedCheckoutTenant null;
  41.     /**
  42.      * @var null|EnvironmentInterface
  43.      */
  44.     protected $enviroment null;
  45.     /**
  46.      * @var Session
  47.      */
  48.     protected $session;
  49.     /**
  50.      * @param TrackerInterface[] $trackers
  51.      * @param EnvironmentInterface $environment
  52.      */
  53.     public function __construct(array $trackers = [], EnvironmentInterface $environment)
  54.     {
  55.         foreach ($trackers as $tracker) {
  56.             $this->registerTracker($tracker);
  57.         }
  58.         $this->enviroment $environment;
  59.     }
  60.     /**
  61.      * @param Session $session
  62.      * @required
  63.      */
  64.     public function setSession(SessionInterface $session)
  65.     {
  66.         $this->session $session;
  67.     }
  68.     /**
  69.      * Register a tracker
  70.      *
  71.      * @param TrackerInterface $tracker
  72.      */
  73.     public function registerTracker(TrackerInterface $tracker)
  74.     {
  75.         $this->trackers[] = $tracker;
  76.     }
  77.     /**
  78.      * Get all registered trackers
  79.      *
  80.      * @return TrackerInterface[]
  81.      */
  82.     public function getTrackers(): array
  83.     {
  84.         return $this->trackers;
  85.     }
  86.     /**
  87.      * Get all for current tenants active trackers
  88.      *
  89.      * @return TrackerInterface[]
  90.      */
  91.     public function getActiveTrackers(): array
  92.     {
  93.         $currentAssortmentTenant $this->enviroment->getCurrentAssortmentTenant() ?: 'default';
  94.         $currentCheckoutTenant $this->enviroment->getCurrentCheckoutTenant() ?: 'default';
  95.         if ($currentAssortmentTenant !== $this->cachedAssortmentTenant || $currentCheckoutTenant !== $this->cachedCheckoutTenant) {
  96.             $this->cachedCheckoutTenant $currentCheckoutTenant;
  97.             $this->cachedAssortmentTenant $currentAssortmentTenant;
  98.             $this->activeTrackerCache = [];
  99.             foreach ($this->trackers as $tracker) {
  100.                 $active false;
  101.                 if (empty($tracker->getAssortmentTenants()) || in_array($currentAssortmentTenant$tracker->getAssortmentTenants())) {
  102.                     $active true;
  103.                 }
  104.                 if (empty($tracker->getCheckoutTenants()) || in_array($currentCheckoutTenant$tracker->getCheckoutTenants())) {
  105.                     $active true;
  106.                 }
  107.                 if ($active) {
  108.                     $this->activeTrackerCache[] = $tracker;
  109.                 }
  110.             }
  111.         }
  112.         return $this->activeTrackerCache;
  113.     }
  114.     /**
  115.      * Tracks a category page view
  116.      *
  117.      * @param array|string $category One or more categories matching the page
  118.      * @param mixed $page            Any kind of page information you can use to track your page
  119.      */
  120.     public function trackCategoryPageView($category$page null)
  121.     {
  122.         foreach ($this->getActiveTrackers() as $tracker) {
  123.             if ($tracker instanceof CategoryPageViewInterface) {
  124.                 $tracker->trackCategoryPageView($category$page);
  125.             }
  126.         }
  127.     }
  128.     /**
  129.      * Track product impression
  130.      *
  131.      * @implements IProductImpression
  132.      *
  133.      * @param ProductInterface $product
  134.      * @param string $list
  135.      */
  136.     public function trackProductImpression(ProductInterface $productstring $list 'default')
  137.     {
  138.         foreach ($this->getActiveTrackers() as $tracker) {
  139.             if ($tracker instanceof ProductImpressionInterface) {
  140.                 $tracker->trackProductImpression($product$list);
  141.             }
  142.         }
  143.     }
  144.     /**
  145.      * Track product view
  146.      *
  147.      * @param ProductInterface $product
  148.      *
  149.      * @implements ProductInterfaceView
  150.      */
  151.     public function trackProductView(ProductInterface $product)
  152.     {
  153.         foreach ($this->getActiveTrackers() as $tracker) {
  154.             if ($tracker instanceof ProductViewInterface) {
  155.                 $tracker->trackProductView($product);
  156.             }
  157.         }
  158.     }
  159.     /**
  160.      * Track a cart update
  161.      *
  162.      * @param CartInterface $cart
  163.      */
  164.     public function trackCartUpdate(CartInterface $cart)
  165.     {
  166.         foreach ($this->getActiveTrackers() as $tracker) {
  167.             if ($tracker instanceof CartUpdateInterface) {
  168.                 $tracker->trackCartUpdate($cart);
  169.             }
  170.         }
  171.     }
  172.     /**
  173.      * Track product add to cart
  174.      *
  175.      * @param CartInterface $cart
  176.      * @param ProductInterface $product
  177.      * @param int|float $quantity
  178.      */
  179.     public function trackCartProductActionAdd(CartInterface $cartProductInterface $product$quantity 1)
  180.     {
  181.         foreach ($this->getActiveTrackers() as $tracker) {
  182.             if ($tracker instanceof CartProductActionAddInterface) {
  183.                 $tracker->trackCartProductActionAdd($cart$product$quantity);
  184.             }
  185.         }
  186.     }
  187.     /**
  188.      * Track product add to cart
  189.      *
  190.      * @deprecated Use CartProductActionAddInterface::trackCartProductActionAdd instead
  191.      *
  192.      * @param ProductInterface $product
  193.      * @param int|float $quantity
  194.      */
  195.     public function trackProductActionAdd(ProductInterface $product$quantity 1)
  196.     {
  197.         foreach ($this->getActiveTrackers() as $tracker) {
  198.             if ($tracker instanceof IProductActionAdd) {
  199.                 $tracker->trackProductActionAdd($product$quantity);
  200.             }
  201.         }
  202.     }
  203.     /**
  204.      * Track product remove from cart
  205.      *
  206.      * @param CartInterface $cart
  207.      * @param ProductInterface $product
  208.      * @param int|float $quantity
  209.      */
  210.     public function trackCartProductActionRemove(CartInterface $cartProductInterface $product$quantity 1)
  211.     {
  212.         foreach ($this->getActiveTrackers() as $tracker) {
  213.             if ($tracker instanceof CartProductActionRemoveInterface) {
  214.                 $tracker->trackCartProductActionRemove($cart$product$quantity);
  215.             }
  216.         }
  217.     }
  218.     /**
  219.      * Track product remove from cart
  220.      *
  221.      * @deprecated Use CartProductActionRemoveInterface::trackCartProductActionRemove instead
  222.      *
  223.      * @param ProductInterface $product
  224.      * @param int|float $quantity
  225.      */
  226.     public function trackProductActionRemove(ProductInterface $product$quantity 1)
  227.     {
  228.         foreach ($this->getActiveTrackers() as $tracker) {
  229.             if ($tracker instanceof IProductActionRemove) {
  230.                 $tracker->trackProductActionRemove($product$quantity);
  231.             }
  232.         }
  233.     }
  234.     /**
  235.      * Track start checkout with first step
  236.      *
  237.      * @implements CheckoutCompleteInterface
  238.      *
  239.      * @param CartInterface $cart
  240.      */
  241.     public function trackCheckout(CartInterface $cart)
  242.     {
  243.         foreach ($this->getActiveTrackers() as $tracker) {
  244.             if ($tracker instanceof CheckoutInterface) {
  245.                 $tracker->trackCheckout($cart);
  246.             }
  247.         }
  248.     }
  249.     /**
  250.      * Track checkout complete
  251.      *
  252.      * @implements CheckoutCompleteInterface
  253.      *
  254.      * @param AbstractOrder $order
  255.      */
  256.     public function trackCheckoutComplete(AbstractOrder $order)
  257.     {
  258.         if ($order->getProperty('os_tracked')) {
  259.             return;
  260.         }
  261.         // add property to order object in order to prevent multiple checkout complete tracking
  262.         $order->setProperty('os_tracked''bool'true);
  263.         $order->save();
  264.         foreach ($this->getActiveTrackers() as $tracker) {
  265.             if ($tracker instanceof CheckoutCompleteInterface) {
  266.                 $tracker->trackCheckoutComplete($order);
  267.             }
  268.         }
  269.     }
  270.     /**
  271.      * Track checkout step
  272.      *
  273.      * @implements CheckoutStepInterface
  274.      *
  275.      * @param CheckoutManagerCheckoutStepInterface $step
  276.      * @param CartInterface $cart
  277.      * @param string|null $stepNumber
  278.      * @param string|null $checkoutOption
  279.      */
  280.     public function trackCheckoutStep(CheckoutManagerCheckoutStepInterface $stepCartInterface $cart$stepNumber null$checkoutOption null)
  281.     {
  282.         foreach ($this->getActiveTrackers() as $tracker) {
  283.             if ($tracker instanceof CheckoutStepInterface) {
  284.                 $tracker->trackCheckoutStep($step$cart$stepNumber$checkoutOption);
  285.             }
  286.         }
  287.     }
  288.     public function getTrackedCodes(): string
  289.     {
  290.         $result '';
  291.         foreach ($this->getTrackers() as $tracker) {
  292.             if ($tracker instanceof TrackingCodeAwareInterface) {
  293.                 if (count($tracker->getTrackedCodes())) {
  294.                     $result .= implode(PHP_EOL$tracker->getTrackedCodes()).PHP_EOL.PHP_EOL;
  295.                 }
  296.             }
  297.         }
  298.         return $result;
  299.     }
  300.     public function forwardTrackedCodesAsFlashMessage(): TrackingManagerInterface
  301.     {
  302.         $trackedCodes = [];
  303.         foreach ($this->getTrackers() as $tracker) {
  304.             if ($tracker instanceof TrackingCodeAwareInterface) {
  305.                 if (count($tracker->getTrackedCodes())) {
  306.                     $trackedCodes[get_class($tracker)] = $tracker->getTrackedCodes();
  307.                 }
  308.             }
  309.         }
  310.         $this->session->getFlashBag()->set(TrackingCodeFlashMessageListener::FLASH_MESSAGE_BAG_KEY$trackedCodes);
  311.         return $this;
  312.     }
  313.     public function trackEvent(
  314.         string $eventCategory,
  315.         string $eventAction,
  316.         string $eventLabel null,
  317.         int $eventValue null
  318.     ) {
  319.         foreach ($this->getTrackers() as $tracker) {
  320.             if ($tracker instanceof TrackEventInterface) {
  321.                 $tracker->trackEvent($eventCategory$eventAction$eventLabel$eventValue);
  322.             }
  323.         }
  324.     }
  325. }