src/Profile/EventSubscriber/ProfileGlossarySubscriber.php line 57

Open in your IDE?
  1. <?php
  2. namespace App\Profile\EventSubscriber;
  3. use App\Profile\Model\Profile;
  4. use App\Profile\Service\ProfileGlossary;
  5. use Pimcore\Event\DataObjectEvents;
  6. use Pimcore\Event\Model\DataObjectEvent;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. class ProfileGlossarySubscriber implements EventSubscriberInterface
  9. {
  10.   public function __construct(protected ProfileGlossary $profileGlossary)
  11.   {
  12.   }
  13.   public static function getSubscribedEvents()
  14.   {
  15.     return [
  16.         DataObjectEvents::PRE_UPDATE => 'onDataObjectPreUpdate',
  17.         DataObjectEvents::POST_UPDATE => 'onDataObjectPostUpdate',
  18.         DataObjectEvents::POST_DELETE => 'onDataObjectPostDelete',
  19.     ];
  20.   }
  21.   public function onDataObjectPreUpdate(DataObjectEvent $event)
  22.   {
  23.     if ($event->hasArgument('isAutoSave') || $event->hasArgument('saveVersionOnly')) {
  24.       return;
  25.     }
  26.     $profile $this->validateProfileEvent($event);
  27.     if (!$profile) {
  28.       return;
  29.     }
  30.     $currentProfile Profile::getById($profile->getId(), true);
  31.     $this->profileGlossary->deleteGlossaryForProfile($currentProfile);
  32.   }
  33.   public function onDataObjectPostUpdate(DataObjectEvent $event)
  34.   {
  35.     if ($event->hasArgument('isAutoSave') || $event->hasArgument('saveVersionOnly')) {
  36.       return;
  37.     }
  38.     $profile $this->validateProfileEvent($event);
  39.     if (!$profile) {
  40.       return;
  41.     }
  42.     $profile->isPublished()
  43.       ? $this->profileGlossary->createLocalizedGlossaryForProfile($profile)
  44.       : $this->profileGlossary->deleteGlossaryForProfile($profile);
  45.   }
  46.   public function onDataObjectPostDelete(DataObjectEvent $event)
  47.   {
  48.     $profile $this->validateProfileEvent($event);
  49.     if (!$profile) {
  50.       return;
  51.     }
  52.     $this->profileGlossary->deleteGlossaryForProfile($profile);
  53.   }
  54.   private function validateProfileEvent(DataObjectEvent $event): ?Profile
  55.   {
  56.     $object $event->getObject();
  57.     $className = (new \ReflectionClass($object))->getShortName();
  58.     if (!in_array($className, ['Profile'])) {
  59.       return null;
  60.     }
  61.     if (!$object instanceof Profile) {
  62.       throw new \Exception(sprintf('%s is not of type Profile'$object), 1);
  63.     }
  64.     return $object;
  65.   }
  66.   private function getPreviousVersion(Profile $profile): ?Profile
  67.   {
  68.     $versions $profile->getVersions();
  69.     $versions array_reverse($versions);
  70.     $totalVersions count($versions);
  71.     $previousVersion $versions[1];
  72.     if ($totalVersions <= || !$previousVersion || !$previousVersion->getData()) {
  73.       return null;
  74.     }
  75.     return $previousVersion->getData();
  76.   }
  77. }