<?phpdeclare(strict_types=1);namespace App\Album\EventSubscriber;use Pimcore\Db;use Pimcore\Event\DataObjectEvents;use Pimcore\Event\Model\ElementEventInterface;use Pimcore\Model\DataObject;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;class DataObjectSubscriber implements EventSubscriberInterface{ /** @var TokenStorageInterface */ private TokenStorageInterface $tokenStorage; public function __construct( TokenStorageInterface $tokenStorage ) { $this->tokenStorage = $tokenStorage; } public static function getSubscribedEvents() { return [ DataObjectEvents::POST_UPDATE => 'onPostUpdate', ]; } public function onPostUpdate(ElementEventInterface $e) { $object = $e->getElement(); if ($object instanceof DataObject\Album) { if ($object->getPublicCodeActive() && !$object->getPublicCode()) { $object->setPublicCode(bin2hex(random_bytes(48))); $object->save(); } //Делая альбом публичным, так же делаем публичными все его фотографии $photoList = DataObject\Photo::getByAlbum($object->getId()); foreach ($photoList as $photo) { //Если публичность фото не установлена напрямую, то устанавливаем ее в зависимости от альбома if (!$photo->getPublicOwned()) { if ($object->getPublicCodeActive()) { //Если альбом публичный, то устанавливаем публичность фото if (!$photo->getPublicCodeActive()) { $photo->setPublicCodeActive(true); $photo->save(); } } else { //Если альбом не публичный, то убираем публичность фото if ($photo->getPublicCodeActive()) { $photo->setPublicCodeActive(false); $photo->save(); } } } } } elseif ($object instanceof DataObject\Photo) { $needSave = false; $resAlbum = $object->getAlbum(); if (!empty($resAlbum)) { $user = $this->tokenStorage->getToken()->getUser(); /** @var DataObject\Album $albumEntity */ $albumEntity = current($resAlbum); $minShootingYears = Db::get()->fetchOne( 'SELECT shootingYear FROM object_photo where o_published=\'1\' and shootingYear IS NOT NULL and o_userOwner=' . $user->getId() . ' ORDER BY shootingYear ASC LIMIT 1' ); $maxShootingYears = Db::get()->fetchOne( 'SELECT shootingYear FROM object_photo where o_published=\'1\' and shootingYear IS NOT NULL and o_userOwner=' . $user->getId() . ' ORDER BY shootingYear DESC LIMIT 1' ); if ( !empty($minShootingYears) || !empty($maxShootingYears) || !empty($albumEntity->getMinShootingYear()) || !empty($albumEntity->getMaxShootingYear()) ) { $albumEntity->setMinShootingYear(!empty($minShootingYears) ? $minShootingYears : null); $albumEntity->setMaxShootingYear(!empty($maxShootingYears) ? $maxShootingYears : null); $albumEntity->save(); } } //Если снимается публичность, то снимаем признак собственной публичности if ($object->getPublicOwned() && !$object->getPublicCodeActive()) { $object->setPublicOwned(false); $needSave = true; } //Если снимается публичность, при этом есть привязанные публичные альбомы возвращаем публичность фото if (!$object->getPublicCodeActive() && count( array_filter($object->getAlbum(), function ($album) { return $album->getPublicCodeActive(); }) )) { $object->setPublicCodeActive(true); $needSave = true; } if ($object->getPublicCodeActive() && !$object->getPublicCode()) { $object->setPublicCode(bin2hex(random_bytes(48))); $needSave = true; } if ($needSave) { $object->save(); } } }}