vendor/dachcom-digital/dynamic-search/src/DynamicSearchBundle/EventListener/PimcoreElementListener.php line 109

Open in your IDE?
  1. <?php
  2. namespace DynamicSearchBundle\EventListener;
  3. use DynamicSearchBundle\Configuration\ConfigurationInterface;
  4. use DynamicSearchBundle\Context\ContextDefinitionInterface;
  5. use DynamicSearchBundle\Queue\DataCollectorInterface;
  6. use Pimcore\Bundle\AdminBundle\Security\User\TokenStorageUserResolver;
  7. use Pimcore\Event\AssetEvents;
  8. use Pimcore\Event\DataObjectEvents;
  9. use Pimcore\Event\DocumentEvents;
  10. use Pimcore\Event\Model\AssetEvent;
  11. use Pimcore\Event\Model\DataObjectEvent;
  12. use Pimcore\Event\Model\DocumentEvent;
  13. use Pimcore\Model\DataObject;
  14. use Pimcore\Model\Element\ElementInterface;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. class PimcoreElementListener implements EventSubscriberInterface
  17. {
  18.     protected ConfigurationInterface $configuration;
  19.     protected DataCollectorInterface $dataCollector;
  20.     protected TokenStorageUserResolver $userResolver;
  21.     public function __construct(
  22.         ConfigurationInterface $configuration,
  23.         DataCollectorInterface $dataCollector,
  24.         TokenStorageUserResolver $userResolver
  25.     ) {
  26.         $this->configuration $configuration;
  27.         $this->dataCollector $dataCollector;
  28.         $this->userResolver $userResolver;
  29.     }
  30.     public static function getSubscribedEvents(): array
  31.     {
  32.         return [
  33.             DocumentEvents::POST_UPDATE => 'onDocumentPostUpdate',
  34.             DocumentEvents::PRE_DELETE  => 'onDocumentPreDelete',
  35.             DataObjectEvents::POST_UPDATE => 'onObjectPostUpdate',
  36.             DataObjectEvents::PRE_DELETE  => 'onObjectPreDelete',
  37.             AssetEvents::POST_ADD    => 'onAssetPostAdd',
  38.             AssetEvents::POST_UPDATE => 'onAssetPostUpdate',
  39.             AssetEvents::PRE_DELETE  => 'onAssetPreDelete',
  40.         ];
  41.     }
  42.     public function onDocumentPostUpdate(DocumentEvent $event): void
  43.     {
  44.         if ($this->configuration->get('enable_pimcore_element_listener') === false) {
  45.             return;
  46.         }
  47.         if ($event->getDocument()->getType() !== 'page') {
  48.             return;
  49.         }
  50.         $dispatchType $event->getDocument()->isPublished() === false
  51.             ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE
  52.             ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_UPDATE;
  53.         $this->dataCollector->addToGlobalQueue(
  54.             $dispatchType,
  55.             $event->getDocument()
  56.         );
  57.     }
  58.     public function onDocumentPreDelete(DocumentEvent $event): void
  59.     {
  60.         if ($this->configuration->get('enable_pimcore_element_listener') === false) {
  61.             return;
  62.         }
  63.         if ($event->getDocument()->getType() !== 'page') {
  64.             return;
  65.         }
  66.         $this->dataCollector->addToGlobalQueue(
  67.             ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE,
  68.             $event->getDocument()
  69.         );
  70.     }
  71.     public function onObjectPostUpdate(DataObjectEvent $event): void
  72.     {
  73.         if ($this->configuration->get('enable_pimcore_element_listener') === false) {
  74.             return;
  75.         }
  76.         /** @var DataObject\Concrete $object */
  77.         $object $event->getObject();
  78.         $dispatchType ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_UPDATE;
  79.         if (method_exists($object'isPublished') && $object->isPublished() === false) {
  80.             $dispatchType ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE;
  81.         }
  82.         $this->dataCollector->addToGlobalQueue(
  83.             $dispatchType,
  84.             $event->getObject()
  85.         );
  86.         $this->checkInheritanceIndex($object);
  87.     }
  88.     public function onObjectPreDelete(DataObjectEvent $event): void
  89.     {
  90.         if ($this->configuration->get('enable_pimcore_element_listener') === false) {
  91.             return;
  92.         }
  93.         $this->dataCollector->addToGlobalQueue(
  94.             ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE,
  95.             $event->getObject()
  96.         );
  97.     }
  98.     public function onAssetPostAdd(AssetEvent $event): void
  99.     {
  100.         if ($this->configuration->get('enable_pimcore_element_listener') === false) {
  101.             return;
  102.         }
  103.         $this->dataCollector->addToGlobalQueue(
  104.             ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_INSERT,
  105.             $event->getAsset()
  106.         );
  107.     }
  108.     public function onAssetPostUpdate(AssetEvent $event): void
  109.     {
  110.         if ($this->configuration->get('enable_pimcore_element_listener') === false) {
  111.             return;
  112.         }
  113.         $this->dataCollector->addToGlobalQueue(
  114.             ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_UPDATE,
  115.             $event->getAsset()
  116.         );
  117.     }
  118.     public function onAssetPreDelete(AssetEvent $event): void
  119.     {
  120.         if ($this->configuration->get('enable_pimcore_element_listener') === false) {
  121.             return;
  122.         }
  123.         $this->dataCollector->addToGlobalQueue(
  124.             ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE,
  125.             $event->getAsset()
  126.         );
  127.     }
  128.     protected function checkInheritanceIndex(ElementInterface $element): void
  129.     {
  130.         // currently, only objects are allowed.
  131.         if (!$element instanceof DataObject\Concrete) {
  132.             return;
  133.         }
  134.         $inheritanceConfiguration $this->configuration->get('element_inheritance');
  135.         if ($inheritanceConfiguration['enabled'] === false) {
  136.             return;
  137.         }
  138.         $classDefinition DataObject\ClassDefinition::getById($element->getClassId());
  139.         if (!$classDefinition instanceof DataObject\ClassDefinition) {
  140.             return;
  141.         }
  142.         if ($classDefinition->getAllowInherit() === false) {
  143.             return;
  144.         }
  145.         // we mostly want to fetch child elements if this comes from a real user (e.g. from backend)
  146.         // if user is null we're most probably in a CLI process which handles children/variants by itself!
  147.         // this can be changed by set origin_dispatch to "all"
  148.         if ($inheritanceConfiguration['origin_dispatch'] === 'user' && $this->userResolver->getUser() === null) {
  149.             return;
  150.         }
  151.         $list = new DataObject\Listing();
  152.         $list->setCondition('o_path LIKE ' $list->quote($element->getRealFullPath() . '/%'));
  153.         $list->setUnpublished(false);
  154.         $list->setObjectTypes([DataObject\AbstractObject::OBJECT_TYPE_OBJECTDataObject\AbstractObject::OBJECT_TYPE_VARIANT]);
  155.         foreach ($list->getObjects() as $childObject) {
  156.             $dispatchType ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_UPDATE;
  157.             if (method_exists($childObject'isPublished') && $childObject->isPublished() === false) {
  158.                 $dispatchType ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE;
  159.             }
  160.             $this->dataCollector->addToGlobalQueue($dispatchType$childObject);
  161.         }
  162.     }
  163. }