vendor/thelia/core/lib/Thelia/Action/Folder.php line 175

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Thelia package.
  4.  * http://www.thelia.net
  5.  *
  6.  * (c) OpenStudio <info@thelia.net>
  7.  *
  8.  * For the full copyright and license information, please view the LICENSE
  9.  * file that was distributed with this source code.
  10.  */
  11. namespace Thelia\Action;
  12. use Propel\Runtime\Propel;
  13. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  16. use Thelia\Core\Event\File\FileDeleteEvent;
  17. use Thelia\Core\Event\Folder\FolderCreateEvent;
  18. use Thelia\Core\Event\Folder\FolderDeleteEvent;
  19. use Thelia\Core\Event\Folder\FolderToggleVisibilityEvent;
  20. use Thelia\Core\Event\Folder\FolderUpdateEvent;
  21. use Thelia\Core\Event\TheliaEvents;
  22. use Thelia\Core\Event\UpdatePositionEvent;
  23. use Thelia\Core\Event\UpdateSeoEvent;
  24. use Thelia\Core\Event\ViewCheckEvent;
  25. use Thelia\Model\Folder as FolderModel;
  26. use Thelia\Model\FolderDocumentQuery;
  27. use Thelia\Model\FolderImageQuery;
  28. use Thelia\Model\FolderQuery;
  29. use Thelia\Model\Map\FolderTableMap;
  30. /**
  31.  * Class Folder.
  32.  *
  33.  * @author Manuel Raynaud <manu@raynaud.io>
  34.  */
  35. class Folder extends BaseAction implements EventSubscriberInterface
  36. {
  37.     public function update(FolderUpdateEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  38.     {
  39.         if (null !== $folder FolderQuery::create()->findPk($event->getFolderId())) {
  40.             $folder
  41.                 ->setParent($event->getParent())
  42.                 ->setVisible($event->getVisible())
  43.                 ->setLocale($event->getLocale())
  44.                 ->setTitle($event->getTitle())
  45.                 ->setDescription($event->getDescription())
  46.                 ->setChapo($event->getChapo())
  47.                 ->setPostscriptum($event->getPostscriptum())
  48.                 ->save();
  49.             $event->setFolder($folder);
  50.         }
  51.     }
  52.     /**
  53.      * Change Folder SEO.
  54.      *
  55.      * @param $eventName
  56.      *
  57.      * @return object
  58.      */
  59.     public function updateSeo(UpdateSeoEvent $event$eventNameEventDispatcherInterface $dispatcher)
  60.     {
  61.         return $this->genericUpdateSeo(FolderQuery::create(), $event$dispatcher);
  62.     }
  63.     public function delete(FolderDeleteEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  64.     {
  65.         if (null !== $folder FolderQuery::create()->findPk($event->getFolderId())) {
  66.             $con Propel::getWriteConnection(FolderTableMap::DATABASE_NAME);
  67.             $con->beginTransaction();
  68.             try {
  69.                 $fileList = ['images' => [], 'documentList' => []];
  70.                 // Get folder's files to delete after folder deletion
  71.                 $fileList['images']['list'] = FolderImageQuery::create()
  72.                     ->findByFolderId($event->getFolderId());
  73.                 $fileList['images']['type'] = TheliaEvents::IMAGE_DELETE;
  74.                 $fileList['documentList']['list'] = FolderDocumentQuery::create()
  75.                     ->findByFolderId($event->getFolderId());
  76.                 $fileList['documentList']['type'] = TheliaEvents::DOCUMENT_DELETE;
  77.                 // Delete folder
  78.                 $folder
  79.                     ->delete($con);
  80.                 $event->setFolder($folder);
  81.                 // Dispatch delete folder's files event
  82.                 foreach ($fileList as $fileTypeList) {
  83.                     foreach ($fileTypeList['list'] as $fileToDelete) {
  84.                         $fileDeleteEvent = new FileDeleteEvent($fileToDelete);
  85.                         $dispatcher->dispatch($fileDeleteEvent$fileTypeList['type']);
  86.                     }
  87.                 }
  88.                 $con->commit();
  89.             } catch (\Exception $e) {
  90.                 $con->rollback();
  91.                 throw $e;
  92.             }
  93.         }
  94.     }
  95.     public function create(FolderCreateEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  96.     {
  97.         $folder = new FolderModel();
  98.         $folder
  99.             ->setParent($event->getParent())
  100.             ->setVisible($event->getVisible())
  101.             ->setLocale($event->getLocale())
  102.             ->setTitle($event->getTitle())
  103.             ->save();
  104.         $event->setFolder($folder);
  105.     }
  106.     public function toggleVisibility(FolderToggleVisibilityEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  107.     {
  108.         $folder $event->getFolder();
  109.         $folder
  110.             ->setVisible(!$folder->getVisible())
  111.             ->save();
  112.         $event->setFolder($folder);
  113.     }
  114.     public function updatePosition(UpdatePositionEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  115.     {
  116.         if (null !== $folder FolderQuery::create()->findPk($event->getObjectId())) {
  117.             switch ($event->getMode()) {
  118.                 case UpdatePositionEvent::POSITION_ABSOLUTE:
  119.                     $folder->changeAbsolutePosition($event->getPosition());
  120.                     break;
  121.                 case UpdatePositionEvent::POSITION_DOWN:
  122.                     $folder->movePositionDown();
  123.                     break;
  124.                 case UpdatePositionEvent::POSITION_UP:
  125.                     $folder->movePositionUp();
  126.                     break;
  127.             }
  128.         }
  129.     }
  130.     /**
  131.      * Check if is a folder view and if folder_id is visible.
  132.      *
  133.      * @param string $eventName
  134.      */
  135.     public function viewCheck(ViewCheckEvent $event$eventNameEventDispatcherInterface $dispatcher): void
  136.     {
  137.         if ($event->getView() == 'folder') {
  138.             $folder FolderQuery::create()
  139.                 ->filterById($event->getViewId())
  140.                 ->filterByVisible(1)
  141.                 ->count();
  142.             if ($folder == 0) {
  143.                 $dispatcher->dispatch($eventTheliaEvents::VIEW_FOLDER_ID_NOT_VISIBLE);
  144.             }
  145.         }
  146.     }
  147.     /**
  148.      * @throws NotFoundHttpException
  149.      */
  150.     public function viewFolderIdNotVisible(ViewCheckEvent $event): void
  151.     {
  152.         throw new NotFoundHttpException();
  153.     }
  154.     /**
  155.      * {@inheritdoc}
  156.      */
  157.     public static function getSubscribedEvents()
  158.     {
  159.         return [
  160.             TheliaEvents::FOLDER_CREATE => ['create'128],
  161.             TheliaEvents::FOLDER_UPDATE => ['update'128],
  162.             TheliaEvents::FOLDER_DELETE => ['delete'128],
  163.             TheliaEvents::FOLDER_TOGGLE_VISIBILITY => ['toggleVisibility'128],
  164.             TheliaEvents::FOLDER_UPDATE_POSITION => ['updatePosition'128],
  165.             TheliaEvents::FOLDER_UPDATE_SEO => ['updateSeo'128],
  166.             TheliaEvents::VIEW_CHECK => ['viewCheck'128],
  167.             TheliaEvents::VIEW_FOLDER_ID_NOT_VISIBLE => ['viewFolderIdNotVisible'128],
  168.         ];
  169.     }
  170. }