- Documentation >
- Content management >
- Workflow >
- Add custom workflow action
Add custom workflow action
Built-in workflow actions enable you to automatically publish a content item
or to send a notification to reviewers.
You can also create custom actions that are called when content reaches a specific stage
or goes through a transition in a workflow.
The following example shows how to configure two custom actions that send customized notifications.
Configure the first custom action under the ibexa.system.<scope>.workflows configuration key:
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19 | ibexa:
    system:
        default:
            workflows:
                custom_workflow:
                    transitions:
                        to_legal:
                            from: [draft]
                            to: [legal]
                            label: To legal
                            color: '#8888ba'
                            icon: '/bundles/ibexaplatformicons/img/all-icons.svg#notice'
                            reviewers:
                                required: true
                                user_group: 13
                            actions:
                                legal_transition_action:
                                    data:
                                        message: "Sent to the legal department"
 | 
The configuration indicates the name of the custom action (legal_transition_action).
data contains additional data that is passed to the action. In this case, it's a message to display.
Create event listener
To define what the action does, create an event listener src/EventListener/LegalTransitionListener.php:
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 | <?php
declare(strict_types=1);
namespace App\EventListener;
use Ibexa\Contracts\AdminUi\Notification\TranslatableNotificationHandlerInterface as NotificationInterface;
use Ibexa\Contracts\Workflow\Event\Action\AbstractTransitionWorkflowActionListener;
use Symfony\Component\Workflow\Event\TransitionEvent;
class LegalTransitionListener extends AbstractTransitionWorkflowActionListener
{
    private NotificationInterface $notificationHandler;
    public function __construct(NotificationInterface $notificationHandler)
    {
        $this->notificationHandler = $notificationHandler;
    }
    public function getIdentifier(): string
    {
        return 'legal_transition_action';
    }
    public function onWorkflowEvent(TransitionEvent $event): void
    {
        $metadata = $this->getActionMetadata($event->getWorkflow(), $event->getTransition());
        $message = $metadata['data']['message'];
        $this->notificationHandler->info(
            $message,
            [],
            'domain'
        );
        $this->setResult($event, true);
    }
}
 | 
This listener displays a notification bar at the bottom of the page when a content item goes through the to_legal transition.
The content of the notification is the message configured in actions.legal_transition_action.data.
To get it, access the metadata for this transition through getActionMetadata() (line 27).
Register the listener as a service (in config/services.yaml):
|  | services:
    App\EventListener\LegalTransitionListener:
        tags:
            - { name: ibexa.workflow.action.listener }
 | 
Use custom transition value
Line 36 in the listener above sets a custom result value for the transition.
You can use this value in other stages and transitions for this content item, for example:
|  |                         approved_by_legal:
                            from: [legal]
                            to: [done]
                            label: Approved by legal
                            color: '#88ad88'
                            icon: '/bundles/ibexaplatformicons/img/all-icons.svg#checkbox'
                            actions:
                                publish: ~
                                approved_transition_action:
                                    condition:
                                        - result.legal_transition_action == true
 | 
The action indicated here is performed only if the result from the legal_transition_action is set to true.
Then, the following src/EventListener/ApprovedTransitionListener is called:
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 | <?php
declare(strict_types=1);
namespace App\EventListener;
use Ibexa\Contracts\AdminUi\Notification\TranslatableNotificationHandlerInterface as NotificationInterface;
use Ibexa\Contracts\Workflow\Event\Action\AbstractTransitionWorkflowActionListener;
use Symfony\Component\Workflow\Event\TransitionEvent;
class ApprovedTransitionListener extends AbstractTransitionWorkflowActionListener
{
    private NotificationInterface $notificationHandler;
    public function __construct(NotificationInterface $notificationHandler)
    {
        $this->notificationHandler = $notificationHandler;
    }
    public function getIdentifier(): string
    {
        return 'approved_transition_action';
    }
    public function onWorkflowEvent(TransitionEvent $event): void
    {
        $context = $event->getContext();
        $message = $context['message'];
        $this->notificationHandler->info(
            $message,
            [],
            'domain'
        );
    }
}
 | 
Register this listener as a service:
|  | services:
    App\EventListener\ApprovedTransitionListener:
        tags:
            - { name: ibexa.workflow.action.listener }
 | 
This listener also displays a notification, but in this case its content is taken from the message
that the user types when choosing the Done transition.
The message is contained in the context of the action.
$event->getContext() (line 27) gives you access to the context.
The context contains:
- $workflowId- the ID of the current workflow
- $message- content of the user's message when sending the content item through the transitions
- $reviewerId- ID of the user who was selected as a reviewer
- $result- an array of transition actions performed so far
You can also modify the context using the setContext() method.
For example, you can override the message typed by the user:
|  | $new_context = $context;
$new_context['message'] = "This article went through proofreading";
$event->setContext($new_context);
 |