vendor/ibexa/scheduler/src/lib/Event/Subscriber/PageTimelineEventsSubscriber.php line 83

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\Scheduler\Event\Subscriber;
  8. use DateTimeInterface;
  9. use Ibexa\Contracts\AdminUi\Resolver\IconPathResolverInterface;
  10. use Ibexa\Contracts\Core\Repository\ContentTypeService;
  11. use Ibexa\Contracts\Core\Repository\Values\Content\Content;
  12. use Ibexa\Contracts\Core\Repository\Values\ContentType\ContentType;
  13. use Ibexa\Contracts\Scheduler\Repository\DateBasedPublishServiceInterface;
  14. use Ibexa\Core\Helper\TranslationHelper;
  15. use Ibexa\PageBuilder\PageBuilder\Timeline\Context\ContentEditContext;
  16. use Ibexa\PageBuilder\PageBuilder\Timeline\Context\ContentTranslateContext;
  17. use Ibexa\PageBuilder\PageBuilder\Timeline\Context\ContentViewContext;
  18. use Ibexa\PageBuilder\PageBuilder\Timeline\Event\ContentTimelineEvent;
  19. use Ibexa\PageBuilder\PageBuilder\Timeline\Event\TimelineEvents;
  20. use Ibexa\Scheduler\Timeline\FuturePublicationEvent;
  21. use JMS\TranslationBundle\Annotation\Desc;
  22. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  23. use Symfony\Contracts\Translation\TranslatorInterface;
  24. use Twig\Environment;
  25. /**
  26.  * Adds future publication event to PageBuilder Timeline.
  27.  */
  28. class PageTimelineEventsSubscriber implements EventSubscriberInterface
  29. {
  30.     /** @var \Ibexa\Contracts\Scheduler\Repository\DateBasedPublishServiceInterface */
  31.     private $dateBasedPublisherService;
  32.     /** @var \Symfony\Contracts\Translation\TranslatorInterface */
  33.     private $translator;
  34.     /** @var \Twig\Environment */
  35.     private $templating;
  36.     /** @var \Ibexa\Contracts\Core\Repository\ContentTypeService */
  37.     private $contentTypeService;
  38.     /** @var \Ibexa\Core\Helper\TranslationHelper */
  39.     private $translationHelper;
  40.     /** @var \Ibexa\Contracts\AdminUi\Resolver\IconPathResolverInterface */
  41.     private $iconPathResolver;
  42.     public function __construct(
  43.         DateBasedPublishServiceInterface $dateBasedPublisherService,
  44.         TranslatorInterface $translator,
  45.         Environment $templating,
  46.         ContentTypeService $contentTypeService,
  47.         TranslationHelper $translationHelper,
  48.         IconPathResolverInterface $iconPathResolver
  49.     ) {
  50.         $this->dateBasedPublisherService $dateBasedPublisherService;
  51.         $this->translator $translator;
  52.         $this->templating $templating;
  53.         $this->contentTypeService $contentTypeService;
  54.         $this->translationHelper $translationHelper;
  55.         $this->iconPathResolver $iconPathResolver;
  56.     }
  57.     /**
  58.      * {@inheritdoc}
  59.      */
  60.     public static function getSubscribedEvents(): array
  61.     {
  62.         return [
  63.             TimelineEvents::COLLECT_EVENTS => 'onCollectTimelineEvents',
  64.         ];
  65.     }
  66.     /**
  67.      * @param \Ibexa\PageBuilder\PageBuilder\Timeline\Event\ContentTimelineEvent $event
  68.      *
  69.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  70.      */
  71.     public function onCollectTimelineEvents(ContentTimelineEvent $event): void
  72.     {
  73.         $context $event->getContext();
  74.         if (
  75.             !$context instanceof ContentViewContext
  76.             && !$context instanceof ContentEditContext
  77.             && !$context instanceof ContentTranslateContext
  78.         ) {
  79.             return;
  80.         }
  81.         $content $context->getContent();
  82.         $events $event->getTimelineEvents();
  83.         $contentInfo $content->contentInfo;
  84.         $scheduledVersions $this->dateBasedPublisherService->getVersionsEntriesForContent($content->id);
  85.         if (empty($scheduledVersions)) {
  86.             return;
  87.         }
  88.         $contentType $this->contentTypeService->loadContentType($contentInfo->contentTypeId);
  89.         $eventName $this->getEventName($content);
  90.         $eventIcon $this->iconPathResolver->resolve('publish-later');
  91.         foreach ($scheduledVersions as $scheduledVersion) {
  92.             $publicationDate $scheduledVersion->date;
  93.             $events[] = new FuturePublicationEvent(
  94.                 $eventName,
  95.                 $this->getEventDescription($eventName$publicationDate$content$contentType),
  96.                 $publicationDate,
  97.                 $eventIcon,
  98.                 $scheduledVersion->versionInfo->versionNo
  99.             );
  100.         }
  101.         $event->setTimelineEvents($events);
  102.     }
  103.     /**
  104.      * @param string $eventName
  105.      * @param \DateTimeInterface $publicationDate
  106.      * @param \Ibexa\Contracts\Core\Repository\Values\Content\Content $content
  107.      * @param \Ibexa\Contracts\Core\Repository\Values\ContentType\ContentType $contentType
  108.      *
  109.      * @return string
  110.      */
  111.     private function getEventDescription(string $eventNameDateTimeInterface $publicationDateContent $contentContentType $contentType): string
  112.     {
  113.         return $this->templating->render(
  114.             '@IbexaScheduler/page_builder/timeline/events/future_publication_event_description.twig',
  115.             [
  116.                 'name' => $eventName,
  117.                 'date' => $publicationDate,
  118.                 'content' => $content,
  119.                 'content_type' => $contentType,
  120.             ]
  121.         );
  122.     }
  123.     /**
  124.      * @param \Ibexa\Contracts\Core\Repository\Values\Content\Content $content
  125.      *
  126.      * @return string
  127.      */
  128.     private function getEventName(Content $content): string
  129.     {
  130.         return $this->translator->trans(
  131.             /** @Desc("New version of %contentName% published") */
  132.             'event.future_publication.title',
  133.             [
  134.                 '%contentName%' => $this->translationHelper->getTranslatedContentName($content),
  135.             ],
  136.             'ibexa_page_builder_timeline_events'
  137.         );
  138.     }
  139. }
  140. class_alias(PageTimelineEventsSubscriber::class, 'EzSystems\DateBasedPublisher\Core\Event\Subscriber\PageTimelineEventsSubscriber');