Skip to content

Commit f9074aa

Browse files
committed
Added Function (and Twig extension) to retrieve a specific transition
You can now easily retrieve a specific transition. Useful when you want the metadata of a specific transition.
1 parent 80d1f44 commit f9074aa

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

src/Symfony/Bridge/Twig/Extension/WorkflowExtension.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public function getFunctions(): array
3939
return [
4040
new TwigFunction('workflow_can', [$this, 'canTransition']),
4141
new TwigFunction('workflow_transitions', [$this, 'getEnabledTransitions']),
42+
new TwigFunction('workflow_transition', [$this, 'getEnabledTransition']),
4243
new TwigFunction('workflow_has_marked_place', [$this, 'hasMarkedPlace']),
4344
new TwigFunction('workflow_marked_places', [$this, 'getMarkedPlaces']),
4445
new TwigFunction('workflow_metadata', [$this, 'getMetadata']),
@@ -64,6 +65,16 @@ public function getEnabledTransitions(object $subject, string $name = null): arr
6465
return $this->workflowRegistry->get($subject, $name)->getEnabledTransitions($subject);
6566
}
6667

68+
/**
69+
* Returns a transition or null.
70+
*
71+
* @return Transition|null Enabled transition asked for
72+
*/
73+
public function getEnabledTransition(object $subject, string $transition, string $name = null): ?Transition
74+
{
75+
return $this->workflowRegistry->get($subject, $name)->getEnabledTransition($subject, $transition);
76+
}
77+
6778
/**
6879
* Returns true if the place is marked.
6980
*/

src/Symfony/Bridge/Twig/Tests/Extension/WorkflowExtensionTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,16 @@ public function testGetEnabledTransitions()
8181
$this->assertSame('t1', $transitions[0]->getName());
8282
}
8383

84+
public function testGetEnabledTransition()
85+
{
86+
$subject = new Subject();
87+
88+
$transition = $this->extension->getEnabledTransition($subject, 't1');
89+
90+
$this->assertInstanceOf(Transition::class, $transition);
91+
$this->assertSame('t1', $transition->getName());
92+
}
93+
8494
public function testHasMarkedPlace()
8595
{
8696
$subject = new Subject(['ordered' => 1, 'waiting_for_payment' => 1]);

src/Symfony/Component/Workflow/Tests/WorkflowTest.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,32 @@ public function testGetEnabledTransitions()
592592
$this->assertSame('t5', $transitions[0]->getName());
593593
}
594594

595+
public function testGetEnabledTransition()
596+
{
597+
$definition = $this->createComplexWorkflowDefinition();
598+
$subject = new Subject();
599+
$eventDispatcher = new EventDispatcher();
600+
$eventDispatcher->addListener('workflow.workflow_name.guard.t1', function (GuardEvent $event) {
601+
$event->setBlocked(true);
602+
});
603+
$workflow = new Workflow($definition, new MethodMarkingStore(), $eventDispatcher, 'workflow_name');
604+
605+
$this->assertEmpty($workflow->getEnabledTransitions($subject));
606+
607+
$subject->setMarking(['d' => 1]);
608+
$transition = $workflow->getEnabledTransition($subject, 't3');
609+
$this->assertInstanceOf(Transition::class, $transition);
610+
$this->assertSame('t3', $transition->getName());
611+
612+
$subject->setMarking(['c' => 1, 'e' => 1]);
613+
$transition = $workflow->getEnabledTransition($subject, 't5');
614+
$this->assertInstanceOf(Transition::class, $transition);
615+
$this->assertSame('t5', $transition->getName());
616+
617+
$transition = $workflow->getEnabledTransition($subject, 'does_not_exist');
618+
$this->assertNull($transition);
619+
}
620+
595621
public function testGetEnabledTransitionsWithSameNameTransition()
596622
{
597623
$definition = $this->createWorkflowWithSameNameTransition();

src/Symfony/Component/Workflow/Workflow.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,23 @@ public function getEnabledTransitions(object $subject)
235235
return $enabledTransitions;
236236
}
237237

238+
/**
239+
* {@inheritdoc}
240+
*/
241+
public function getEnabledTransition(object $subject, string $name)
242+
{
243+
$marking = $this->getMarking($subject);
244+
245+
foreach ($this->definition->getTransitions() as $transition) {
246+
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
247+
if ($transitionBlockerList->isEmpty() && $transition->getName() === $name) {
248+
return $transition;
249+
}
250+
}
251+
252+
return null;
253+
}
254+
238255
/**
239256
* {@inheritdoc}
240257
*/

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy