vendor/pimcore/customer-management-framework-bundle/src/Targeting/EventListener/ElementSegmentsListener.php line 73

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Enterprise License (PEL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  * @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  * @license    http://www.pimcore.org/license     GPLv3 and PEL
  14.  */
  15. namespace CustomerManagementFrameworkBundle\Targeting\EventListener;
  16. use CustomerManagementFrameworkBundle\Model\CustomerSegmentInterface;
  17. use CustomerManagementFrameworkBundle\SegmentManager\SegmentManagerInterface;
  18. use CustomerManagementFrameworkBundle\Targeting\SegmentTracker;
  19. use Pimcore\Event\Targeting\TargetingEvent;
  20. use Pimcore\Event\TargetingEvents;
  21. use Pimcore\Http\Request\Resolver\DocumentResolver;
  22. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  23. class ElementSegmentsListener implements EventSubscriberInterface
  24. {
  25.     /**
  26.      * @var array
  27.      */
  28.     private $segmentAssignmentTypes;
  29.     /**
  30.      * @var DocumentResolver
  31.      */
  32.     private $documentResolver;
  33.     /**
  34.      * @var SegmentManagerInterface
  35.      */
  36.     private $segmentManager;
  37.     /**
  38.      * @var SegmentTracker
  39.      */
  40.     private $segmentTracker;
  41.     public function __construct(
  42.         array $segmentAssignmentTypes,
  43.         DocumentResolver $documentResolver,
  44.         SegmentManagerInterface $segmentManager,
  45.         SegmentTracker $segmentTracker
  46.     )
  47.     {
  48.         $this->segmentAssignmentTypes $segmentAssignmentTypes;
  49.         $this->documentResolver       $documentResolver;
  50.         $this->segmentManager         $segmentManager;
  51.         $this->segmentTracker         $segmentTracker;
  52.     }
  53.     /**
  54.      * @inheritDoc
  55.      */
  56.     public static function getSubscribedEvents()
  57.     {
  58.         return [
  59.             TargetingEvents::PRE_RESOLVE => 'onTargetingPreResolve'
  60.         ];
  61.     }
  62.     public function onTargetingPreResolve(TargetingEvent $event)
  63.     {
  64.         if ($this->isTypeConfigured('document')) {
  65.             $this->trackDocumentSegments($event);
  66.         }
  67.     }
  68.     private function isTypeConfigured(string $typestring $subType null): bool
  69.     {
  70.         if (!isset($this->segmentAssignmentTypes[$type])) {
  71.             return false;
  72.         }
  73.         // test a specific subtype
  74.         if (null !== $subType) {
  75.             return isset($this->segmentAssignmentTypes[$type][$subType])
  76.                 && true === $this->segmentAssignmentTypes[$type][$subType];
  77.         }
  78.         // test if any type is configured
  79.         foreach ($this->segmentAssignmentTypes[$type] as $type => $value) {
  80.             if ($value) {
  81.                 return true;
  82.             }
  83.         }
  84.         return false;
  85.     }
  86.     private function trackDocumentSegments(TargetingEvent $event)
  87.     {
  88.         $visitorInfo $event->getVisitorInfo();
  89.         $document $this->documentResolver->getDocument($visitorInfo->getRequest());
  90.         if (!$document) {
  91.             return;
  92.         }
  93.         $segments $this->segmentManager->getSegmentsForElement($document);
  94.         $segments array_filter($segments, function($segment) {
  95.             return $segment && $segment instanceof CustomerSegmentInterface;
  96.         });
  97.         if (count($segments) > 0) {
  98.             $this->segmentTracker->trackSegments($visitorInfo$segments);
  99.         }
  100.     }
  101. }