vendor/pimcore/pimcore/bundles/EcommerceFrameworkBundle/EventListener/Frontend/TrackingCodeFlashMessageListener.php line 95

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\EventListener\Frontend;
  15. use Pimcore\Bundle\CoreBundle\EventListener\Traits\PimcoreContextAwareTrait;
  16. use Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\TrackingCodeAwareInterface;
  17. use Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\TrackingManager;
  18. use Pimcore\Http\Request\Resolver\PimcoreContextResolver;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. use Symfony\Component\HttpFoundation\Cookie;
  21. use Symfony\Component\HttpFoundation\Session\Session;
  22. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  23. use Symfony\Component\HttpKernel\Event\RequestEvent;
  24. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  25. use Symfony\Component\HttpKernel\KernelEvents;
  26. /**
  27.  * @internal
  28.  */
  29. class TrackingCodeFlashMessageListener implements EventSubscriberInterface
  30. {
  31.     use PimcoreContextAwareTrait;
  32.     const FLASH_MESSAGE_BAG_KEY 'ecommerceframework_trackingcode_flashmessagelistener';
  33.     /**
  34.      * @var SessionInterface
  35.      */
  36.     protected $session;
  37.     /**
  38.      * @var TrackingManager
  39.      */
  40.     protected $trackingManger;
  41.     public function __construct(SessionInterface $sessionTrackingManager $trackingManager)
  42.     {
  43.         $this->session $session;
  44.         $this->trackingManger $trackingManager;
  45.     }
  46.     public static function getSubscribedEvents()
  47.     {
  48.         return [
  49.             KernelEvents::REQUEST => 'onKernelRequest',
  50.             KernelEvents::RESPONSE => 'onKernelResponse',
  51.         ];
  52.     }
  53.     public function onKernelRequest(RequestEvent $event)
  54.     {
  55.         $request $event->getRequest();
  56.         if (!$this->matchesPimcoreContext($requestPimcoreContextResolver::CONTEXT_DEFAULT)) {
  57.             return;
  58.         }
  59.         if (!$event->isMainRequest()) {
  60.             return;
  61.         }
  62.         // Check FlashBag cookie exists to avoid autostart session by accessing the FlashBag.
  63.         $flashBagCookie = (bool)$request->cookies->get(self::FLASH_MESSAGE_BAG_KEY);
  64.         if ($flashBagCookie && $this->session instanceof Session) {
  65.             $trackedCodes $this->session->getFlashBag()->get(self::FLASH_MESSAGE_BAG_KEY);
  66.             if (is_array($trackedCodes) && count($trackedCodes)) {
  67.                 foreach ($this->trackingManger->getTrackers() as $tracker) {
  68.                     if ($tracker instanceof TrackingCodeAwareInterface && isset($trackedCodes[get_class($tracker)])) {
  69.                         foreach ($trackedCodes[get_class($tracker)] as $trackedCode) {
  70.                             $tracker->trackCode($trackedCode);
  71.                         }
  72.                     }
  73.                 }
  74.             }
  75.         }
  76.     }
  77.     /**
  78.      * @param ResponseEvent $event
  79.      */
  80.     public function onKernelResponse(ResponseEvent $event)
  81.     {
  82.         $response $event->getResponse();
  83.         $request $event->getRequest();
  84.         /**
  85.          * If tracking codes are forwarded as FlashMessage, then set a cookie which is checked in subsequent request for successful handshake
  86.          * else clear cookie, if set and FlashBag is already processed.
  87.          */
  88.         if (
  89.             $this->session instanceof Session &&
  90.             $this->session->isStarted() &&
  91.             $this->session->getFlashBag()->has(self::FLASH_MESSAGE_BAG_KEY)
  92.         ) {
  93.             $response->headers->setCookie(new Cookie(self::FLASH_MESSAGE_BAG_KEY'1'));
  94.             $response->headers->set('X-Pimcore-Output-Cache-Disable-Reason''Tracking Codes Passed');
  95.         } elseif ($request->cookies->has(self::FLASH_MESSAGE_BAG_KEY)) {
  96.             $response->headers->clearCookie(self::FLASH_MESSAGE_BAG_KEY);
  97.         }
  98.     }
  99. }