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

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 $transitionsstring $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');