<?php
namespace App\Profile\EventSubscriber;
use App\Profile\Model\Profile;
use App\Profile\Service\ProfileGlossary;
use Pimcore\Event\DataObjectEvents;
use Pimcore\Event\Model\DataObjectEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProfileGlossarySubscriber implements EventSubscriberInterface
{
public function __construct(protected ProfileGlossary $profileGlossary)
{
}
public static function getSubscribedEvents()
{
return [
DataObjectEvents::PRE_UPDATE => 'onDataObjectPreUpdate',
DataObjectEvents::POST_UPDATE => 'onDataObjectPostUpdate',
DataObjectEvents::POST_DELETE => 'onDataObjectPostDelete',
];
}
public function onDataObjectPreUpdate(DataObjectEvent $event)
{
if ($event->hasArgument('isAutoSave') || $event->hasArgument('saveVersionOnly')) {
return;
}
$profile = $this->validateProfileEvent($event);
if (!$profile) {
return;
}
$currentProfile = Profile::getById($profile->getId(), true);
$this->profileGlossary->deleteGlossaryForProfile($currentProfile);
}
public function onDataObjectPostUpdate(DataObjectEvent $event)
{
if ($event->hasArgument('isAutoSave') || $event->hasArgument('saveVersionOnly')) {
return;
}
$profile = $this->validateProfileEvent($event);
if (!$profile) {
return;
}
$profile->isPublished()
? $this->profileGlossary->createLocalizedGlossaryForProfile($profile)
: $this->profileGlossary->deleteGlossaryForProfile($profile);
}
public function onDataObjectPostDelete(DataObjectEvent $event)
{
$profile = $this->validateProfileEvent($event);
if (!$profile) {
return;
}
$this->profileGlossary->deleteGlossaryForProfile($profile);
}
private function validateProfileEvent(DataObjectEvent $event): ?Profile
{
$object = $event->getObject();
$className = (new \ReflectionClass($object))->getShortName();
if (!in_array($className, ['Profile'])) {
return null;
}
if (!$object instanceof Profile) {
throw new \Exception(sprintf('%s is not of type Profile', $object), 1);
}
return $object;
}
private function getPreviousVersion(Profile $profile): ?Profile
{
$versions = $profile->getVersions();
$versions = array_reverse($versions);
$totalVersions = count($versions);
$previousVersion = $versions[1];
if ($totalVersions <= 1 || !$previousVersion || !$previousVersion->getData()) {
return null;
}
return $previousVersion->getData();
}
}