entityWorkflowManager = $entityWorkflowManager; $this->registry = $registry; $this->repository = $repository; $this->metadataExtractor = $metadataExtractor; $this->normalizer = $normalizer; } public function getTransitionByString(EntityWorkflow $entityWorkflow, string $key): ?Transition { $workflow = $this->registry->get($entityWorkflow, $entityWorkflow->getWorkflowName()); $transitions = $workflow->getDefinition()->getTransitions(); foreach ($transitions as $transition) { if ($transition->getName() === $key) { return $transition; } } return null; } /** * @param array{relatedEntityClass: string, relatedEntityId: int} $supplementaryRelated * * @throws \Symfony\Component\Serializer\Exception\ExceptionInterface * @throws \Twig\Error\LoaderError * @throws \Twig\Error\RuntimeError * @throws \Twig\Error\SyntaxError */ public function listWorkflows(Environment $environment, string $relatedEntityClass, int $relatedEntityId, array $options = [], array $supplementaryRelated = []): string { [$blankEntityWorkflow, $workflowsAvailable, $entityWorkflows] = $this->getWorkflowsForRelated($relatedEntityClass, $relatedEntityId); foreach ($supplementaryRelated as $supplementary) { [$supplementaryBlankEntityWorkflow, $supplementaryWorkflowsAvailable, $supplementaryEntityWorkflows] = $this->getWorkflowsForRelated($supplementary['relatedEntityClass'], $supplementary['relatedEntityId']); $entityWorkflows = array_merge($entityWorkflows, $supplementaryEntityWorkflows); } return $environment->render('@ChillMain/Workflow/_extension_list_workflow_for.html.twig', [ 'entity_workflows_json' => $this->normalizer->normalize($entityWorkflows, 'json', ['groups' => 'read']), 'blank_workflow' => $blankEntityWorkflow, 'workflows_available' => $workflowsAvailable, 'relatedEntityClass' => $relatedEntityClass, 'relatedEntityId' => $relatedEntityId, ]); } /** * @return array where keys are: {0: blankWorkflow, 1: entityWorkflows, 2: workflowList} */ private function getWorkflowsForRelated(string $relatedEntityClass, int $relatedEntityId): array { $blankEntityWorkflow = new EntityWorkflow(); $blankEntityWorkflow ->setRelatedEntityId($relatedEntityId) ->setRelatedEntityClass($relatedEntityClass); $workflowsList = $this->metadataExtractor->availableWorkflowFor($relatedEntityClass, $relatedEntityId); return [ $blankEntityWorkflow, $workflowsList, $this->repository->findBy( ['relatedEntityClass' => $relatedEntityClass, 'relatedEntityId' => $relatedEntityId] ), ]; } }