vendor/pimcore/portal-engine/src/EventSubscriber/IndexUpdateSubscriber.php line 136

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under following license:
  6.  * - Pimcore Commercial License (PCL)
  7.  *
  8.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  9.  *  @license    http://www.pimcore.org/license     PCL
  10.  */
  11. namespace Pimcore\Bundle\PortalEngineBundle\EventSubscriber;
  12. use Pimcore\AssetMetadataClassDefinitionsBundle\Event\AssetMetadataConfigurationEvents;
  13. use Pimcore\AssetMetadataClassDefinitionsBundle\Event\Model\Asset\ConfigurationEvent;
  14. use Pimcore\Bundle\PortalEngineBundle\Enum\Index\DatabaseConfig;
  15. use Pimcore\Bundle\PortalEngineBundle\Enum\Index\Statistics\ElasticSearchAlias;
  16. use Pimcore\Bundle\PortalEngineBundle\Installer;
  17. use Pimcore\Bundle\PortalEngineBundle\Service\SearchIndex\Asset\IndexService as AssetIndexService;
  18. use Pimcore\Bundle\PortalEngineBundle\Service\SearchIndex\DataObject\IndexService as DataObjectIndexService;
  19. use Pimcore\Bundle\PortalEngineBundle\Service\SearchIndex\IndexQueueService;
  20. use Pimcore\Event\AssetEvents;
  21. use Pimcore\Event\DataObjectClassDefinitionEvents;
  22. use Pimcore\Event\DataObjectEvents;
  23. use Pimcore\Event\Model\AssetEvent;
  24. use Pimcore\Event\Model\DataObject\ClassDefinitionEvent;
  25. use Pimcore\Event\Model\DataObjectEvent;
  26. use Pimcore\Event\Model\TagEvent;
  27. use Pimcore\Event\TagEvents;
  28. use Pimcore\Logger;
  29. use Pimcore\Model\Asset;
  30. use Pimcore\Model\DataObject\AbstractObject;
  31. use Pimcore\Model\Element\Service;
  32. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  33. /**
  34.  * Class IndexUpdateSubscriber
  35.  *
  36.  * @package Pimcore\Bundle\PortalEngineBundle\EventSubsriber
  37.  */
  38. class IndexUpdateSubscriber implements EventSubscriberInterface
  39. {
  40.     /** @var IndexQueueService */
  41.     protected $indexQueueService;
  42.     /** @var DataObjectIndexService */
  43.     protected $dataObjectIndexService;
  44.     /** @var AssetIndexService */
  45.     protected $assetIndexService;
  46.     protected Installer $installer;
  47.     /**
  48.      * IndexUpdateSubscriber constructor.
  49.      *
  50.      * @param IndexQueueService $indexQueueService
  51.      * @param DataObjectIndexService $dataObjectIndexService
  52.      * @param AssetIndexService $assetIndexService
  53.      */
  54.     public function __construct(IndexQueueService $indexQueueServiceDataObjectIndexService $dataObjectIndexServiceAssetIndexService $assetIndexServiceInstaller $installer)
  55.     {
  56.         $this->indexQueueService $indexQueueService;
  57.         $this->dataObjectIndexService $dataObjectIndexService;
  58.         $this->assetIndexService $assetIndexService;
  59.         $this->installer $installer;
  60.     }
  61.     /**
  62.      * @return array
  63.      */
  64.     public static function getSubscribedEvents()
  65.     {
  66.         return [
  67.             DataObjectEvents::POST_UPDATE => 'updateDataObject',
  68.             DataObjectEvents::POST_ADD => 'updateDataObject',
  69.             DataObjectEvents::PRE_DELETE => 'deleteDataObject',
  70.             DataObjectClassDefinitionEvents::POST_UPDATE => 'updateDataObjectMapping',
  71.             DataObjectClassDefinitionEvents::POST_ADD => 'addDataObjectMapping',
  72.             DataObjectClassDefinitionEvents::POST_DELETE => 'deleteDataObjectIndex',
  73.             AssetEvents::POST_UPDATE => 'updateAsset',
  74.             AssetEvents::POST_ADD => 'updateAsset',
  75.             AssetEvents::POST_DELETE => 'deleteAsset',
  76.             AssetMetadataConfigurationEvents::POST_UPDATE => 'updateAssetMapping',
  77.             AssetMetadataConfigurationEvents::POST_DELETE => 'updateAssetMapping',
  78.             TagEvents::PRE_DELETE => 'deleteTag',
  79.             TagEvents::POST_ADD_TO_ELEMENT => 'updateTagAssignment',
  80.             TagEvents::POST_REMOVE_FROM_ELEMENT => 'updateTagAssignment',
  81.         ];
  82.     }
  83.     /**
  84.      * @param DataObjectEvent $event
  85.      */
  86.     public function updateDataObject(DataObjectEvent $event)
  87.     {
  88.         if (!$this->installer->isInstalled()) {
  89.             return;
  90.         }
  91.         //do not update index when auto save or only saving version
  92.         if (
  93.             ($event->hasArgument('isAutoSave') && $event->getArgument('isAutoSave')) ||
  94.             ($event->hasArgument('saveVersionOnly') && $event->getArgument('saveVersionOnly'))
  95.         ) {
  96.             return;
  97.         }
  98.         $inheritanceBackup AbstractObject::getGetInheritedValues();
  99.         AbstractObject::setGetInheritedValues(true);
  100.         $dataObject $event->getObject();
  101.         if ($dataObject instanceof AbstractObject) {
  102.             $this->indexQueueService->updateIndexQueue($dataObjectDatabaseConfig::QUEUE_TABLE_COLUMN_OPERATION_UPDATEtrue);
  103.         }
  104.         AbstractObject::setGetInheritedValues($inheritanceBackup);
  105.     }
  106.     /**
  107.      * @param DataObjectEvent $event
  108.      */
  109.     public function deleteDataObject(DataObjectEvent $event)
  110.     {
  111.         if (!$this->installer->isInstalled()) {
  112.             return;
  113.         }
  114.         $dataObject $event->getObject();
  115.         if ($dataObject instanceof AbstractObject) {
  116.             $this->indexQueueService->updateIndexQueue($dataObjectDatabaseConfig::QUEUE_TABLE_COLUMN_OPERATION_DELETEtrue);
  117.         }
  118.     }
  119.     /**
  120.      * @param ClassDefinitionEvent $event
  121.      */
  122.     public function addDataObjectMapping(ClassDefinitionEvent $event)
  123.     {
  124.         if (!$this->installer->isInstalled()) {
  125.             return;
  126.         }
  127.         $classDefinition $event->getClassDefinition();
  128.         $this->dataObjectIndexService->updateMapping($classDefinitiontrue);
  129.         $this->dataObjectIndexService->addClassDefinitionToAlias($classDefinitionElasticSearchAlias::CLASS_DEFINITIONS);
  130.     }
  131.     /**
  132.      * @param ClassDefinitionEvent $event
  133.      */
  134.     public function updateDataObjectMapping(ClassDefinitionEvent $event)
  135.     {
  136.         if (!$this->installer->isInstalled()) {
  137.             return;
  138.         }
  139.         $classDefinition $event->getClassDefinition();
  140.         $this->dataObjectIndexService->updateMapping($classDefinition);
  141.         $this->indexQueueService->updateDataObjects($classDefinition);
  142.         $this->dataObjectIndexService->addClassDefinitionToAlias($classDefinitionElasticSearchAlias::CLASS_DEFINITIONS);
  143.     }
  144.     /**
  145.      * @param ClassDefinitionEvent $event
  146.      */
  147.     public function deleteDataObjectIndex(ClassDefinitionEvent $event)
  148.     {
  149.         if (!$this->installer->isInstalled()) {
  150.             return;
  151.         }
  152.         $classDefinition $event->getClassDefinition();
  153.         try {
  154.             $this->dataObjectIndexService->deleteIndex($classDefinition);
  155.         } catch (\Exception $e) {
  156.             Logger::err($e);
  157.         }
  158.         $this->dataObjectIndexService->removeClassDefinitionFromAlias($classDefinitionElasticSearchAlias::CLASS_DEFINITIONS);
  159.     }
  160.     /**
  161.      * @param AssetEvent $event
  162.      */
  163.     public function updateAsset(AssetEvent $event)
  164.     {
  165.         if (!$this->installer->isInstalled()) {
  166.             return;
  167.         }
  168.         $asset $event->getAsset();
  169.         if ($asset instanceof Asset) {
  170.             $this->indexQueueService->updateIndexQueue($assetDatabaseConfig::QUEUE_TABLE_COLUMN_OPERATION_UPDATEtrue);
  171.         }
  172.     }
  173.     /**
  174.      * @param AssetEvent $event
  175.      */
  176.     public function deleteAsset(AssetEvent $event)
  177.     {
  178.         if (!$this->installer->isInstalled()) {
  179.             return;
  180.         }
  181.         $asset $event->getAsset();
  182.         if ($asset instanceof Asset) {
  183.             $this->indexQueueService->updateIndexQueue($assetDatabaseConfig::QUEUE_TABLE_COLUMN_OPERATION_DELETEtrue);
  184.         }
  185.     }
  186.     /**
  187.      * @param ConfigurationEvent $event
  188.      */
  189.     public function updateAssetMapping(ConfigurationEvent $event)
  190.     {
  191.         if (!$this->installer->isInstalled()) {
  192.             return;
  193.         }
  194.         $this->assetIndexService->updateMapping();
  195.         $this->indexQueueService->updateAssets();
  196.     }
  197.     public function deleteTag(TagEvent $event)
  198.     {
  199.         if (!$this->installer->isInstalled()) {
  200.             return;
  201.         }
  202.         $this->indexQueueService->updateByTag($event->getTag());
  203.     }
  204.     public function updateTagAssignment(TagEvent $event)
  205.     {
  206.         if (!$this->installer->isInstalled()) {
  207.             return;
  208.         }
  209.         $element Service::getElementById($event->getArgument('elementType'), $event->getArgument('elementId'));
  210.         //only update when element is object or asset
  211.         if ($element instanceof AbstractObject || $element instanceof Asset) {
  212.             $this->indexQueueService->updateIndexQueue($elementDatabaseConfig::QUEUE_TABLE_COLUMN_OPERATION_UPDATEtrue);
  213.         }
  214.     }
  215. }