src/Album/EventSubscriber/DataObjectSubscriber.php line 33

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Album\EventSubscriber;
  4. use Pimcore\Db;
  5. use Pimcore\Event\DataObjectEvents;
  6. use Pimcore\Event\Model\ElementEventInterface;
  7. use Pimcore\Model\DataObject;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  10. class DataObjectSubscriber implements EventSubscriberInterface
  11. {
  12.     /** @var TokenStorageInterface */
  13.     private TokenStorageInterface $tokenStorage;
  14.     public function __construct(
  15.         TokenStorageInterface $tokenStorage
  16.     ) {
  17.         $this->tokenStorage $tokenStorage;
  18.     }
  19.     public static function getSubscribedEvents()
  20.     {
  21.         return [
  22.             DataObjectEvents::POST_UPDATE => 'onPostUpdate',
  23.         ];
  24.     }
  25.     public function onPostUpdate(ElementEventInterface $e)
  26.     {
  27.         $object $e->getElement();
  28.         if ($object instanceof DataObject\Album) {
  29.             if ($object->getPublicCodeActive() && !$object->getPublicCode()) {
  30.                 $object->setPublicCode(bin2hex(random_bytes(48)));
  31.                 $object->save();
  32.             }
  33.             //Делая альбом публичным, так же делаем публичными все его фотографии
  34.             $photoList DataObject\Photo::getByAlbum($object->getId());
  35.             foreach ($photoList as $photo) {
  36.                 //Если публичность фото не установлена напрямую, то устанавливаем ее в зависимости от альбома
  37.                 if (!$photo->getPublicOwned()) {
  38.                     if ($object->getPublicCodeActive()) {
  39.                         //Если альбом публичный, то устанавливаем публичность фото
  40.                         if (!$photo->getPublicCodeActive()) {
  41.                             $photo->setPublicCodeActive(true);
  42.                             $photo->save();
  43.                         }
  44.                     } else {
  45.                         //Если альбом не публичный, то убираем публичность фото
  46.                         if ($photo->getPublicCodeActive()) {
  47.                             $photo->setPublicCodeActive(false);
  48.                             $photo->save();
  49.                         }
  50.                     }
  51.                 }
  52.             }
  53.         } elseif ($object instanceof DataObject\Photo) {
  54.             $needSave false;
  55.             $resAlbum $object->getAlbum();
  56.             if (!empty($resAlbum)) {
  57.                 $user $this->tokenStorage->getToken()->getUser();
  58.                 /** @var DataObject\Album $albumEntity */
  59.                 $albumEntity current($resAlbum);
  60.                 $minShootingYears Db::get()->fetchOne(
  61.                     'SELECT shootingYear FROM object_photo where o_published=\'1\'
  62.                                              and shootingYear IS NOT NULL
  63.                                              and o_userOwner=' $user->getId() . '
  64.                     ORDER BY shootingYear ASC LIMIT 1'
  65.                 );
  66.                 $maxShootingYears Db::get()->fetchOne(
  67.                     'SELECT shootingYear FROM object_photo where o_published=\'1\'
  68.                                              and shootingYear IS NOT NULL
  69.                                              and o_userOwner=' $user->getId() . '
  70.                     ORDER BY shootingYear DESC LIMIT 1'
  71.                 );
  72.                 if (
  73.                     !empty($minShootingYears)
  74.                     || !empty($maxShootingYears)
  75.                     || !empty($albumEntity->getMinShootingYear())
  76.                     || !empty($albumEntity->getMaxShootingYear())
  77.                 ) {
  78.                     $albumEntity->setMinShootingYear(!empty($minShootingYears) ? $minShootingYears null);
  79.                     $albumEntity->setMaxShootingYear(!empty($maxShootingYears) ? $maxShootingYears null);
  80.                     $albumEntity->save();
  81.                 }
  82.             }
  83.             //Если снимается публичность, то снимаем признак собственной публичности
  84.             if ($object->getPublicOwned() && !$object->getPublicCodeActive()) {
  85.                 $object->setPublicOwned(false);
  86.                 $needSave true;
  87.             }
  88.             //Если снимается публичность, при этом есть привязанные публичные альбомы возвращаем публичность фото
  89.             if (!$object->getPublicCodeActive() && count(
  90.                     array_filter($object->getAlbum(), function ($album) {
  91.                         return $album->getPublicCodeActive();
  92.                     })
  93.                 )) {
  94.                 $object->setPublicCodeActive(true);
  95.                 $needSave true;
  96.             }
  97.             if ($object->getPublicCodeActive() && !$object->getPublicCode()) {
  98.                 $object->setPublicCode(bin2hex(random_bytes(48)));
  99.                 $needSave true;
  100.             }
  101.             if ($needSave) {
  102.                 $object->save();
  103.             }
  104.         }
  105.     }
  106. }