From bb19ce647cc0c48e129ebbebe33596abce07b16a Mon Sep 17 00:00:00 2001
From: julitafalcondusza <117284672+julitafalcondusza@users.noreply.github.com>
Date: Tue, 17 Mar 2026 11:43:45 +0100
Subject: [PATCH 01/17] IBX-11083: Extending collaboration described in
Developer Documentation (#3055)
* extending collaboration described in dev-doc
* PHP & JS CS Fixes
* Trigger CI
* fixes
* PHP & JS CS Fixes
* card added
* fixes after dev-rev
* [PHPStan] Fixed reported errors
* IBX-11083: Add missing code, fix code (#3078)
* Add services.yaml and Mapper.php
* Move SQL to files
* Remove copyright for sharability
* Rector
* collaboration_search_reference: Fix highlights
* collaboration/config/services.yaml: Fixes
* collaboration/config/services.yaml: Format
* Move template to storefront theme
standard/cart/view.html.twig is always overridden by storefront/cart/view.html.twig from the bundle
As the template depends on and extends the storefront theme, they're part of it.
* Redesign share.html.twig for storefront
* Simplify cart/view.html.twig
* Redesign share_result.html.twig for storefront
* screenshots added
* screenshots added
* fixes
* small fixes
---------
Co-authored-by: julitafalcondusza
Co-authored-by: Tomasz Kryszan
Co-authored-by: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com>
---
.../collaboration/config/services.yaml | 48 +++
.../ibexa_collaboration_cart.mysql.sql | 7 +
.../ibexa_collaboration_cart.postgresql.sql | 7 +
.../Cart/CartResolverDecorator.php | 51 +++
.../src/Collaboration/Cart/CartSession.php | 31 ++
.../Cart/CartSessionCreateStruct.php | 29 ++
.../Collaboration/Cart/CartSessionType.php | 36 ++
.../Cart/CartSessionUpdateStruct.php | 13 +
.../Cart/Mapper/CartProxyMapper.php | 37 ++
.../Cart/Mapper/CartProxyMapperInterface.php | 10 +
.../Cart/Mapper/CartSessionDomainMapper.php | 43 +++
.../Mapper/CartSessionPersistenceMapper.php | 51 +++
.../Cart/PermissionResolverDecorator.php | 94 +++++
.../Persistence/Gateway/DatabaseGateway.php | 71 ++++
.../Persistence/Gateway/DatabaseSchema.php | 16 +
.../Collaboration/Cart/Persistence/Mapper.php | 38 +++
.../Cart/Persistence/Values/CartSession.php | 27 ++
.../Values/CartSessionCreateStruct.php | 37 ++
.../Values/CartSessionUpdateStruct.php | 14 +
.../Controller/ShareCartCreateController.php | 78 +++++
.../Controller/ShareCartJoinController.php | 37 ++
.../src/Form/Data/ShareCartData.php | 21 ++
.../src/Form/Type/ShareCartType.php | 32 ++
.../collaboration/src/Query/Search.php | 3 +-
.../themes/storefront/cart/share.html.twig | 9 +
.../storefront/cart/share_result.html.twig | 10 +
.../themes/storefront/cart/view.html.twig | 8 +
.../collaborative_editing.md | 1 +
.../extend_collaborative_editing.md | 322 ++++++++++++++++++
.../img/share_button.png | Bin 0 -> 119888 bytes
.../collaborative_editing/img/share_email.png | Bin 0 -> 40921 bytes
.../img/share_message.png | Bin 0 -> 55147 bytes
.../collaboration_criteria.md | 2 +-
.../collaboration_sort_clauses.md | 2 +-
mkdocs.yml | 1 +
35 files changed, 1182 insertions(+), 4 deletions(-)
create mode 100644 code_samples/collaboration/config/services.yaml
create mode 100644 code_samples/collaboration/ibexa_collaboration_cart.mysql.sql
create mode 100644 code_samples/collaboration/ibexa_collaboration_cart.postgresql.sql
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/CartSession.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/CartSessionUpdateStruct.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapper.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapperInterface.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionDomainMapper.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseSchema.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/Persistence/Mapper.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSession.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php
create mode 100644 code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php
create mode 100644 code_samples/collaboration/src/Controller/ShareCartCreateController.php
create mode 100644 code_samples/collaboration/src/Controller/ShareCartJoinController.php
create mode 100644 code_samples/collaboration/src/Form/Data/ShareCartData.php
create mode 100644 code_samples/collaboration/src/Form/Type/ShareCartType.php
create mode 100644 code_samples/collaboration/templates/themes/storefront/cart/share.html.twig
create mode 100644 code_samples/collaboration/templates/themes/storefront/cart/share_result.html.twig
create mode 100644 code_samples/collaboration/templates/themes/storefront/cart/view.html.twig
create mode 100644 docs/content_management/collaborative_editing/extend_collaborative_editing.md
create mode 100644 docs/content_management/collaborative_editing/img/share_button.png
create mode 100644 docs/content_management/collaborative_editing/img/share_email.png
create mode 100644 docs/content_management/collaborative_editing/img/share_message.png
diff --git a/code_samples/collaboration/config/services.yaml b/code_samples/collaboration/config/services.yaml
new file mode 100644
index 0000000000..c6d81568ae
--- /dev/null
+++ b/code_samples/collaboration/config/services.yaml
@@ -0,0 +1,48 @@
+# This file is the entry point to configure your own services.
+# Files in the packages/ subdirectory configure your dependencies.
+
+# Put parameters here that don't need to change on each machine where the app is deployed
+# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration
+parameters:
+
+services:
+ # default configuration for services in *this* file
+ _defaults:
+ autowire: true # Automatically injects dependencies in your services.
+ autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
+
+ # makes classes in src/ available to be used as services
+ # this creates a service per class whose id is the fully-qualified class name
+ App\:
+ resource: '../src/'
+
+ # add more service definitions when explicit configuration is needed
+ # please note that last definitions always *replace* previous ones
+
+ App\Collaboration\Cart\Persistence\Gateway\DatabaseGateway:
+ arguments:
+ $connection: '@ibexa.persistence.connection'
+ tags:
+ - name: 'ibexa.collaboration.persistence.session.gateway'
+ discriminator: !php/const App\Collaboration\Cart\Persistence\Gateway\DatabaseGateway::DISCRIMINATOR
+
+ App\Collaboration\Cart\Persistence\Mapper:
+ tags:
+ - name: 'ibexa.collaboration.persistence.session.mapper'
+ discriminator: !php/const App\Collaboration\Cart\Persistence\Gateway\DatabaseGateway::DISCRIMINATOR
+
+ App\Collaboration\Cart\Mapper\CartSessionDomainMapper:
+ tags:
+ - name: 'ibexa.collaboration.service.session.domain.mapper'
+ type: App\Collaboration\Cart\Persistence\Values\CartSession
+
+ App\Collaboration\Cart\Mapper\CartSessionPersistenceMapper:
+ tags:
+ - name: 'ibexa.collaboration.service.session.persistence.mapper'
+ type: !php/const App\Collaboration\Cart\CartSessionType::IDENTIFIER
+
+ App\Collaboration\Cart\PermissionResolverDecorator:
+ decorates: Ibexa\Contracts\ProductCatalog\PermissionResolverInterface
+
+ App\Collaboration\Cart\CartResolverDecorator:
+ decorates: Ibexa\Contracts\Cart\CartResolverInterface
diff --git a/code_samples/collaboration/ibexa_collaboration_cart.mysql.sql b/code_samples/collaboration/ibexa_collaboration_cart.mysql.sql
new file mode 100644
index 0000000000..74b94b6a62
--- /dev/null
+++ b/code_samples/collaboration/ibexa_collaboration_cart.mysql.sql
@@ -0,0 +1,7 @@
+CREATE TABLE ibexa_collaboration_cart (
+ id INT NOT NULL PRIMARY KEY,
+ cart_identifier VARCHAR(255) NOT NULL,
+ CONSTRAINT ibexa_collaboration_cart_ibexa_collaboration_id_fk
+ FOREIGN KEY (id) REFERENCES ibexa_collaboration (id)
+ ON DELETE CASCADE
+) COLLATE = utf8mb4_general_ci;
diff --git a/code_samples/collaboration/ibexa_collaboration_cart.postgresql.sql b/code_samples/collaboration/ibexa_collaboration_cart.postgresql.sql
new file mode 100644
index 0000000000..a073132fca
--- /dev/null
+++ b/code_samples/collaboration/ibexa_collaboration_cart.postgresql.sql
@@ -0,0 +1,7 @@
+CREATE TABLE ibexa_collaboration_cart (
+ id INTEGER NOT NULL PRIMARY KEY,
+ cart_identifier VARCHAR(255) NOT NULL,
+ CONSTRAINT ibexa_collaboration_cart_ibexa_collaboration_id_fk
+ FOREIGN KEY (id) REFERENCES ibexa_collaboration (id)
+ ON DELETE CASCADE
+);
diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php b/code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php
new file mode 100644
index 0000000000..9bf359e4a9
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php
@@ -0,0 +1,51 @@
+hasSharedCart()) {
+ return $this->getSharedCart() ?? $this->innerCartResolver->resolveCart($user);
+ }
+
+ return $this->innerCartResolver->resolveCart($user);
+ }
+
+ private function getSharedCart(): ?CartInterface
+ {
+ try {
+ $session = $this->sessionService->getSessionByToken(
+ $this->requestStack->getSession()->get(PermissionResolverDecorator::COLLABORATION_SESSION_ID)
+ );
+
+ if (!$session instanceof CartSession) {
+ return null;
+ }
+
+ return $session->getCart();
+ } catch (NotFoundException|\Ibexa\ProductCatalog\Exception\UnauthorizedException) {
+ return null;
+ }
+ }
+
+ private function hasSharedCart(): bool
+ {
+ return $this->requestStack->getSession()->has(PermissionResolverDecorator::COLLABORATION_SESSION_ID);
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartSession.php b/code_samples/collaboration/src/Collaboration/Cart/CartSession.php
new file mode 100644
index 0000000000..dcacef4130
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/CartSession.php
@@ -0,0 +1,31 @@
+cart;
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php b/code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php
new file mode 100644
index 0000000000..9594b61cd7
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php
@@ -0,0 +1,29 @@
+cart;
+ }
+
+ public function setCart(CartInterface $cart): void
+ {
+ $this->cart = $cart;
+ }
+
+ public function getType(): string
+ {
+ return CartSessionType::IDENTIFIER;
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php b/code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php
new file mode 100644
index 0000000000..93c9ab3023
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php
@@ -0,0 +1,36 @@
+getScopes(), true);
+ }
+
+ public function getScopes(): array
+ {
+ return [
+ self::SCOPE_VIEW,
+ self::SCOPE_EDIT,
+ ];
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartSessionUpdateStruct.php b/code_samples/collaboration/src/Collaboration/Cart/CartSessionUpdateStruct.php
new file mode 100644
index 0000000000..ecf38e2f5e
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/CartSessionUpdateStruct.php
@@ -0,0 +1,13 @@
+repository->sudo(fn (): CartInterface => $this->cartService->getCart($identifier));
+
+ return true;
+ };
+
+ return $this->proxyGenerator->createProxy(CartInterface::class, $initializer);
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapperInterface.php b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapperInterface.php
new file mode 100644
index 0000000000..37f4bc18ed
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapperInterface.php
@@ -0,0 +1,10 @@
+
+ */
+final readonly class CartSessionDomainMapper implements SessionDomainMapperInterface
+{
+ public function __construct(
+ private CartProxyMapperInterface $cartProxyMapper,
+ private UserProxyDomainMapperInterface $userDomainMapper,
+ private ParticipantCollectionDomainMapperInterface $participantCollectionDomainMapper
+ ) {
+ }
+
+ /**
+ * @param \App\Collaboration\Cart\Persistence\Values\CartSession $data
+ */
+ public function fromPersistence(SessionData $data): SessionInterface
+ {
+ return new CartSession(
+ $data->getId(),
+ $this->cartProxyMapper->createCartProxy($data->getCartIdentifier()),
+ $data->getToken(),
+ $this->userDomainMapper->createUserProxy($data->getOwnerId()),
+ $this->participantCollectionDomainMapper->createParticipantCollectionProxy($data->getId()),
+ $data->isActive(),
+ $data->hasPublicLink(),
+ $data->getCreatedAt(),
+ $data->getUpdatedAt(),
+ );
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php
new file mode 100644
index 0000000000..380ecf6b06
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php
@@ -0,0 +1,51 @@
+getToken();
+ $owner = $createStruct->getOwner();
+ $hasPublicLink = $createStruct->hasPublicLink();
+
+ assert($token !== null);
+ assert($owner !== null);
+ assert($hasPublicLink !== null);
+
+ return new CartSessionCreateStruct(
+ $token,
+ $createStruct->getCart()->getIdentifier(),
+ $owner->getUserId(),
+ $createStruct->isActive(),
+ $hasPublicLink,
+ new \DateTimeImmutable(),
+ new \DateTimeImmutable()
+ );
+ }
+
+ public function toPersistenceUpdateStruct(
+ SessionInterface $session,
+ SessionUpdateStruct $updateStruct
+ ): PersistenceSessionUpdateStruct {
+ return new CartSessionUpdateStruct(
+ $session->getId(),
+ $updateStruct->getToken(),
+ ($updateStruct->getOwner() ?? $session->getOwner())->getUserId()
+ );
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php b/code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php
new file mode 100644
index 0000000000..8aba2621ec
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php
@@ -0,0 +1,94 @@
+getObject();
+ if ($this->nested === false && $this->isCartPolicy($policy) && $object instanceof CartInterface && $this->isSharedCart($object)) {
+ return true;
+ }
+
+ return $this->innerPermissionResolver->canUser($policy);
+ }
+
+ public function assertPolicy(PolicyInterface $policy): void
+ {
+ $object = $policy->getObject();
+ if ($this->nested === false && $this->isCartPolicy($policy) && $object instanceof CartInterface && $this->isSharedCart($object)) {
+ return;
+ }
+
+ $this->innerPermissionResolver->assertPolicy($policy);
+ }
+
+ private function isCartPolicy(PolicyInterface $policy): bool
+ {
+ return $policy instanceof CartView || $policy instanceof CartEdit;
+ }
+
+ private function isSharedCart(?CartInterface $cart): bool
+ {
+ if ($cart === null) {
+ return false;
+ }
+
+ try {
+ $this->nested = true;
+
+ /** @var \App\Collaboration\Cart\CartSession $session */
+ $session = $this->getCurrentCartCollaborationSession();
+ if ($session !== null) {
+ try {
+ return $cart->getId() === $session->getCart()->getId();
+ } catch (NotFoundException) {
+ }
+ }
+ } finally {
+ $this->nested = false;
+ }
+
+ return false;
+ }
+
+ private function getCurrentCartCollaborationSession(): ?CartSession
+ {
+ $token = $this->requestStack->getSession()->get(self::COLLABORATION_SESSION_ID);
+ if ($token === null) {
+ return null;
+ }
+
+ try {
+ $session = $this->sessionService->getSessionByToken($token);
+ if ($session instanceof CartSession) {
+ return $session;
+ }
+ } catch (NotFoundException|UnauthorizedException) {
+ }
+
+ return null;
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php
new file mode 100644
index 0000000000..8ecca9a74b
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php
@@ -0,0 +1,71 @@
+
+ *
+ * @template-implements \Ibexa\Collaboration\Persistence\Session\Inner\GatewayInterface
+ */
+final class DatabaseGateway extends AbstractDoctrineDatabase implements GatewayInterface
+{
+ public const string DISCRIMINATOR = 'cart';
+
+ protected function buildMetadata(): DoctrineSchemaMetadataInterface
+ {
+ return new DoctrineSchemaMetadata(
+ $this->connection,
+ null,
+ $this->getTableName(),
+ [
+ DatabaseSchema::COLUMN_ID => Types::INTEGER,
+ DatabaseSchema::COLUMN_CART_IDENTIFIER => Types::STRING,
+ ],
+ [DatabaseSchema::COLUMN_ID]
+ );
+ }
+
+ protected function getTableName(): string
+ {
+ return DatabaseSchema::TABLE_NAME;
+ }
+
+ public function getDiscriminator(): string
+ {
+ return self::DISCRIMINATOR;
+ }
+
+ /**
+ * @param \App\Collaboration\Cart\Persistence\Values\CartSessionCreateStruct $createStruct
+ */
+ public function create(int $sessionId, AbstractSessionCreateStruct $createStruct): void
+ {
+ $this->doInsert([
+ DatabaseSchema::COLUMN_ID => $sessionId,
+ DatabaseSchema::COLUMN_CART_IDENTIFIER => $createStruct->getCartIdentifier(),
+ ]);
+ }
+
+ /**
+ * @param \Ibexa\Collaboration\Persistence\Values\AbstractSessionUpdateStruct $updateStruct
+ */
+ public function update(AbstractSessionUpdateStruct $updateStruct): void
+ {
+ // There is nothing to update
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseSchema.php b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseSchema.php
new file mode 100644
index 0000000000..87a556f269
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseSchema.php
@@ -0,0 +1,16 @@
+
+ */
+final class Mapper implements MapperInterface
+{
+ public function extractFromRow(array $row): AbstractSession
+ {
+ return new CartSession(
+ $row['id'],
+ $row['cart_cart_identifier'],
+ $row['token'],
+ $row['owner_id'],
+ $row['is_active'],
+ $row['has_public_link'],
+ $row['created_at'],
+ $row['updated_at']
+ );
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSession.php b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSession.php
new file mode 100644
index 0000000000..dd58482adf
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSession.php
@@ -0,0 +1,27 @@
+cartIdentifier;
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php
new file mode 100644
index 0000000000..875dc6a87a
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php
@@ -0,0 +1,37 @@
+cartIdentifier;
+ }
+
+ public function setCartIdentifier(string $cartIdentifier): void
+ {
+ $this->cartIdentifier = $cartIdentifier;
+ }
+
+ public function getDiscriminator(): string
+ {
+ return CartSessionType::IDENTIFIER;
+ }
+}
diff --git a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php
new file mode 100644
index 0000000000..471a5f7fbd
--- /dev/null
+++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php
@@ -0,0 +1,14 @@
+createForm(
+ ShareCartType::class,
+ null,
+ [
+ 'method' => 'POST',
+ ]
+ );
+
+ $form->handleRequest($request);
+ if ($form->isSubmitted() && $form->isValid()) {
+ /** @var \App\Form\Data\ShareCartData $data */
+ $data = $form->getData();
+
+ // Handle the form submission
+ $cart = $this->cartResolver->resolveCart();
+
+ $session = $this->sessionService->createSession(
+ new CartSessionCreateStruct($cart)
+ );
+
+ $email = $data->getEmail();
+ if ($email === null) {
+ throw new InvalidArgumentException('Email cannot be null');
+ }
+
+ $this->sessionService->addParticipant(
+ $session,
+ new ExternalParticipantCreateStruct(
+ $email,
+ CartSessionType::SCOPE_EDIT
+ )
+ );
+
+ return $this->render(
+ '@ibexadesign/cart/share_result.html.twig',
+ [
+ 'session' => $session,
+ ]
+ );
+ }
+
+ return $this->render(
+ '@ibexadesign/cart/share.html.twig',
+ [
+ 'form' => $form->createView(),
+ ]
+ );
+ }
+}
diff --git a/code_samples/collaboration/src/Controller/ShareCartJoinController.php b/code_samples/collaboration/src/Controller/ShareCartJoinController.php
new file mode 100644
index 0000000000..4c9ecc209b
--- /dev/null
+++ b/code_samples/collaboration/src/Controller/ShareCartJoinController.php
@@ -0,0 +1,37 @@
+sessionService->getSessionByToken($token);
+ if ($session instanceof CartSession) {
+ $request->getSession()->set(self::CURRENT_COLLABORATION_SESSION, $session->getToken());
+
+ return $this->redirectToRoute('ibexa.cart.view', [
+ 'identifier' => $session->getCart()->getIdentifier(),
+ ]);
+ }
+
+ throw $this->createAccessDeniedException();
+ }
+}
diff --git a/code_samples/collaboration/src/Form/Data/ShareCartData.php b/code_samples/collaboration/src/Form/Data/ShareCartData.php
new file mode 100644
index 0000000000..37c2e0cc2c
--- /dev/null
+++ b/code_samples/collaboration/src/Form/Data/ShareCartData.php
@@ -0,0 +1,21 @@
+email;
+ }
+
+ public function setEmail(?string $email): void
+ {
+ $this->email = $email;
+ }
+}
diff --git a/code_samples/collaboration/src/Form/Type/ShareCartType.php b/code_samples/collaboration/src/Form/Type/ShareCartType.php
new file mode 100644
index 0000000000..86f2369bcb
--- /dev/null
+++ b/code_samples/collaboration/src/Form/Type/ShareCartType.php
@@ -0,0 +1,32 @@
+
+ */
+final class ShareCartType extends AbstractType
+{
+ public function buildForm(FormBuilderInterface $builder, array $options): void
+ {
+ $builder->add('email', EmailType::class, [
+ 'label' => 'E-mail',
+ ])->add('submit', SubmitType::class, [
+ 'label' => 'Share',
+ ]);
+ }
+
+ public function configureOptions(OptionsResolver $resolver): void
+ {
+ $resolver->setDefaults([
+ 'data_class' => ShareCartData::class,
+ ]);
+ }
+}
diff --git a/code_samples/collaboration/src/Query/Search.php b/code_samples/collaboration/src/Query/Search.php
index 71cea24df5..b4f7dfbabc 100644
--- a/code_samples/collaboration/src/Query/Search.php
+++ b/code_samples/collaboration/src/Query/Search.php
@@ -1,5 +1,4 @@
-
+ Cart has been shared successfully! Link to session:
+
+ {{ url('app.shared_cart.join', { token: session.getToken() }) }}
+
+
+{% endblock %}
diff --git a/code_samples/collaboration/templates/themes/storefront/cart/view.html.twig b/code_samples/collaboration/templates/themes/storefront/cart/view.html.twig
new file mode 100644
index 0000000000..922e21be24
--- /dev/null
+++ b/code_samples/collaboration/templates/themes/storefront/cart/view.html.twig
@@ -0,0 +1,8 @@
+{% extends '@IbexaStorefront/themes/storefront/cart/view.html.twig' %}
+
+{% block content %}
+
+ {{ parent() }}
+{% endblock %}
diff --git a/docs/content_management/collaborative_editing/collaborative_editing.md b/docs/content_management/collaborative_editing/collaborative_editing.md
index 82ae11d13c..6655fc390e 100644
--- a/docs/content_management/collaborative_editing/collaborative_editing.md
+++ b/docs/content_management/collaborative_editing/collaborative_editing.md
@@ -32,6 +32,7 @@ This feature also introduces new dashboard tabs for managing shared drafts and j
"content_management/collaborative_editing/collaborative_editing_api",
"api/event_reference/collaboration_events",
("https://doc.ibexa.co/en/4.6/api/rest_api/rest_api_reference/rest_api_reference.html#collaborative-editing", "REST API Reference", "See the available endpoints for Collaborative editing"),
+"content_management/collaborative_editing/extend_collaborative_editing",
"search/collaboration_search_reference/collaboration_criteria",
"search/collaboration_search_reference/collaboration_sort_clauses",
], columns=4) =]]
diff --git a/docs/content_management/collaborative_editing/extend_collaborative_editing.md b/docs/content_management/collaborative_editing/extend_collaborative_editing.md
new file mode 100644
index 0000000000..08e62990fa
--- /dev/null
+++ b/docs/content_management/collaborative_editing/extend_collaborative_editing.md
@@ -0,0 +1,322 @@
+---
+description: Extend Collaborative editing
+month_change: true
+---
+
+# Extend Collaborative editing
+
+Thanks to the ability to extend the [Collaborative editing](collaborative_editing_guide.md) feature, you can introduce additional functionalities to enhance workflows not only in the context of content editing but also when working with products.
+The example below demonstrates how to extend the feature to enable a shared Cart functionality in the Commerce system.
+
+!!! tip
+
+ If you prefer learning from videos, watch the Ibexa Summit 2025 presentation that covers the Collaborative editing feature:
+
+ [_Collaboration: greater than the sum of the parts_](https://www.youtube.com/watch?v=dRB-SDlgX0I) by Marek Nocoń
+
+## Create tables to hold Cart session data
+
+First, set up the database layer and define the collaboration context, in this example, Cart.
+Create the necessary tables to store the data and to link the collaboration session with the Cart you want to share.
+
+In the `data/schema.sql` file, create a database table to store a reference to the session context.
+In this example, the context is a shopping Cart, identified by `cart_identifier` and linked to the collaboration session through the Cart’s numeric ID stored in the database.
+
+=== "MySQL"
+
+ ``` sql
+ [[= include_file('code_samples/collaboration/ibexa_collaboration_cart.mysql.sql', 0, None, ' ') =]]
+ ```
+
+=== "PostgreSQL"
+
+ ``` sql
+ [[= include_file('code_samples/collaboration/ibexa_collaboration_cart.postgresql.sql', 0, None, ' ') =]]
+ ```
+
+## Set up persistence layer
+
+Now you need to prepare the persistence layer, which is responsible for storing, retrieving, and managing collaboration session and Cart data in the database.
+
+It ensures that when a user creates, joins, or updates a Cart session, the system can track session status, participants, and permissions.
+
+### Implement persistence gateway
+
+The Gateway is the layer that connects the collaboration feature to the database.
+It handles all the create, read, update, and delete operations for collaboration sessions, ensuring that session data is stored and retrieved correctly.
+
+It also uses a Discriminator to specify the session type.
+Based on the type, the Gateway interacts with the appropriate tables and data structures.
+This way, the system uses the correct Gateway to get or save data for each session type.
+
+When creating the Database Gateways and mappers, you can use the built-in service tag:
+
+- `ibexa.collaboration.persistence.session.gateway` - for the database gateway:
+
+ ```yaml
+ tags:
+ - { name: 'ibexa.collaboration.persistence.session.gateway', discriminator: 'my_session_type' }
+ ```
+
+- `ibexa.collaboration.persistence.session.mapper` - for the mapper that creates a session from a persistence raw row:
+
+ ```yaml
+ tags:
+ - { name: 'ibexa.collaboration.persistence.session.mapper', discriminator: 'my_session_type' }
+ ```
+
+- `ibexa.collaboration.service.session.domain.mapper` - for the mapper that creates a session from a persistence object:
+
+ ```yaml
+ tags:
+ - { name: 'ibexa.collaboration.service.session.domain.mapper', type: App\…\MyPersistentSession }
+ ```
+
+- `ibexa.collaboration.service.session.persistence.mapper` - for the mapper that converts a session into a structure used to create or update persistence:
+
+ ```yaml
+ tags:
+ - { name: 'ibexa.collaboration.service.session.persistence.mapper', type: 'my_session_type' }
+ ```
+
+In the `src/Collaboration/Cart/Persistence/Gateway/` directory, create the following files:
+
+- `DatabaseSchema` - defines the database tables needed to store shared Cart collaboration session data:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseSchema.php') =]]
+```
+
+- `DatabaseGateway` - implements the gateway logic for getting and retrieving shared Cart collaboration data from the database. It uses a Discriminator to identify the type of session (in this case, a Cart session):
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php') =]]
+```
+
+### Define persistence Value objects
+
+Value objects describe how collaboration session data is represented in the database.
+Persistence gateway uses them to store, retrieve, and manipulate session information, such as the session ID, associated Cart, participants, and scopes.
+
+``` yaml
+[[= include_file('code_samples/collaboration/config/services.yaml', 33, 38) =]]
+```
+
+In the `src/Collaboration/Cart/Persistence/Values/` directory, create the following Value Objects:
+
+- `CartSession` - represents the Cart collaboration session data:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSession.php') =]]
+```
+
+- `CartSessionCreateStruct` - defines the data needed to create a new Cart collaboration session:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php') =]]
+```
+
+- `CartSessionUpdateStruct` - defines the data used to update an existing Cart collaboration session:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php') =]]
+```
+
+### Create Cart session Struct objects
+
+The next step is to integrate the Public API with the database so that it can store and retrieve data from the tables created earlier.
+You need to create new files to define the data that is passed into the public API.
+This data is then used by the [`SessionService`](/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-SessionServiceInterface.html) and public API handlers.
+
+In the `src/Collaboration/Cart/` directory, create the following Session Structs:
+
+- `CartSessionCreateStruct` - holds all necessary properties (like session token, participants, scopes, and the Cart reference) needed by the `SessionService` to create the shared Cart session:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php') =]]
+```
+
+- `CartSessionUpdateStruct` - defines the properties used to update an existing Cart collaboration session, including participants, scopes, and metadata:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSessionUpdateStruct.php') =]]
+```
+
+- `CartSession` - represents a Cart collaboration session, storing its ID, token, associated Cart, participants, and scope:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSession.php') =]]
+```
+
+- `CartSessionType` - defines the type of the collaboration session (in this case it indicates it’s a Cart session):
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php') =]]
+```
+
+## Create mappers
+
+Mappers convert session data into the format required by the database and pass it to the repository.
+
+In the `src/Collaboration/Cart/Mapper/` directory, create following mappers:
+
+- `CartProxyMapper` - creates a simplified version of the Cart with only the necessary data to reduce memory usage in collaboration sessions:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapper.php') =]]
+```
+
+- `CartProxyMapperInterface` - defines how a Cart should be converted into a simplified object that is used in collaboration session and specifies what methods the mapper must implement:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapperInterface.php') =]]
+```
+
+- `CartSessionDomainMapper` - builds the session object from persistence object:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionDomainMapper.php') =]]
+```
+
+- `CartSessionPersistenceMapper` - prepares session data to be saved or updated in the database:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php') =]]
+```
+
+Then, in the `src/Collaboration/Cart/Persistence/` directory, create the following mapper:
+
+- `Persistence/Mapper` - builds the session object from persistence row:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Mapper.php') =]]
+```
+
+In `services.yaml`, declare and tags the gateway and the mappers:
+
+``` yaml
+services:
+ # …
+[[= include_file('code_samples/collaboration/config/services.yaml', 21, 42) =]]
+```
+
+## Allow participants to access Cart
+
+To enable collaboration, you must configure the appropriate permissions.
+This involves decorating the `PermissionResolver` and `CartResolver`.
+
+This ensures that when a Cart is part of a Cart collaboration session, users can access it based on the defined permissions.
+In all other cases, the system falls back to the default implementation.
+
+!!! caution "Decorating permissions"
+
+ When decorating permissions, be careful to change the behavior only as necessary, to ensure that the Cart is shared only with the intended users.
+
+In the `src/Collaboration/Cart/` directory, create the following files:
+
+- `PermissionResolverDecorator` – customizes the permission resolver to handle access rules for Cart collaboration sessions. It allows participants to view or edit shared Carts while preserving default permission checks for all other cases. Here you can decide what scope is available for this collaboration session by choosing between `view` or `edit`:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php') =]]
+```
+
+- `CartResolverDecorator` – resolves the shared Carts in collaboration sessions by checking if a Cart belongs to a collaboration session:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php') =]]
+```
+
+In `services.yaml`, declare those decorator services associated with what they decorate:
+
+``` yaml
+services:
+ # …
+[[= include_file('code_samples/collaboration/config/services.yaml', 43) =]]
+```
+
+## Build dedicated controllers to manage Cart sharing flow
+
+To support Cart sharing, create controllers which handle the collaboration flow.
+They are responsible for starting a sharing session, adding participants, and allowing users to join an existing shared Cart.
+
+You need to create two controllers:
+
+- `ShareCartCreateController` - creates the Cart collaboration session and adds participants
+- `ShareCartJoinController` - allows to join the session
+
+### `ShareCartCreateController`
+
+This controller handles the request when you enter an email address of the user that you want to invite and submit it.
+It captures the email address and checks whether the form has been submitted.
+If yes, the form data is retrieved, and the `cartResolver` verifies whether there is currently a shared Cart.
+
+If a shared Cart exists, the Cart is retrieved and a session is created (`$cart` becomes the session context).
+In the `addParticipant` step, the user whose email address was provided is added to the session and assigned a scope (either `view` or `edit`).
+
+``` php
+[[= include_file('code_samples/collaboration/src/Controller/ShareCartCreateController.php') =]]
+```
+
+### `ShareCartJoinController`
+
+It enables joining a Cart session.
+The session token created earlier is passed in the URL, and in the `join` action, the system attempts to retrieve the session associated with that token.
+If the token is invalid, an exception is thrown to indicate that the session cannot be accessed.
+If the session exists, the session parameter (`collaboration_session`) is retrieved and the session stores the token.
+Finally, `redirectToRoute` redirects the user to the Cart view and passes the identifier of the shared Cart.
+
+``` php
+[[= include_file('code_samples/collaboration/src/Controller/ShareCartJoinController.php') =]]
+```
+
+!!! caution "Session parameter"
+
+ Avoid using a generic session parameter name such as `collaboration_session` (it's used here only for example purposes).
+ The user can participate in multiple sessions simultaneously (of one or many types), so using such name would cause the parameter to be constantly overwritten.
+ Therefore, active sessions should not be resolved based on such parameter.
+
+## Integrate with Symfony forms by adding forms and templates
+
+To support inviting users to a shared Cart, you need to create a dedicated form and a data class.
+The form collects the email address of the user that you want to invite, and the data class is used to safely pass that information from the form to the controller.
+
+- `ShareCartType` - a simple form for entering an email address of the user you want to invite to share the Cart. The form contains a single input field where you enter the email address manually:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Form/Type/ShareCartType.php') =]]
+```
+
+- `ShareCartData` - a class that holds the email address submitted through the form and passes it to the controller:
+
+``` php
+[[= include_file('code_samples/collaboration/src/Form/Data/ShareCartData.php') =]]
+```
+
+The last step is to integrate the new session type into your application by adding templates.
+In this step, the view is rendered.
+
+You need to add the following Twig templates in the `src/templates/themes/storefront/cart/` directory:
+
+- `share` - defines the view for the Cart sharing form. It renders the form where a user can enter an email address to invite someone to collaborate on the Cart:
+
+``` php
+[[= include_file('code_samples/collaboration/templates/themes/storefront/cart/share.html.twig') =]]
+```
+
+
+
+- `share_result` - renders the result page after a Cart has been shared. If the shared Cart exists in the system, the created session object is passed to the view and displayed. A message like "Cart has been shared…" is displayed, along with a link to access the session:
+
+``` php
+[[= include_file('code_samples/collaboration/templates/themes/storefront/cart/share_result.html.twig') =]]
+```
+
+
+
+- `view` - shows the Cart page. It displays the Cart content and includes the “Share Cart” button:
+
+``` php
+[[= include_file('code_samples/collaboration/templates/themes/storefront/cart/view.html.twig') =]]
+```
+
+
diff --git a/docs/content_management/collaborative_editing/img/share_button.png b/docs/content_management/collaborative_editing/img/share_button.png
new file mode 100644
index 0000000000000000000000000000000000000000..01ee37de01b1347f15aa90ab5ce719e30866062a
GIT binary patch
literal 119888
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