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

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