From bfd699b44068995bddf2bcd2badd5df17857eb03 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Fri, 28 Aug 2026 10:17:27 +0200 Subject: [PATCH 01/24] notification_channels.md: About admin notifications --- docs/api/notification_channels.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index afbed9052a..ddc1256980 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -41,9 +41,11 @@ Some events generate notifications that you can deliver to the users through one - [`Ibexa\Contracts\User\Notification\UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) - [`Ibexa\Contracts\User\Notification\UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) - [`Ibexa\Contracts\User\Notification\UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) -- `Ibexa\Share\Notification\ContentEditInvitationNotification` -- `Ibexa\Share\Notification\ContentViewInvitationNotification` -- `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification` +- `Ibexa\Share\Notification\ContentEditInvitationNotification` (alias `ibexa_content_edit_invitation`) +- `Ibexa\Share\Notification\ContentViewInvitationNotification` (alias `ibexa_content_view_invitation`) +- `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification` (alias `ibexa_external_participant_content_view_invitation`) +- `Ibexa\AdminUi\Notifier\Notification\UserInvitation` +- `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` ### Available notification channels @@ -79,6 +81,13 @@ This page contains several examples of subscriptions configuration. php bin/console ibexa:debug:config notifications.subscriptions --siteaccess= ``` + For example, the following command returns the subscription for the `admin` siteaccess. + You should see subscriptions to handle password reset, the user invitation, and the share invitations through at least `email`. + + ```bash + php bin/console ibexa:debug:config notifications.subscriptions --siteaccess=admin + ``` + #### Subscription example The following example shows how you can deliver notifications about Commerce-related activities through Slack: From 44c7abeff137ea095447a93b942bdd96f9d1af24 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Fri, 28 Aug 2026 10:27:02 +0200 Subject: [PATCH 02/24] notification_channels.md: About admin notifications --- docs/api/notification_channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index ddc1256980..962353d28e 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -82,7 +82,7 @@ This page contains several examples of subscriptions configuration. ``` For example, the following command returns the subscription for the `admin` siteaccess. - You should see subscriptions to handle password reset, the user invitation, and the share invitations through at least `email`. + You should see subscriptions to handle back office password reset and user invitation, and the share invitations through, at least, `email`. ```bash php bin/console ibexa:debug:config notifications.subscriptions --siteaccess=admin From 451caef9c72550b0bee23cf36ba9a6a03d40f376 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Fri, 28 Aug 2026 16:19:30 +0200 Subject: [PATCH 03/24] notification_channels.md: About FormSubmitted --- docs/api/notification_channels.md | 40 ++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 962353d28e..0bc5db1ebf 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -34,6 +34,8 @@ Some events generate notifications that you can deliver to the users through one ### Available notification types - [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) + - `FormSubmitted` email notifications are by default sent to the email addresses set in the submit button. + For more information, see [form email notification](customize_email_notifications.md). - [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) - [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) - [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) @@ -85,7 +87,43 @@ This page contains several examples of subscriptions configuration. You should see subscriptions to handle back office password reset and user invitation, and the share invitations through, at least, `email`. ```bash - php bin/console ibexa:debug:config notifications.subscriptions --siteaccess=admin + php bin/console ibexa:debug:config notifications.subscriptions --siteaccess=admin --json | jq + ``` + ```json + { + "ibexa_content_edit_invitation": { + "channels": [ + "ibexa", + "email" + ] + }, + "ibexa_content_view_invitation": { + "channels": [ + "ibexa", + "email" + ] + }, + "ibexa_external_participant_content_view_invitation": { + "channels": [ + "email" + ] + }, + "Ibexa\\AdminUi\\Notifier\\Notification\\UserPasswordReset": { + "channels": [ + "email" + ] + }, + "Ibexa\\AdminUi\\Notifier\\Notification\\UserInvitation": { + "channels": [ + "email" + ] + }, + "Ibexa\\Contracts\\FormBuilder\\Notifications\\FormSubmitted": { + "channels": [ + "email" + ] + } + } ``` #### Subscription example From 352914716c5b898c9cf8e0b227e5080895aa873e Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Fri, 28 Aug 2026 17:43:33 +0200 Subject: [PATCH 04/24] notification_channels.md: About default recipients --- docs/api/notification_channels.md | 36 ++++++++++++++++++------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 0bc5db1ebf..e7828dde6c 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -33,21 +33,27 @@ Some events generate notifications that you can deliver to the users through one ### Available notification types -- [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) - - `FormSubmitted` email notifications are by default sent to the email addresses set in the submit button. - For more information, see [form email notification](customize_email_notifications.md). -- [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) -- [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) -- [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) -- [`Ibexa\Contracts\Shipping\Notification\ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) -- [`Ibexa\Contracts\User\Notification\UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) -- [`Ibexa\Contracts\User\Notification\UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) -- [`Ibexa\Contracts\User\Notification\UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) -- `Ibexa\Share\Notification\ContentEditInvitationNotification` (alias `ibexa_content_edit_invitation`) -- `Ibexa\Share\Notification\ContentViewInvitationNotification` (alias `ibexa_content_view_invitation`) -- `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification` (alias `ibexa_external_participant_content_view_invitation`) -- `Ibexa\AdminUi\Notifier\Notification\UserInvitation` -- `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` +Several built-in notification types are available. +TODO: Some/All are sent by various notifiers like event subscribers. + +| Notification type | Default recipients | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| +| `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | TODO: Given email address | +| `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | TODO: Given email address | +| [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | [Form submit email notification field](customize_email_notifications.md) | +| [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) | TODO | +| [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | Order owner | +| [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | Order owner | +| [`Ibexa\Contracts\Shipping\Notification\ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | Order owner | +| [`Ibexa\Contracts\User\Notification\UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | TODO: Given email address | +| [`Ibexa\Contracts\User\Notification\UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | TODO: Given email address | +| [`Ibexa\Contracts\User\Notification\UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | TODO | +| `Ibexa\Share\Notification\ContentEditInvitationNotification`
(alias `ibexa_content_edit_invitation`) | TODO: Given users | +| `Ibexa\Share\Notification\ContentViewInvitationNotification`
(alias `ibexa_content_view_invitation`) | TODO: Given users | +| `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification`
(alias `ibexa_external_participant_content_view_invitation`) | TODO: Given email addresses | + +Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users and other more generic usages. +Same for the two `UserPasswordReset` in distinct namespaces. ### Available notification channels From 9695a1abd89674faa9024eb337bf58ea8c26c9e8 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Mon, 31 Aug 2026 10:15:10 +0200 Subject: [PATCH 05/24] notification_channels.md: Continue default recipients --- docs/api/notification_channels.md | 48 ++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index e7828dde6c..77c6283f5d 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -38,21 +38,21 @@ TODO: Some/All are sent by various notifiers like event subscribers. | Notification type | Default recipients | |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| -| `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | TODO: Given email address | -| `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | TODO: Given email address | +| `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | Given email address | +| `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | Given email address | | [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | [Form submit email notification field](customize_email_notifications.md) | | [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) | TODO | | [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | Order owner | | [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | Order owner | | [`Ibexa\Contracts\Shipping\Notification\ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | Order owner | -| [`Ibexa\Contracts\User\Notification\UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | TODO: Given email address | -| [`Ibexa\Contracts\User\Notification\UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | TODO: Given email address | -| [`Ibexa\Contracts\User\Notification\UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | TODO | -| `Ibexa\Share\Notification\ContentEditInvitationNotification`
(alias `ibexa_content_edit_invitation`) | TODO: Given users | -| `Ibexa\Share\Notification\ContentViewInvitationNotification`
(alias `ibexa_content_view_invitation`) | TODO: Given users | -| `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification`
(alias `ibexa_external_participant_content_view_invitation`) | TODO: Given email addresses | - -Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users and other more generic usages. +| [`Ibexa\Contracts\User\Notification\UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | Given email address | +| [`Ibexa\Contracts\User\Notification\UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | Given email address | +| [`Ibexa\Contracts\User\Notification\UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | Registered user | +| `Ibexa\Share\Notification\ContentEditInvitationNotification`
(alias `ibexa_content_edit_invitation`) | Given users | +| `Ibexa\Share\Notification\ContentViewInvitationNotification`
(alias `ibexa_content_view_invitation`) | Given users | +| `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification`
(alias `ibexa_external_participant_content_view_invitation`) | Given email addresses | + +Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users. Same for the two `UserPasswordReset` in distinct namespaces. ### Available notification channels @@ -132,6 +132,34 @@ This page contains several examples of subscriptions configuration. } ``` + While, the following command return the subscribtions for the default siteaccess. + On a fresh installation, it returns the subscriptions of the `site` siteaccess. + + ```bash + php bin/console ibexa:debug:config notifications.subscriptions --json | jq + ``` + ```json + { + "Ibexa\\Contracts\\User\\Notification\\UserPasswordReset": { + "channels": [ + "email" + ] + }, + "Ibexa\\Contracts\\User\\Notification\\UserInvitation": { + "channels": [ + "email" + ] + }, + "Ibexa\\Contracts\\FormBuilder\\Notifications\\FormSubmitted": { + "channels": [ + "email" + ] + } + } + ``` + + + #### Subscription example The following example shows how you can deliver notifications about Commerce-related activities through Slack: From 729c03241be6198dd495ec3a5db9eab0b7c90418 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Mon, 31 Aug 2026 12:38:09 +0200 Subject: [PATCH 06/24] notification_channels.md: Continue with triggers and senders --- docs/api/notification_channels.md | 36 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 77c6283f5d..15288d7f51 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -34,23 +34,23 @@ Some events generate notifications that you can deliver to the users through one ### Available notification types Several built-in notification types are available. -TODO: Some/All are sent by various notifiers like event subscribers. - -| Notification type | Default recipients | -|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| -| `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | Given email address | -| `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | Given email address | -| [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | [Form submit email notification field](customize_email_notifications.md) | -| [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) | TODO | -| [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | Order owner | -| [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | Order owner | -| [`Ibexa\Contracts\Shipping\Notification\ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | Order owner | -| [`Ibexa\Contracts\User\Notification\UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | Given email address | -| [`Ibexa\Contracts\User\Notification\UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | Given email address | -| [`Ibexa\Contracts\User\Notification\UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | Registered user | -| `Ibexa\Share\Notification\ContentEditInvitationNotification`
(alias `ibexa_content_edit_invitation`) | Given users | -| `Ibexa\Share\Notification\ContentViewInvitationNotification`
(alias `ibexa_content_view_invitation`) | Given users | -| `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification`
(alias `ibexa_external_participant_content_view_invitation`) | Given email addresses | +They are sent by various notifiers like event subscribers, controllers or form processors. + +| Notification type | Sent | Default recipients | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| +| `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | by `Ibexa\AdminUi\Notifier\UserInvitation` service implementing [`Ibexa\Contracts\User\Invitation\InvitationSender`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Invitation-InvitationSender.html) | Given email address | +| `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | by `Ibexa\AdminUi\Notifier\PasswordReset` service implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | +| [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on `Ibexa\Core\MVC\Symfony\MVCEvents::PRE_CONTENT_VIEW` (`ezpublish.pre_content_view`) | [Form submit email notification field](customize_email_notifications.md) | +| [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotificationInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotificationInterface.html) | - | - | +| [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [`Ibexa\Contracts\OrderManagement\Event\CreateOrderEvent`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html),
and on [`Symfony\Component\Workflow\WorkflowEvents::ENTERED` (`workflow.entered`)]([[= symfony_doc =]]/workflow.html#using-events) when the subject is a [`Ibexa\Contracts\OrderManagement\Value\Order\OrderInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Value-Order-OrderInterface.html) | Order owner | +| [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | on `Symfony\Component\Workflow\WorkflowEvents::ENTERED` when the subject is a [`Ibexa\Contracts\Payment\Payment\PaymentInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Payment-PaymentInterface.html) | Order owner | +| [`Ibexa\Contracts\Shipping\Notification\ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | on `Symfony\Component\Workflow\WorkflowEvents::ENTERED` when the subject is a [`Ibexa\Contracts\Shipping\Shipment\ShipmentInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Shipment-ShipmentInterface.html) | Order owner | +| [`Ibexa\Contracts\User\Notification\UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | by `Ibexa\User\Invitation\MailSender` service implementing [`Ibexa\Contracts\User\Invitation\InvitationSender`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Invitation-InvitationSender.html) | Given email address | +| [`Ibexa\Contracts\User\Notification\UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | by `Ibexa\User\PasswordReset\Notifier` service implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | +| [`Ibexa\Contracts\User\Notification\UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | by `Ibexa\User\Form\Processor\UserRegisterFormProcessor` on `Ibexa\User\Form\UserFormEvents::USER_REGISTER` (`user.edit.register`) | Registered user | +| `Ibexa\Share\Notification\ContentEditInvitationNotification`
(alias `ibexa_content_edit_invitation`) | on [`Ibexa\Contracts\Collaboration\Invitation\Event\CreateInvitationEvent`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Invitation-Event-CreateInvitationEvent.html) through a [`Ibexa\Contracts\Collaboration\Notification\NotificationFactoryInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Notification-NotificationFactoryInterface.html) | Given users | +| `Ibexa\Share\Notification\ContentViewInvitationNotification`
(alias `ibexa_content_view_invitation`) | on [`Ibexa\Contracts\Collaboration\Invitation\Event\CreateInvitationEvent`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Invitation-Event-CreateInvitationEvent.html) through a [`Ibexa\Contracts\Collaboration\Notification\NotificationFactoryInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Notification-NotificationFactoryInterface.html) | Given users | +| `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification`
(alias `ibexa_external_participant_content_view_invitation`) | on [`Ibexa\Contracts\Collaboration\Invitation\Event\CreateInvitationEvent`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Invitation-Event-CreateInvitationEvent.html) through a [`Ibexa\Contracts\Collaboration\Notification\NotificationFactoryInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Notification-NotificationFactoryInterface.html) | Given email addresses | Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users. Same for the two `UserPasswordReset` in distinct namespaces. @@ -158,8 +158,6 @@ This page contains several examples of subscriptions configuration. } ``` - - #### Subscription example The following example shows how you can deliver notifications about Commerce-related activities through Slack: From 6459ee8d69df564dcb3ec0ddeaedeee497c4a53b Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Mon, 31 Aug 2026 12:41:11 +0200 Subject: [PATCH 07/24] notification_channels.md: Fix MD009/no-trailing-spaces --- docs/api/notification_channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 15288d7f51..e1abf301a5 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -34,7 +34,7 @@ Some events generate notifications that you can deliver to the users through one ### Available notification types Several built-in notification types are available. -They are sent by various notifiers like event subscribers, controllers or form processors. +They are sent by various notifiers like event subscribers, controllers or form processors. | Notification type | Sent | Default recipients | |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| From 68071ef4b2706432fad5355c23d41b626f459ddb Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Mon, 31 Aug 2026 12:49:02 +0200 Subject: [PATCH 08/24] notification_channels.md: Continue with triggers and senders --- docs/api/notification_channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index e1abf301a5..81f3aa64c0 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -40,7 +40,7 @@ They are sent by various notifiers like event subscribers, controllers or form p |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| | `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | by `Ibexa\AdminUi\Notifier\UserInvitation` service implementing [`Ibexa\Contracts\User\Invitation\InvitationSender`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Invitation-InvitationSender.html) | Given email address | | `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | by `Ibexa\AdminUi\Notifier\PasswordReset` service implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | -| [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on `Ibexa\Core\MVC\Symfony\MVCEvents::PRE_CONTENT_VIEW` (`ezpublish.pre_content_view`) | [Form submit email notification field](customize_email_notifications.md) | +| [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on `Ibexa\Core\MVC\Symfony\MVCEvents::PRE_CONTENT_VIEW` (`ezpublish.pre_content_view`) when the content item has a form field through an `Ibexa\FormBuilder\FormSubmission\Notification\NotificationSenderInterface` implementation | [Form submit email notification field](customize_email_notifications.md) | | [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotificationInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotificationInterface.html) | - | - | | [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [`Ibexa\Contracts\OrderManagement\Event\CreateOrderEvent`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html),
and on [`Symfony\Component\Workflow\WorkflowEvents::ENTERED` (`workflow.entered`)]([[= symfony_doc =]]/workflow.html#using-events) when the subject is a [`Ibexa\Contracts\OrderManagement\Value\Order\OrderInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Value-Order-OrderInterface.html) | Order owner | | [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | on `Symfony\Component\Workflow\WorkflowEvents::ENTERED` when the subject is a [`Ibexa\Contracts\Payment\Payment\PaymentInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Payment-PaymentInterface.html) | Order owner | From 63c352886bcac380f60eee5fdae6a0dc623240cb Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Tue, 1 Sep 2026 16:14:02 +0200 Subject: [PATCH 09/24] notification_channels.md: Continue with triggers and senders --- docs/api/notification_channels.md | 32 +++++++++---------- .../collaborative_editing_api.md | 10 ++++++ docs/permissions/permission_use_cases.md | 2 +- docs/users/invitations.md | 4 +-- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 81f3aa64c0..d8cb48e979 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -36,24 +36,24 @@ Some events generate notifications that you can deliver to the users through one Several built-in notification types are available. They are sent by various notifiers like event subscribers, controllers or form processors. -| Notification type | Sent | Default recipients | -|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| -| `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | by `Ibexa\AdminUi\Notifier\UserInvitation` service implementing [`Ibexa\Contracts\User\Invitation\InvitationSender`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Invitation-InvitationSender.html) | Given email address | -| `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | by `Ibexa\AdminUi\Notifier\PasswordReset` service implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | -| [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on `Ibexa\Core\MVC\Symfony\MVCEvents::PRE_CONTENT_VIEW` (`ezpublish.pre_content_view`) when the content item has a form field through an `Ibexa\FormBuilder\FormSubmission\Notification\NotificationSenderInterface` implementation | [Form submit email notification field](customize_email_notifications.md) | -| [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotificationInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotificationInterface.html) | - | - | -| [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [`Ibexa\Contracts\OrderManagement\Event\CreateOrderEvent`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html),
and on [`Symfony\Component\Workflow\WorkflowEvents::ENTERED` (`workflow.entered`)]([[= symfony_doc =]]/workflow.html#using-events) when the subject is a [`Ibexa\Contracts\OrderManagement\Value\Order\OrderInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Value-Order-OrderInterface.html) | Order owner | -| [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | on `Symfony\Component\Workflow\WorkflowEvents::ENTERED` when the subject is a [`Ibexa\Contracts\Payment\Payment\PaymentInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Payment-PaymentInterface.html) | Order owner | -| [`Ibexa\Contracts\Shipping\Notification\ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | on `Symfony\Component\Workflow\WorkflowEvents::ENTERED` when the subject is a [`Ibexa\Contracts\Shipping\Shipment\ShipmentInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Shipment-ShipmentInterface.html) | Order owner | -| [`Ibexa\Contracts\User\Notification\UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | by `Ibexa\User\Invitation\MailSender` service implementing [`Ibexa\Contracts\User\Invitation\InvitationSender`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Invitation-InvitationSender.html) | Given email address | -| [`Ibexa\Contracts\User\Notification\UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | by `Ibexa\User\PasswordReset\Notifier` service implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | -| [`Ibexa\Contracts\User\Notification\UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | by `Ibexa\User\Form\Processor\UserRegisterFormProcessor` on `Ibexa\User\Form\UserFormEvents::USER_REGISTER` (`user.edit.register`) | Registered user | -| `Ibexa\Share\Notification\ContentEditInvitationNotification`
(alias `ibexa_content_edit_invitation`) | on [`Ibexa\Contracts\Collaboration\Invitation\Event\CreateInvitationEvent`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Invitation-Event-CreateInvitationEvent.html) through a [`Ibexa\Contracts\Collaboration\Notification\NotificationFactoryInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Notification-NotificationFactoryInterface.html) | Given users | -| `Ibexa\Share\Notification\ContentViewInvitationNotification`
(alias `ibexa_content_view_invitation`) | on [`Ibexa\Contracts\Collaboration\Invitation\Event\CreateInvitationEvent`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Invitation-Event-CreateInvitationEvent.html) through a [`Ibexa\Contracts\Collaboration\Notification\NotificationFactoryInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Notification-NotificationFactoryInterface.html) | Given users | -| `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification`
(alias `ibexa_external_participant_content_view_invitation`) | on [`Ibexa\Contracts\Collaboration\Invitation\Event\CreateInvitationEvent`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Invitation-Event-CreateInvitationEvent.html) through a [`Ibexa\Contracts\Collaboration\Notification\NotificationFactoryInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Notification-NotificationFactoryInterface.html) | Given email addresses | +| Notification type | Sent | Default recipients | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| +| `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (`/user/invite/to-group/{userGroupId}` alias `ibexa.user.invite.to_group`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | +| `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | from the back office "Forgot your password?"/"Reset your password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\AdminUi\Notifier\PasswordReset` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | +| [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | when a content item with a [form field](formfield.md) is created | [Form submit email notification field](customize_email_notifications.md) | +| [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) | - | - | +| [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner | +| [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner | +| [`Ibexa\Contracts\Shipping\Notification\ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner | +| [`Ibexa\Contracts\User\Notification\UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite` alias `ibexa.user.invite_user`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | +| [`Ibexa\Contracts\User\Notification\UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\User\PasswordReset\Notifier` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | +| [`Ibexa\Contracts\User\Notification\UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` (alias `ibexa.user.register`) and `/from-invite/register` (alias `ibexa.user.from_invite.register`) | Registered user | +| `Ibexa\Share\Notification\ContentEditInvitationNotification`
(alias `ibexa_content_edit_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has edit scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | +| `Ibexa\Share\Notification\ContentViewInvitationNotification`
(alias `ibexa_content_view_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | +| `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification`
(alias `ibexa_external_participant_content_view_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses | Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users. -Same for the two `UserPasswordReset` in distinct namespaces. +Same for the two `UserPasswordReset` in distinct namespaces. The back office `UserPasswordReset` notification is sent by a dedicated implementation of the notifier used by the controller. ### Available notification channels diff --git a/docs/content_management/collaborative_editing/collaborative_editing_api.md b/docs/content_management/collaborative_editing/collaborative_editing_api.md index f316ce2197..004d166e26 100644 --- a/docs/content_management/collaborative_editing/collaborative_editing_api.md +++ b/docs/content_management/collaborative_editing/collaborative_editing_api.md @@ -72,6 +72,16 @@ You can add participant to the collaboration session with [`SessionService::addP [[= include_code('code_samples/collaboration/src/Command/ManageSessionsCommand.php', 81, 93, remove_indent=True) =]] ``` +Participants can be internal (based on an existing user) or external ( on an email address): + +[`InternalParticipantCreateStruct`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Participant-InternalParticipantCreateStruct.html#properties) +[`ExternalParticipantCreateStruct`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Participant-ExternalParticipantCreateStruct.html#properties) + +Two scopes are available: + +- [`ContentSessionScope::EDIT`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Share-Collaboration-ContentSessionScope.html#constant_EDIT) +- [`ContentSessionScope::VIEW`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Share-Collaboration-ContentSessionScope.html#constant_VIEW) + ### Get and update participant You can update participant added to the collaboration session with [`SessionService::updateParticipant()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-SessionServiceInterface.html#method_updateParticipant): diff --git a/docs/permissions/permission_use_cases.md b/docs/permissions/permission_use_cases.md index c29c5b32ea..277c5498f9 100644 --- a/docs/permissions/permission_use_cases.md +++ b/docs/permissions/permission_use_cases.md @@ -164,7 +164,7 @@ With limitations, you can configure whether permissions apply to Tags, product c ## Register users -To allow anonymous users to register through the `/register` route, grant the `user/register` policy to the Anonymous user group. +To allow anonymous users to register through the `/register` or `/from-invite/register` routes, grant, to the Anonymous role, the `user/register` policy and the `content/create` policy limited to the User content type and some user groups. ## Admin diff --git a/docs/users/invitations.md b/docs/users/invitations.md index ddcebdd860..d110a2353c 100644 --- a/docs/users/invitations.md +++ b/docs/users/invitations.md @@ -9,13 +9,13 @@ You can send invitations to individual users or in bulk. ## Roles and policies -To invite other members to the site or the back office, a user needs to have the `User:Invite` permission added to their role. +To invite other members to the site or the back office, a user needs to have the `ùser/invite` permission added to their role. You can limit the ability to invite other members to specific user groups, such as Editors, or to the specific roles within the group, for example: Admin, Buyer. ## Creating and sending invitations Invitations are created with [InvitationService](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Invitation-InvitationService.html), but sending them requires additional setup. -[[= product_name =]] provides you with `Ibexa\User\Invitation\MailSender` implementation of `InvitationSender` interface for sending invitations via email. +[[= product_name =]] provides you with `Ibexa\User\Invitation\MailSender` implementation of [`InvitationSender`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Invitation-InvitationSender.html) interface for sending invitations via email. If you want to send invitations through different channels, you need to create a custom setup. ## Invitation and registration form templates From 85ff69a0713bd630008a0fbedd4f80a82e307da8 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Tue, 1 Sep 2026 16:19:07 +0200 Subject: [PATCH 10/24] Apply suggestion from @adriendupuis --- docs/users/invitations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/users/invitations.md b/docs/users/invitations.md index d110a2353c..7d5c94fef5 100644 --- a/docs/users/invitations.md +++ b/docs/users/invitations.md @@ -9,7 +9,7 @@ You can send invitations to individual users or in bulk. ## Roles and policies -To invite other members to the site or the back office, a user needs to have the `ùser/invite` permission added to their role. +To invite other members to the site or the back office, a user needs to have the `user/invite` permission added to their role. You can limit the ability to invite other members to specific user groups, such as Editors, or to the specific roles within the group, for example: Admin, Buyer. ## Creating and sending invitations From fb6f9a62acd074eb609f13dd9c60a88b05da4192 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 09:36:43 +0200 Subject: [PATCH 11/24] notification_channels.md: Continue with triggers and senders --- docs/api/notification_channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index d8cb48e979..3d204b6fce 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -40,7 +40,7 @@ They are sent by various notifiers like event subscribers, controllers or form p |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| | `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (`/user/invite/to-group/{userGroupId}` alias `ibexa.user.invite.to_group`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | | `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | from the back office "Forgot your password?"/"Reset your password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\AdminUi\Notifier\PasswordReset` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | -| [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | when a content item with a [form field](formfield.md) is created | [Form submit email notification field](customize_email_notifications.md) | +| [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form submit email notification field](customize_email_notifications.md) | | [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) | - | - | | [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner | | [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner | From 27535c8399f95570821d8192bebeaaa7bc1a0184 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:02:44 +0200 Subject: [PATCH 12/24] notification_channels.md: Move SystemNotification --- docs/api/notification_channels.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 3d204b6fce..ce60a482a0 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -41,7 +41,6 @@ They are sent by various notifiers like event subscribers, controllers or form p | `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (`/user/invite/to-group/{userGroupId}` alias `ibexa.user.invite.to_group`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | | `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | from the back office "Forgot your password?"/"Reset your password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\AdminUi\Notifier\PasswordReset` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | | [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form submit email notification field](customize_email_notifications.md) | -| [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) | - | - | | [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner | | [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner | | [`Ibexa\Contracts\Shipping\Notification\ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner | @@ -55,6 +54,8 @@ They are sent by various notifiers like event subscribers, controllers or form p Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users. Same for the two `UserPasswordReset` in distinct namespaces. The back office `UserPasswordReset` notification is sent by a dedicated implementation of the notifier used by the controller. +An [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) is available. It's not used but you could. + ### Available notification channels You can list the notification channel services with the following command: From 9fa5706a7f28281edc6424666c34c55f7e3dba41 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:03:07 +0200 Subject: [PATCH 13/24] notification_channels.md: Remove SystemNotification --- docs/api/notification_channels.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index ce60a482a0..0cf54f428a 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -54,8 +54,6 @@ They are sent by various notifiers like event subscribers, controllers or form p Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users. Same for the two `UserPasswordReset` in distinct namespaces. The back office `UserPasswordReset` notification is sent by a dedicated implementation of the notifier used by the controller. -An [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) is available. It's not used but you could. - ### Available notification channels You can list the notification channel services with the following command: From 70d654f2e39abdf5f517d1af0801c96d8f25cb51 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:11:51 +0200 Subject: [PATCH 14/24] notification_channels.md: line break control --- docs/api/notification_channels.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 0cf54f428a..50dd00e63f 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -36,20 +36,20 @@ Some events generate notifications that you can deliver to the users through one Several built-in notification types are available. They are sent by various notifiers like event subscribers, controllers or form processors. -| Notification type | Sent | Default recipients | -|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| -| `Ibexa\AdminUi\Notifier\Notification\UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (`/user/invite/to-group/{userGroupId}` alias `ibexa.user.invite.to_group`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | -| `Ibexa\AdminUi\Notifier\Notification\UserPasswordReset` | from the back office "Forgot your password?"/"Reset your password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\AdminUi\Notifier\PasswordReset` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | -| [`Ibexa\Contracts\FormBuilder\Notifications\FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form submit email notification field](customize_email_notifications.md) | -| [`Ibexa\Contracts\OrderManagement\Notification\OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner | -| [`Ibexa\Contracts\Payment\Notification\PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner | -| [`Ibexa\Contracts\Shipping\Notification\ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner | -| [`Ibexa\Contracts\User\Notification\UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite` alias `ibexa.user.invite_user`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | -| [`Ibexa\Contracts\User\Notification\UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\User\PasswordReset\Notifier` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | -| [`Ibexa\Contracts\User\Notification\UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` (alias `ibexa.user.register`) and `/from-invite/register` (alias `ibexa.user.from_invite.register`) | Registered user | -| `Ibexa\Share\Notification\ContentEditInvitationNotification`
(alias `ibexa_content_edit_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has edit scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | -| `Ibexa\Share\Notification\ContentViewInvitationNotification`
(alias `ibexa_content_view_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | -| `Ibexa\Share\Notification\ExternalParticipantContentViewInvitationNotification`
(alias `ibexa_external_participant_content_view_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses | +| Notification type | Sent | Default recipients | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| +| `Ibexa\AdminUi\Notifier\Notification\`
`UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (`/user/invite/to-group/{userGroupId}` alias `ibexa.user.invite.to_group`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | +| `Ibexa\AdminUi\Notifier\Notification\`
`UserPasswordReset` | from the back office "Forgot your password?"/"Reset your password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\AdminUi\Notifier\PasswordReset` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | +| [`Ibexa\Contracts\FormBuilder\Notifications\`
`FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form submit email notification field](customize_email_notifications.md) | +| [`Ibexa\Contracts\OrderManagement\Notification\`
`OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner | +| [`Ibexa\Contracts\Payment\Notification\`
`PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner | +| [`Ibexa\Contracts\Shipping\Notification\`
`ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner | +| [`Ibexa\Contracts\User\Notification\`
`UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite` alias `ibexa.user.invite_user`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | +| [`Ibexa\Contracts\User\Notification\`
`UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\User\PasswordReset\Notifier` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | +| [`Ibexa\Contracts\User\Notification\`
`UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` (alias `ibexa.user.register`) and `/from-invite/register` (alias `ibexa.user.from_invite.register`) | Registered user | +| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
(alias `ibexa_content_edit_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has edit scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | +| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
(alias `ibexa_content_view_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | +| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
(alias `ibexa_external_participant_content_view_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses | Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users. Same for the two `UserPasswordReset` in distinct namespaces. The back office `UserPasswordReset` notification is sent by a dedicated implementation of the notifier used by the controller. From 5eb496bd00df6cea71e0ec0b52eeb98404c01200 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:15:38 +0200 Subject: [PATCH 15/24] notification_channels.md: line break control --- docs/api/notification_channels.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 50dd00e63f..7c538584f5 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -47,9 +47,9 @@ They are sent by various notifiers like event subscribers, controllers or form p | [`Ibexa\Contracts\User\Notification\`
`UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite` alias `ibexa.user.invite_user`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | | [`Ibexa\Contracts\User\Notification\`
`UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\User\PasswordReset\Notifier` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | | [`Ibexa\Contracts\User\Notification\`
`UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` (alias `ibexa.user.register`) and `/from-invite/register` (alias `ibexa.user.from_invite.register`) | Registered user | -| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
(alias `ibexa_content_edit_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has edit scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | -| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
(alias `ibexa_content_view_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | -| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
(alias `ibexa_external_participant_content_view_invitation`) | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses | +| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
alias `ibexa_content_edit_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has edit scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | +| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
alias `ibexa_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | +| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
alias `ibexa_external_participant_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses | Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users. Same for the two `UserPasswordReset` in distinct namespaces. The back office `UserPasswordReset` notification is sent by a dedicated implementation of the notifier used by the controller. From 8ba054ea95d51a9360d3b3c7a37928beeef8aa2e Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:52:54 +0200 Subject: [PATCH 16/24] notification_send.php: Merge phpdoc comments --- code_samples/api/notifications/notification_send.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code_samples/api/notifications/notification_send.php b/code_samples/api/notifications/notification_send.php index c0d4b42169..ce542c33a3 100644 --- a/code_samples/api/notifications/notification_send.php +++ b/code_samples/api/notifications/notification_send.php @@ -7,9 +7,11 @@ $subject = 'My subject'; -/** @var \Ibexa\Contracts\Notifications\Service\NotificationServiceInterface $notificationService */ -/** @var \Ibexa\Contracts\Core\Repository\UserService $userService */ -/** @var \Ibexa\Contracts\Core\Repository\PermissionResolver $permissionResolver */ +/** + * @var \Ibexa\Contracts\Notifications\Service\NotificationServiceInterface $notificationService + * @var \Ibexa\Contracts\Core\Repository\UserService $userService + * @var \Ibexa\Contracts\Core\Repository\PermissionResolver $permissionResolver + */ $notificationService->send( new SymfonyNotificationAdapter(new MyNotification($subject)), [new SymfonyRecipientAdapter(new UserRecipient($userService->loadUser($permissionResolver->getCurrentUserReference()->getUserId())))], From f9840eb93a99448c6ca7418e9640389de95c9225 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 15:35:07 +0200 Subject: [PATCH 17/24] notification_channels.md: Rework Available notification channels --- docs/api/notification_channels.md | 68 +++++++++++++++---------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 7c538584f5..7356d72ac4 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -36,24 +36,27 @@ Some events generate notifications that you can deliver to the users through one Several built-in notification types are available. They are sent by various notifiers like event subscribers, controllers or form processors. -| Notification type | Sent | Default recipients | -|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| -| `Ibexa\AdminUi\Notifier\Notification\`
`UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (`/user/invite/to-group/{userGroupId}` alias `ibexa.user.invite.to_group`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | -| `Ibexa\AdminUi\Notifier\Notification\`
`UserPasswordReset` | from the back office "Forgot your password?"/"Reset your password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\AdminUi\Notifier\PasswordReset` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | -| [`Ibexa\Contracts\FormBuilder\Notifications\`
`FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form submit email notification field](customize_email_notifications.md) | -| [`Ibexa\Contracts\OrderManagement\Notification\`
`OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner | -| [`Ibexa\Contracts\Payment\Notification\`
`PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner | -| [`Ibexa\Contracts\Shipping\Notification\`
`ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner | -| [`Ibexa\Contracts\User\Notification\`
`UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite` alias `ibexa.user.invite_user`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address | -| [`Ibexa\Contracts\User\Notification\`
`UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\User\PasswordReset\Notifier` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address | -| [`Ibexa\Contracts\User\Notification\`
`UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` (alias `ibexa.user.register`) and `/from-invite/register` (alias `ibexa.user.from_invite.register`) | Registered user | -| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
alias `ibexa_content_edit_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has edit scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | -| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
alias `ibexa_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users | -| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
alias `ibexa_external_participant_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses | +| Notification type | Sent | Default recipients
— supported channels | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------| +| `Ibexa\AdminUi\Notifier\Notification\`
`UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (`/user/invite/to-group/{userGroupId}` alias `ibexa.user.invite.to_group`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | +| `Ibexa\AdminUi\Notifier\Notification\`
`UserPasswordReset` | from the back office "Forgot your password?"/"Reset your password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\AdminUi\Notifier\PasswordReset` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\FormBuilder\Notifications\`
`FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form email notification field](customize_email_notifications.md)
— `actito`, `email` | +| [`Ibexa\Contracts\OrderManagement\Notification\`
`OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\Payment\Notification\`
`PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\Shipping\Notification\`
`ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\User\Notification\`
`UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite` alias `ibexa.user.invite_user`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\User\Notification\`
`UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\User\PasswordReset\Notifier` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\User\Notification\`
`UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` (alias `ibexa.user.register`) and `/from-invite/register` (alias `ibexa.user.from_invite.register`) | Registered user
— `actito`, `email` | +| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
alias `ibexa_content_edit_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has edit scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | +| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
alias `ibexa_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | +| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
alias `ibexa_external_participant_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses
— `actito`, `email`, `ibexa` | Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users. Same for the two `UserPasswordReset` in distinct namespaces. The back office `UserPasswordReset` notification is sent by a dedicated implementation of the notifier used by the controller. +Are listed the channels needing a specific support. +Other channels can be used, see the ones accepting any notification types in [Available notification channels' table](#available-notification-channels) + ### Available notification channels You can list the notification channel services with the following command: @@ -62,14 +65,20 @@ You can list the notification channel services with the following command: php bin/console debug:container --tag=notifier.channel ``` -- `actito` - Notification forwarded as [transactional email](transactional_emails.md) -- `browser` - Notification forwarded as [flash message]([[= symfony_doc =]]/session.html#flash-messages) -- [`chat`]([[= symfony_doc =]]/notifier.html#chat-channel) - Notification forwarded to a communication platform like Slack, Microsoft Teams, or Google Chat -- [`desktop`]([[= symfony_doc =]]/notifier.html#desktop-channel) - Notification forwarded to desktop applications like JoliNotif -- [`email`]([[= symfony_doc =]]/notifier.html#email-channel) - Notification forwarded to email addresses -- `ibexa` - Notification forwarded as [back office user notifications](notifications.md#user-notifications) -- [`push`]([[= symfony_doc =]]/notifier.html#push-channel) - Notification forwarded to specific applications -- [`sms`]([[= symfony_doc =]]/notifier.html#sms-channel) - Notification forwarded to phone numbers +- Some channels don't accept the notification if it doesn't implement their specific notification interface. + These interfaces come with a method to specifically format the notification for the channel. +- Some channels accept every notification and have a default formatting if the notification doesn't implement their specific notification interface. + +| Channel | Description | Specific notification interface | Accepts any notification object | +|:---------------------------------------------------------------|-------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------| +| `actito` | Notification forwarded as [transactional email](transactional_emails.md) | `Symfony\Component\Notifier\Notification\`
`EmailNotificationInterface` | **No** | +| [`chat`]([[= symfony_doc =]]/notifier.html#chat-channel) | Notification forwarded to a communication platform like Slack, Microsoft Teams, or Google Chat | `Symfony\Component\Notifier\Notification\`
`ChatNotificationInterface` | Yes | +| [`desktop`]([[= symfony_doc =]]/notifier.html#desktop-channel) | Notification forwarded to desktop applications like JoliNotif | `Symfony\Component\Notifier\Notification\`
`DesktopNotificationInterface` | Yes | +| [`email`]([[= symfony_doc =]]/notifier.html#email-channel) | Notification forwarded to email addresses | `Symfony\Component\Notifier\Notification\`
`EmailNotificationInterface` | **No** | +| `ibexa` | Notification forwarded as [back office user notifications](notifications.md#user-notifications) | [`Ibexa\Contracts\Notifications\`
`SystemNotification\SystemNotificationInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotificationInterface.html) | **No** | +| [`push`]([[= symfony_doc =]]/notifier.html#push-channel) | Notification forwarded to specific applications | `Symfony\Component\Notifier\Notification\`
`PushNotificationInterface` | Yes | +| [`sms`]([[= symfony_doc =]]/notifier.html#sms-channel) | Notification forwarded to phone numbers | `Symfony\Component\Notifier\Notification\`
`SmsNotificationInterface` | **No** | + ### Subscriptions configuration @@ -185,20 +194,7 @@ The following example shows how you can deliver notifications about Commerce-rel You can define a new notification type and assign a new set of channels to it, customizing how it's delivered. It must extend the `Symfony\Component\Notifier\Notification\Notification` class and can optionally implement interfaces required by specific channels. - -- Some channels don't accept the notification if it doesn't implement their specific notification interface. - These interfaces come with a method to specifically format the notification for the channel. -- Some channels accept every notification and have a default formatting if the notification doesn't implement their specific notification interface. - -| Channel | Specific notification interface | Accepts any notification object | -|:----------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------| -| `actito` | `Symfony\Component\Notifier\Notification\EmailNotificationInterface` | **No** | -| `chat` | `Symfony\Component\Notifier\Notification\ChatNotificationInterface` | Yes | -| `desktop` | `Symfony\Component\Notifier\Notification\DesktopNotificationInterface` | Yes | -| `email` | `Symfony\Component\Notifier\Notification\EmailNotificationInterface` | **No** | -| `ibexa` | [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotificationInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotificationInterface.html) | **No** | -| `push` | `Symfony\Component\Notifier\Notification\PushNotificationInterface` | Yes | -| `sms` | `Symfony\Component\Notifier\Notification\SmsNotificationInterface` | **No** | +See the table in [Available notifications channels](#available-notification-channels) for channel specific interfaces and channels accepting only theirs. The `ibexa` channel sends notifications to users through their profile menu, exactly as [user notifications](notifications.md#user-notifications). The [`SystemNotificationChannel` uses the core `NotificationService`](https://github.com/ibexa/notifications/blob/v5.0.7/src/lib/SystemNotification/SystemNotificationChannel.php#L51) to do so. From 03f3a4edbefb84b0271c77a7089f2da3ecb23d8b Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 15:52:51 +0200 Subject: [PATCH 18/24] notification_channels.md: Fine tune English --- docs/api/notification_channels.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 7356d72ac4..2525165b2d 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -51,11 +51,11 @@ They are sent by various notifiers like event subscribers, controllers or form p | `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
alias `ibexa_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | | `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
alias `ibexa_external_participant_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses
— `actito`, `email`, `ibexa` | -Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` are sent by the back office and don't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front end users. +Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` is sent by the back office and doesn't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front-end users. Same for the two `UserPasswordReset` in distinct namespaces. The back office `UserPasswordReset` notification is sent by a dedicated implementation of the notifier used by the controller. -Are listed the channels needing a specific support. -Other channels can be used, see the ones accepting any notification types in [Available notification channels' table](#available-notification-channels) +The supported channels listed are the channels needing a specific support. +Other channels can also be used. See the channel that accept any notification types in the [Available notification channels](#available-notification-channels) table. ### Available notification channels @@ -140,7 +140,7 @@ This page contains several examples of subscriptions configuration. } ``` - While, the following command return the subscribtions for the default siteaccess. + The following command returns the subscriptions for the default siteaccess. On a fresh installation, it returns the subscriptions of the `site` siteaccess. ```bash @@ -194,7 +194,7 @@ The following example shows how you can deliver notifications about Commerce-rel You can define a new notification type and assign a new set of channels to it, customizing how it's delivered. It must extend the `Symfony\Component\Notifier\Notification\Notification` class and can optionally implement interfaces required by specific channels. -See the table in [Available notifications channels](#available-notification-channels) for channel specific interfaces and channels accepting only theirs. +See the [Available notification channels](#available-notification-channels) table for channel-specific interfaces and channels that accept only their own interface. The `ibexa` channel sends notifications to users through their profile menu, exactly as [user notifications](notifications.md#user-notifications). The [`SystemNotificationChannel` uses the core `NotificationService`](https://github.com/ibexa/notifications/blob/v5.0.7/src/lib/SystemNotification/SystemNotificationChannel.php#L51) to do so. From d227bef20d4368f20594ad12ababe5c731275b64 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 15:56:02 +0200 Subject: [PATCH 19/24] notification_channels.md: Fine tune English --- docs/api/notification_channels.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 2525165b2d..cd9818de49 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -84,6 +84,8 @@ php bin/console debug:container --tag=notifier.channel You can find the default configuration in `config/packages/ibexa.yaml` and `config/packages/ibexa_admin_ui.yaml`. You can modify it to define your own subscriptions. +Some channels might not accept every notification type. +See the [Available notification channels](#available-notification-channels) table for channels that accept only their own interface. This page contains several examples of subscriptions configuration. !!! caution "Scopes may not merge as expected" From 99b0cffd35652779a3304c288f663c633a060502 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 15:58:40 +0200 Subject: [PATCH 20/24] notification_channels.md: Fix code highlight --- docs/api/notification_channels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index cd9818de49..9161d8b6d0 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -225,7 +225,7 @@ The [`…\Service\NotificationServiceInterface::send()`](/api/php_api/php_api_re For example, to send a notification, you often use a combination like the following: -``` php hl_lines="11-14" +``` php hl_lines="13-16" [[= include_code('code_samples/api/notifications/notification_send.php', 2) =]] ``` From e5677c6dc5962d5c3233d0e0bc507b0df0676d7a Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 16:11:17 +0200 Subject: [PATCH 21/24] notification_channels.md: remove route aliases --- docs/api/notification_channels.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 9161d8b6d0..3dfdfab472 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -36,20 +36,20 @@ Some events generate notifications that you can deliver to the users through one Several built-in notification types are available. They are sent by various notifiers like event subscribers, controllers or form processors. -| Notification type | Sent | Default recipients
— supported channels | -|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------| -| `Ibexa\AdminUi\Notifier\Notification\`
`UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (`/user/invite/to-group/{userGroupId}` alias `ibexa.user.invite.to_group`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | -| `Ibexa\AdminUi\Notifier\Notification\`
`UserPasswordReset` | from the back office "Forgot your password?"/"Reset your password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\AdminUi\Notifier\PasswordReset` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address
— `actito`, `email` | -| [`Ibexa\Contracts\FormBuilder\Notifications\`
`FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form email notification field](customize_email_notifications.md)
— `actito`, `email` | -| [`Ibexa\Contracts\OrderManagement\Notification\`
`OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner
— `actito`, `email`, `sms` | -| [`Ibexa\Contracts\Payment\Notification\`
`PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner
— `actito`, `email`, `sms` | -| [`Ibexa\Contracts\Shipping\Notification\`
`ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner
— `actito`, `email`, `sms` | -| [`Ibexa\Contracts\User\Notification\`
`UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite` alias `ibexa.user.invite_user`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | -| [`Ibexa\Contracts\User\Notification\`
`UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password` alias `ibexa.user.forgot_password`) by `Ibexa\User\PasswordReset\Notifier` implementing [`Ibexa\Contracts\User\PasswordReset\NotifierInterface`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-PasswordReset-NotifierInterface.html) | Given email address
— `actito`, `email` | -| [`Ibexa\Contracts\User\Notification\`
`UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` (alias `ibexa.user.register`) and `/from-invite/register` (alias `ibexa.user.from_invite.register`) | Registered user
— `actito`, `email` | -| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
alias `ibexa_content_edit_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has edit scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | -| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
alias `ibexa_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | -| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
alias `ibexa_external_participant_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses
— `actito`, `email`, `ibexa` | +| Notification type | Sent | Default recipients
— supported channels | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------| +| `Ibexa\AdminUi\Notifier\Notification\`
`UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | +| `Ibexa\AdminUi\Notifier\Notification\`
`UserPasswordReset` | from the back office "Forgot your password?" feature form (`/user/forgot-password`) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\FormBuilder\Notifications\`
`FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form email notification field](customize_email_notifications.md)
— `actito`, `email` | +| [`Ibexa\Contracts\OrderManagement\Notification\`
`OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\Payment\Notification\`
`PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\Shipping\Notification\`
`ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\User\Notification\`
`UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\User\Notification\`
`UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password`) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\User\Notification\`
`UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` and `/from-invite/register` | Registered user
— `actito`, `email` | +| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
alias `ibexa_content_edit_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has edit scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | +| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
alias `ibexa_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | +| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
alias `ibexa_external_participant_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses
— `actito`, `email`, `ibexa` | Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` is sent by the back office and doesn't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front-end users. Same for the two `UserPasswordReset` in distinct namespaces. The back office `UserPasswordReset` notification is sent by a dedicated implementation of the notifier used by the controller. From 7b62b17e6600d4a5eaff02402c4880bcea5b964a Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 16:14:07 +0200 Subject: [PATCH 22/24] notification_channels.md: simplify --- docs/api/notification_channels.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index 3dfdfab472..f29e8c25a2 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -36,20 +36,20 @@ Some events generate notifications that you can deliver to the users through one Several built-in notification types are available. They are sent by various notifiers like event subscribers, controllers or form processors. -| Notification type | Sent | Default recipients
— supported channels | -|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------| -| `Ibexa\AdminUi\Notifier\Notification\`
`UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | -| `Ibexa\AdminUi\Notifier\Notification\`
`UserPasswordReset` | from the back office "Forgot your password?" feature form (`/user/forgot-password`) | Given email address
— `actito`, `email` | -| [`Ibexa\Contracts\FormBuilder\Notifications\`
`FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form email notification field](customize_email_notifications.md)
— `actito`, `email` | -| [`Ibexa\Contracts\OrderManagement\Notification\`
`OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner
— `actito`, `email`, `sms` | -| [`Ibexa\Contracts\Payment\Notification\`
`PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner
— `actito`, `email`, `sms` | -| [`Ibexa\Contracts\Shipping\Notification\`
`ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner
— `actito`, `email`, `sms` | -| [`Ibexa\Contracts\User\Notification\`
`UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | -| [`Ibexa\Contracts\User\Notification\`
`UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password`) | Given email address
— `actito`, `email` | -| [`Ibexa\Contracts\User\Notification\`
`UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` and `/from-invite/register` | Registered user
— `actito`, `email` | -| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
alias `ibexa_content_edit_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has edit scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | -| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
alias `ibexa_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is internal and has view scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | -| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
alias `ibexa_external_participant_content_view_invitation` | on [`InvitationServiceInterface::createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods) use, when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses
— `actito`, `email`, `ibexa` | +| Notification type | Sent | Default recipients
— supported channels | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------| +| `Ibexa\AdminUi\Notifier\Notification\`
`UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | +| `Ibexa\AdminUi\Notifier\Notification\`
`UserPasswordReset` | from the back office "Forgot your password?" feature form (`/user/forgot-password`) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\FormBuilder\Notifications\`
`FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form email notification field](customize_email_notifications.md)
— `actito`, `email` | +| [`Ibexa\Contracts\OrderManagement\Notification\`
`OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\Payment\Notification\`
`PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\Shipping\Notification\`
`ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\User\Notification\`
`UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\User\Notification\`
`UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password`) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\User\Notification\`
`UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` and `/from-invite/register` | Registered user
— `actito`, `email` | +| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
alias `ibexa_content_edit_invitation` | on [`createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods), when participant is internal and has "edit" scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | +| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
alias `ibexa_content_view_invitation` | on [`createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods), when participant is internal and has "view" scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | +| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
alias `ibexa_external_participant_content_view_invitation` | on [`createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods), when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses
— `actito`, `email`, `ibexa` | Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` is sent by the back office and doesn't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front-end users. Same for the two `UserPasswordReset` in distinct namespaces. The back office `UserPasswordReset` notification is sent by a dedicated implementation of the notifier used by the controller. From d63510e81ffd0328cb8fb58f59fae0f8dc6224f0 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 16:14:33 +0200 Subject: [PATCH 23/24] notification_channels.md: fix parenthesis --- docs/api/notification_channels.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/api/notification_channels.md b/docs/api/notification_channels.md index f29e8c25a2..65bef641e7 100644 --- a/docs/api/notification_channels.md +++ b/docs/api/notification_channels.md @@ -36,20 +36,20 @@ Some events generate notifications that you can deliver to the users through one Several built-in notification types are available. They are sent by various notifiers like event subscribers, controllers or form processors. -| Notification type | Sent | Default recipients
— supported channels | -|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------| -| `Ibexa\AdminUi\Notifier\Notification\`
`UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | -| `Ibexa\AdminUi\Notifier\Notification\`
`UserPasswordReset` | from the back office "Forgot your password?" feature form (`/user/forgot-password`) | Given email address
— `actito`, `email` | -| [`Ibexa\Contracts\FormBuilder\Notifications\`
`FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form email notification field](customize_email_notifications.md)
— `actito`, `email` | -| [`Ibexa\Contracts\OrderManagement\Notification\`
`OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner
— `actito`, `email`, `sms` | -| [`Ibexa\Contracts\Payment\Notification\`
`PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner
— `actito`, `email`, `sms` | -| [`Ibexa\Contracts\Shipping\Notification\`
`ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner
— `actito`, `email`, `sms` | -| [`Ibexa\Contracts\User\Notification\`
`UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | -| [`Ibexa\Contracts\User\Notification\`
`UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password`) | Given email address
— `actito`, `email` | -| [`Ibexa\Contracts\User\Notification\`
`UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` and `/from-invite/register` | Registered user
— `actito`, `email` | -| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
alias `ibexa_content_edit_invitation` | on [`createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods), when participant is internal and has "edit" scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | -| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
alias `ibexa_content_view_invitation` | on [`createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods), when participant is internal and has "view" scope (see [Collaborative editing API](collaborative_editing_api.md) | Given users
— `actito`, `email`, `ibexa` | -| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
alias `ibexa_external_participant_content_view_invitation` | on [`createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods), when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md) | Given email addresses
— `actito`, `email`, `ibexa` | +| Notification type | Sent | Default recipients
— supported channels | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------| +| `Ibexa\AdminUi\Notifier\Notification\`
`UserInvitation` | from the [back office invitation form]([[= user_doc =]]/user_management/manage_users/#invite-users) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | +| `Ibexa\AdminUi\Notifier\Notification\`
`UserPasswordReset` | from the back office "Forgot your password?" feature form (`/user/forgot-password`) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\FormBuilder\Notifications\`
`FormSubmitted`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-FormBuilder-Notifications-FormSubmitted.html) | on submission | [Form email notification field](customize_email_notifications.md)
— `actito`, `email` | +| [`Ibexa\Contracts\OrderManagement\Notification\`
`OrderStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Notification-OrderStatusChange.html) | on [new order creation](/api/php_api/php_api_reference/classes/Ibexa-Contracts-OrderManagement-Event-CreateOrderEvent.html), and when an order entered a [order workflow place](configure_order_management.md#configure-order-processing-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\Payment\Notification\`
`PaymentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Payment-Notification-PaymentStatusChange.html) | when a payment entered a [payment workflow place](configure_payment.md#configure-payment-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\Shipping\Notification\`
`ShipmentStatusChange`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Shipping-Notification-ShipmentStatusChange.html) | when a shipment entered a [shipment workflow place](configure_shipment.md#configure-shipment-workflow) | Order owner
— `actito`, `email`, `sms` | +| [`Ibexa\Contracts\User\Notification\`
`UserInvitation`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserInvitation.html) | from the front office invitation form (`/user/invite`) (notice that [the `InvitationService` doesn't send this notification](invitations.md#creating-and-sending-invitations)) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\User\Notification\`
`UserPasswordReset`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserPasswordReset.html) | from the front office "Forgot password" feature (`/user/forgot-password`) | Given email address
— `actito`, `email` | +| [`Ibexa\Contracts\User\Notification\`
`UserRegister`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-User-Notification-UserRegister.html) | from self-registration forms `/register` and `/from-invite/register` | Registered user
— `actito`, `email` | +| `Ibexa\Share\Notification\`
`ContentEditInvitationNotification`
alias `ibexa_content_edit_invitation` | on [`createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods), when participant is internal and has "edit" scope (see [Collaborative editing API](collaborative_editing_api.md)) | Given users
— `actito`, `email`, `ibexa` | +| `Ibexa\Share\Notification\`
`ContentViewInvitationNotification`
alias `ibexa_content_view_invitation` | on [`createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods), when participant is internal and has "view" scope (see [Collaborative editing API](collaborative_editing_api.md)) | Given users
— `actito`, `email`, `ibexa` | +| `Ibexa\Share\Notification\`
`ExternalParticipantContentViewInvitationNotification`
alias `ibexa_external_participant_content_view_invitation` | on [`createInvitation()`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-InvitationServiceInterface.html#methods), when participant is external, whatever the scope (see [Collaborative editing API](collaborative_editing_api.md)) | Given email addresses
— `actito`, `email`, `ibexa` | Notice that `Ibexa\AdminUi\Notifier\Notification\UserInvitation` is sent by the back office and doesn't implement `Ibexa\Contracts\User\Notification\UserInvitation` which is made for front-end users. Same for the two `UserPasswordReset` in distinct namespaces. The back office `UserPasswordReset` notification is sent by a dedicated implementation of the notifier used by the controller. From 7cfd18564fffc29f93a0f75cd40589670795a57e Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 2 Sep 2026 16:42:34 +0200 Subject: [PATCH 24/24] Apply suggestion from @adriendupuis --- .../collaborative_editing/collaborative_editing_api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content_management/collaborative_editing/collaborative_editing_api.md b/docs/content_management/collaborative_editing/collaborative_editing_api.md index 004d166e26..b54c1c2a8b 100644 --- a/docs/content_management/collaborative_editing/collaborative_editing_api.md +++ b/docs/content_management/collaborative_editing/collaborative_editing_api.md @@ -72,7 +72,7 @@ You can add participant to the collaboration session with [`SessionService::addP [[= include_code('code_samples/collaboration/src/Command/ManageSessionsCommand.php', 81, 93, remove_indent=True) =]] ``` -Participants can be internal (based on an existing user) or external ( on an email address): +Participants can be internal (based on an existing user) or external (on an email address): [`InternalParticipantCreateStruct`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Participant-InternalParticipantCreateStruct.html#properties) [`ExternalParticipantCreateStruct`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-Participant-ExternalParticipantCreateStruct.html#properties)