vendor/ibexa/workflow/src/lib/Event/Subscriber/TimelineTransitionEntriesSubscriber.php line 69

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\Workflow\Event\Subscriber;
  8. use Ibexa\Contracts\Workflow\Event\TimelineEntryRenderEvent;
  9. use Ibexa\Contracts\Workflow\Event\TimelineEvent;
  10. use Ibexa\Contracts\Workflow\Event\TimelineEvents;
  11. use Ibexa\Contracts\Workflow\Registry\WorkflowDefinitionMetadataRegistryInterface;
  12. use Ibexa\Core\Base\Exceptions\BadStateException;
  13. use Ibexa\Workflow\Value\WorkflowDefinitionMetadata;
  14. use Ibexa\Workflow\WorkflowTimeline\Value\TransitionEntry;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\Workflow\Transition;
  17. class TimelineTransitionEntriesSubscriber implements EventSubscriberInterface
  18. {
  19. /** @var \Ibexa\Contracts\Workflow\Registry\WorkflowDefinitionMetadataRegistryInterface */
  20. private $workflowDefinitionMetadataRegistry;
  21. /**
  22. * @param \Ibexa\Contracts\Workflow\Registry\WorkflowDefinitionMetadataRegistryInterface $workflowDefinitionMetadataRegistry
  23. */
  24. public function __construct(
  25. WorkflowDefinitionMetadataRegistryInterface $workflowDefinitionMetadataRegistry
  26. ) {
  27. $this->workflowDefinitionMetadataRegistry = $workflowDefinitionMetadataRegistry;
  28. }
  29. /**
  30. * {@inheritdoc}
  31. */
  32. public static function getSubscribedEvents(): array
  33. {
  34. return [
  35. TimelineEvents::COLLECT_ENTRIES => ['onEntriesCollect'],
  36. TimelineEvents::ENTRY_RENDER => ['onEntryRender'],
  37. ];
  38. }
  39. /**
  40. * @param \Ibexa\Contracts\Workflow\Event\TimelineEvent $event
  41. */
  42. public function onEntriesCollect(TimelineEvent $event): void
  43. {
  44. $workflowMetadata = $event->getWorkflowMetadata();
  45. foreach ($workflowMetadata->transitions as $transitionMetadata) {
  46. $event->addEntry(
  47. new TransitionEntry(
  48. $workflowMetadata,
  49. $transitionMetadata
  50. )
  51. );
  52. }
  53. }
  54. /**
  55. * @param \Ibexa\Contracts\Workflow\Event\TimelineEntryRenderEvent $event
  56. *
  57. * @throws \Ibexa\Workflow\Exception\NotFoundException
  58. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\BadStateException
  59. */
  60. public function onEntryRender(TimelineEntryRenderEvent $event): void
  61. {
  62. /** @var \Ibexa\Workflow\WorkflowTimeline\Value\TransitionEntry $entry */
  63. $entry = $event->getEntry();
  64. if ($entry->getIdentifier() !== 'transition') {
  65. return;
  66. }
  67. $parameters = $event->getParameters();
  68. $workflowMetadata = $entry->getWorkflowMetadata();
  69. $definition = $workflowMetadata->workflow->getDefinition();
  70. $transitions = $definition->getTransitions();
  71. $transition = $this->findTransition($transitions, $entry->getTransitionMetadata()->name);
  72. $workflowDefinitionMetadata = $this->workflowDefinitionMetadataRegistry->getWorkflowMetadata($workflowMetadata->name);
  73. $transitionDefinitionMetadata = $workflowDefinitionMetadata->getTransitionMetadata($entry->getTransitionMetadata()->name);
  74. $stagesDefinitionMetadataList = $this->getStageDefinitionMetadataList($transition, $workflowDefinitionMetadata);
  75. $stageNames = $this->getStageNames($stagesDefinitionMetadataList);
  76. $parameters['workflow_definition_metadata'] = $workflowDefinitionMetadata;
  77. $parameters['transition_definition_metadata'] = $transitionDefinitionMetadata;
  78. $parameters['transition_metadata'] = $entry->getTransitionMetadata();
  79. $parameters['stages_definition_metadata_list'] = $stagesDefinitionMetadataList;
  80. $parameters['stage_names'] = $stageNames;
  81. $event->setParameters($parameters);
  82. }
  83. /**
  84. * @param \Symfony\Component\Workflow\Transition[] $transitions
  85. * @param string $name
  86. *
  87. * @return \Symfony\Component\Workflow\Transition
  88. *
  89. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\BadStateException
  90. */
  91. private function findTransition(array $transitions, string $name): Transition
  92. {
  93. foreach ($transitions as $transition) {
  94. if ($transition->getName() === $name) {
  95. return $transition;
  96. }
  97. }
  98. throw new BadStateException('$transitions', "Could not find transition '{$name}'.");
  99. }
  100. /**
  101. * @param \Symfony\Component\Workflow\Transition $transition
  102. * @param \Ibexa\Workflow\Value\WorkflowDefinitionMetadata $workflowDefinitionMetadata
  103. *
  104. * @return \Ibexa\Workflow\Value\WorkflowStageDefinitionMetadata[]
  105. */
  106. private function getStageDefinitionMetadataList(
  107. Transition $transition,
  108. WorkflowDefinitionMetadata $workflowDefinitionMetadata
  109. ): array {
  110. return array_combine(
  111. $transition->getTos(),
  112. array_map([$workflowDefinitionMetadata, 'getStageMetadata'], $transition->getTos())
  113. );
  114. }
  115. /**
  116. * @param \Ibexa\Workflow\Value\WorkflowStageDefinitionMetadata[] $stagesDefinitionMetadataList
  117. *
  118. * @return string[]
  119. */
  120. private function getStageNames(array $stagesDefinitionMetadataList): array
  121. {
  122. $stageNames = [];
  123. foreach ($stagesDefinitionMetadataList as $key => $stageDefinitionMetadata) {
  124. $stageNames[$key] = $stageDefinitionMetadata->getLabel();
  125. }
  126. return $stageNames;
  127. }
  128. }
  129. class_alias(TimelineTransitionEntriesSubscriber::class, 'EzSystems\EzPlatformWorkflow\Event\Subscriber\TimelineTransitionEntriesSubscriber');