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

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 Commercial License (PCL)
  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 PCL
  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.         $this->segmentAssignmentTypes $segmentAssignmentTypes;
  48.         $this->documentResolver $documentResolver;
  49.         $this->segmentManager $segmentManager;
  50.         $this->segmentTracker $segmentTracker;
  51.     }
  52.     /**
  53.      * @inheritDoc
  54.      */
  55.     public static function getSubscribedEvents()
  56.     {
  57.         return [
  58.             TargetingEvents::PRE_RESOLVE => 'onTargetingPreResolve'
  59.         ];
  60.     }
  61.     public function onTargetingPreResolve(TargetingEvent $event)
  62.     {
  63.         if ($this->isTypeConfigured('document')) {
  64.             $this->trackDocumentSegments($event);
  65.         }
  66.     }
  67.     private function isTypeConfigured(string $typestring $subType null): bool
  68.     {
  69.         if (!isset($this->segmentAssignmentTypes[$type])) {
  70.             return false;
  71.         }
  72.         // test a specific subtype
  73.         if (null !== $subType) {
  74.             return isset($this->segmentAssignmentTypes[$type][$subType])
  75.                 && true === $this->segmentAssignmentTypes[$type][$subType];
  76.         }
  77.         // test if any type is configured
  78.         foreach ($this->segmentAssignmentTypes[$type] as $type => $value) {
  79.             if ($value) {
  80.                 return true;
  81.             }
  82.         }
  83.         return false;
  84.     }
  85.     private function trackDocumentSegments(TargetingEvent $event)
  86.     {
  87.         $visitorInfo $event->getVisitorInfo();
  88.         $document $this->documentResolver->getDocument($visitorInfo->getRequest());
  89.         if (!$document) {
  90.             return;
  91.         }
  92.         $segments $this->segmentManager->getSegmentsForElement($document);
  93.         $segments array_filter($segments, function ($segment) {
  94.             return $segment && $segment instanceof CustomerSegmentInterface;
  95.         });
  96.         if (count($segments) > 0) {
  97.             $this->segmentTracker->trackSegments($visitorInfo$segments);
  98.         }
  99.     }
  100. }