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 $eventName, DateTimeInterface $publicationDate, Content $content, ContentType $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');