From 39800aef5007a03fb006195bf742db19673884bb Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Tue, 10 Feb 2026 12:42:32 +0100 Subject: [PATCH 01/11] extending collaboration described in dev-doc --- .../Cart/CartResolverDecorator.php | 54 ++++ .../src/Collaboration/Cart/CartSession.php | 41 +++ .../Cart/CartSessionCreateStruct.php | 39 +++ .../Collaboration/Cart/CartSessionType.php | 42 +++ .../Cart/CartSessionUpdateStruct.php | 19 ++ .../Cart/Mapper/CartProxyMapper.php | 43 +++ .../Cart/Mapper/CartProxyMapperInterface.php | 16 + .../Cart/Mapper/CartSessionDomainMapper.php | 49 ++++ .../Mapper/CartSessionPersistenceMapper.php | 49 ++++ .../Cart/PermissionResolverDecorator.php | 98 +++++++ .../Persistence/Gateway/DatabaseGateway.php | 77 +++++ .../Persistence/Gateway/DatabaseSchema.php | 22 ++ .../Cart/Persistence/Values/CartSession.php | 37 +++ .../Values/CartSessionCreateStruct.php | 47 +++ .../Values/CartSessionUpdateStruct.php | 20 ++ .../Controller/ShareCartCreateController.php | 78 +++++ .../Controller/ShareCartJoinController.php | 43 +++ .../src/Form/Data/ShareCartData.php | 27 ++ .../src/Form/Type/ShareCartType.php | 32 ++ .../themes/standard/cart/share.html.twig | 8 + .../standard/cart/share_result.html.twig | 10 + .../themes/standard/cart/view.html.twig | 57 ++++ .../extend_collaborative_editing.md | 276 ++++++++++++++++++ mkdocs.yml | 1 + 24 files changed, 1185 insertions(+) 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/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/standard/cart/share.html.twig create mode 100644 code_samples/collaboration/templates/themes/standard/cart/share_result.html.twig create mode 100644 code_samples/collaboration/templates/themes/standard/cart/view.html.twig create mode 100644 docs/content_management/collaborative_editing/extend_collaborative_editing.md 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..be17e0fba7 --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php @@ -0,0 +1,54 @@ +hasSharedCart()) { + return $this->getSharedCart() ?? $this->innerCartResolver->resolveCart($user); + } + + return $this->innerCartResolver->resolveCart($user); + } + + private function getSharedCart(): ?CartInterface + { + /** @var \App\Collaboration\Cart\CartSession $session */ + try { + $session = $this->sessionService->getSessionByToken( + $this->requestStack->getSession()->get(PermissionResolverDecorator::COLLABORATION_SESSION_ID) + ); + + return $session->getCart(); + } catch (NotFoundException|\Ibexa\ProductCatalog\Exception\UnauthorizedException $e) { + 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..eb3cb41aaf --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/CartSession.php @@ -0,0 +1,41 @@ +cart = $cart; + } + + public function getCart(): CartInterface + { + return $this->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..4a51d8ca85 --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php @@ -0,0 +1,39 @@ +cart = $cart; + } + + public function getCart(): CartInterface + { + return $this->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..e19c86207e --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php @@ -0,0 +1,42 @@ +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..ec7b513376 --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/CartSessionUpdateStruct.php @@ -0,0 +1,19 @@ +repository->sudo(fn () => $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..af4d60f05e --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapperInterface.php @@ -0,0 +1,16 @@ + + */ +final 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..8c3e8e7863 --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php @@ -0,0 +1,49 @@ +getToken(), + $createStruct->getCart()->getIdentifier(), + $createStruct->getOwner()->getUserId(), + $createStruct->isActive(), + $createStruct->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..2eb774fd03 --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php @@ -0,0 +1,98 @@ +nested === false && $this->isCartPolicy($policy) && $this->isSharedCart($policy->getObject())) { + return true; + } + + return $this->innerPermissionResolver->canUser($policy); + } + + public function assertPolicy(PolicyInterface $policy): void + { + if ($this->nested === false && $this->isCartPolicy($policy) && $this->isSharedCart($policy->getObject())) { + 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 $e) { + } + } + } 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..7bbfc271d5 --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php @@ -0,0 +1,77 @@ + + * + * @template-implements \Ibexa\Collaboration\Persistence\Session\Inner\GatewayInterface + */ +final class DatabaseGateway extends AbstractDoctrineDatabase implements GatewayInterface +{ + public const 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..356452f7b0 --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseSchema.php @@ -0,0 +1,22 @@ +cartIdentifier = $cartIdentifier; + } + + public function getCartIdentifier(): string + { + return $this->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..104d9fe20e --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php @@ -0,0 +1,47 @@ +cartIdentifier = $cartIdentifier; + } + + public function getCartIdentifier(): string + { + return $this->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..88474c4a8c --- /dev/null +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php @@ -0,0 +1,20 @@ +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) + ); + + $this->sessionService->addParticipant( + $session, + new ExternalParticipantCreateStruct( + $data->getEmail(), + 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..3f20602031 --- /dev/null +++ b/code_samples/collaboration/src/Controller/ShareCartJoinController.php @@ -0,0 +1,43 @@ +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..45057e8661 --- /dev/null +++ b/code_samples/collaboration/src/Form/Data/ShareCartData.php @@ -0,0 +1,27 @@ +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..a082b2a3c8 --- /dev/null +++ b/code_samples/collaboration/src/Form/Type/ShareCartType.php @@ -0,0 +1,32 @@ +add('email', EmailType::class, [ + 'label' => 'E-mail', + ]); + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => ShareCartData::class, + ]); + } +} diff --git a/code_samples/collaboration/templates/themes/standard/cart/share.html.twig b/code_samples/collaboration/templates/themes/standard/cart/share.html.twig new file mode 100644 index 0000000000..14a2ed2388 --- /dev/null +++ b/code_samples/collaboration/templates/themes/standard/cart/share.html.twig @@ -0,0 +1,8 @@ +{% extends '@ibexadesign/storefront/layout.html.twig' %} + +{% block content %} + {{ form_start(form) }} + {{ form_widget(form) }} + + {{ form_end(form) }} +{% endblock %} diff --git a/code_samples/collaboration/templates/themes/standard/cart/share_result.html.twig b/code_samples/collaboration/templates/themes/standard/cart/share_result.html.twig new file mode 100644 index 0000000000..b9b24bda31 --- /dev/null +++ b/code_samples/collaboration/templates/themes/standard/cart/share_result.html.twig @@ -0,0 +1,10 @@ +{% extends '@ibexadesign/storefront/layout.html.twig' %} + +{% block content %} +

+ 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/standard/cart/view.html.twig b/code_samples/collaboration/templates/themes/standard/cart/view.html.twig new file mode 100644 index 0000000000..e7900e130e --- /dev/null +++ b/code_samples/collaboration/templates/themes/standard/cart/view.html.twig @@ -0,0 +1,57 @@ +{% extends '@ibexadesign/storefront/layout.html.twig' %} + +{% trans_default_domain 'ibexa_storefront' %} + +{% macro render_notice_messages(messages) %} + {% for message in messages -%} + {{ message }}{{ not loop.last ? '
' }} + {%- endfor %} +{% endmacro %} + +{% block content %} +
+ Share cart +
+ + {% set quick_order_errors = app.flashes('quick_order_errors') %} + {% set quick_order_successes = app.flashes('quick_order_successes') %} + {% set cart_products_with_errors_codes = app.flashes('cart_products_with_errors_codes') %} + + {% set reorder_errors = app.flashes('reorder_errors') %} + {% set reorder_errors_products_codes = app.flashes('reorder_errors_products_codes') %} + + {% set products_to_highlight_codes = cart_products_with_errors_codes|merge(reorder_errors_products_codes) %} + + {% if quick_order_errors|length %} + {% include '@ibexadesign/storefront/component/notice_card/notice_card.html.twig' with { + type: 'warning', + content: _self.render_notice_messages(quick_order_errors), + } %} + {% endif %} + + {% if quick_order_successes|length %} + {% include '@ibexadesign/storefront/component/notice_card/notice_card.html.twig' with { + type: 'success', + content: _self.render_notice_messages(quick_order_successes), + } %} + {% endif %} + + {% if reorder_errors|length %} + {% include '@ibexadesign/storefront/component/notice_card/notice_card.html.twig' with { + type: 'warning', + content: _self.render_notice_messages(reorder_errors), + } %} + {% endif %} + + {% include '@ibexadesign/cart/component/maincart/maincart.html.twig' with { + products_to_highlight_codes, + checkout_identifier: app.request.get('checkout_identifier'), + checkout_step: app.request.get('checkout_step'), + } %} +{% endblock %} + +{% block javascripts %} + {{ parent() }} + + {{ encore_entry_script_tags('ibexa-storefront-notice-card-js', null, 'storefront') }} +{% endblock %} 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..afe866606a --- /dev/null +++ b/docs/content_management/collaborative_editing/extend_collaborative_editing.md @@ -0,0 +1,276 @@ +--- +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 add even more functionalities that can improve workflows not only within content editing but also when working, for example, with the product. +In the example below, you will learn how to extend this feature to enable a shared Cart functionality in the Commerce system. + +!!! tip + + If you prefer learning from videos, you can check a presentation from Ibexa Summit 2025 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, you need to 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, it represents the shopping Cart (identified by the Cart identifier) and an additional numeric ID stored in the database. + +=== "MySQL" + + ``` sql + 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; + ``` + +=== "PostgreSQL" + + ``` sql + 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 + ); + ``` + +## Set up the persistance layer + +To extend Collaborative editing feature to support shared Cart collaboration, you need to prepare the persistence layer. +This layer handles how the data about collaboration session and the Cart is stored, retrieved, and managed 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 the 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, so it can interact with the correct tables and data structures. +This way, the system knows which Gateway to use to get or save the right data for each session type. + +When creating the Database Gateways and mappers, you can use the build-in service tag: `ibexa.collaboration.persistence.session.gateway`: + +```yaml + tags: + - { name: 'ibexa.collaboration.persistence.session.gateway' } +``` + +In the `Collaboration/Cart/Persistence/Gateway` directory create the following files: + +- `DatabaseGateway` - implements the gateway logic for getting and retrieving shared Cart collaboration data from the database, using a Discriminator to indicate the type of session (in this case, a Cart session): + +``` php +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php') =]] +``` + +- `DatabaseSchema` - defines and creates the database tables needed to store shared Cart collaboration session data: + +``` php +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseSchema.php') =]] +``` + +### Define database 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. + +In the `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/CartSession.php') =]] +``` + +- `CartSessionCreateStruct` - defines the data needed to create a new Cart collaboration session: + +``` php +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php') =]] +``` + +- `CartSessionUpdateStruct` - defines the data used to update an existing Cart collaboration session: + +``` php +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSessionUpdateStruct.php') =]] +``` + +### Create the Cart session Struct objects + +The next step involves the Public API — you need to integrate it with the database to store data and retrieve it from the tables created before. +You need to create new files to define the data that is passed into the public API which are then used by the [SessionService](https://doc.ibexa.co/en/latest/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-SessionServiceInterface.html) and public API handlers. + +In the `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 indicating it’s a Cart session): + +``` php +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php') =]] +``` + +## Allow participants to access the Cart + +To start collaborating, you need to work on permissions. +This involves decorating the `PermissionResolver` and `CartResolver`. + +This step makes sure that if a Cart is part of a Cart collaboration session, users can access it due to the given permission, and in all other cases, it falls back to the default implementation. + +!!! caution "Decorating permissions" + + Be careful when decorating permissions to change the behavior only as necessary, ensuring 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, allowing 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` – extends the permission resolver to allow access to shared Carts in collaboration sessions, it checks if a Cart belongs to a collaboration session. + +``` php +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php') =]] +``` + +### Create mappers + +Mappers are used to return session data into the format the database needs and to send it to the repository. + +In the `src\Collaboration\Cart\Mapper` folder create four 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 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 that the app works with. + +``` 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') =]] +``` + +## Build dedicated controllers to manage the Cart sharing flow + +To support Cart sharing, you need to 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` - to create the Cart collaboration session and add participants +- `ShareCartJoinController` that enables joining the session. + +### `ShareCartCreateController` + +When you enter the user email address and submit it, the request is handled by this controller. +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 next step, `addParticipant`, 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 indicating that the session cannot be accessed. +If the session exists, the session parameter (`current_collaboration_session`) is retrieved and store 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 `current_collaboration_session` (it's used here only for example purposes). + If multiple collaboration session types exist, for example, Content and Cart sessions, the parameter may be overwritten when another session is started. + Try to use more specific and unique parameter name to prevent conflicts between different session types. + +## 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 the 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` - this class holds the email address submitted through the form and pass 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 following templates in the `templates/themes/standard/cart` folder: + +- `share` - this Twig template 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/standard/cart/share.html.twig') =]] +``` + +- `share_result` - this Twig template 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/standard/cart/share_result.html.twig') =]] +``` + +- `view` - is the template that shows the Cart page. It displays the Cart content and includes the “Share Cart” button and other elements for Cart collaboration. + +``` php +[[= include_file('code_samples/collaboration/templates/themes/standard/cart/view.html.twig') =]] +``` diff --git a/mkdocs.yml b/mkdocs.yml index d6f04328b2..1b9bf392ea 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -288,6 +288,7 @@ nav: - Collaborative editing product guide: content_management/collaborative_editing/collaborative_editing_guide.md - Configure Collaborative editing: content_management/collaborative_editing/configure_collaborative_editing.md - Collaborative editing API: content_management/collaborative_editing/collaborative_editing_api.md + - Extend Collaborative editing: content_management/collaborative_editing/extend_collaborative_editing.md - Templating: - Templating: templating/templating.md - Render content: From b5b738ab4352f415f88540e949242974e7bcfb8d Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Tue, 10 Feb 2026 11:55:01 +0000 Subject: [PATCH 02/11] PHP & JS CS Fixes --- .../Cart/Persistence/Values/CartSessionCreateStruct.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php index 104d9fe20e..23f4c4c6f7 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php @@ -25,7 +25,7 @@ public function __construct( ?DateTimeImmutable $createdAt = null, ?DateTimeImmutable $updatedAt = null ) { - parent::__construct( $token, $ownerId,$isActive, $hasPublicLink, $createdAt, $updatedAt); + parent::__construct($token, $ownerId, $isActive, $hasPublicLink, $createdAt, $updatedAt); $this->cartIdentifier = $cartIdentifier; } From d2add649eb2c5cdb7efcd97da6800d9bfce03495 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Thu, 12 Feb 2026 11:28:57 +0100 Subject: [PATCH 03/11] Trigger CI From 631bdb30424798b47c3a2d2cdc0f2f55ca33903a Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Mon, 16 Feb 2026 12:22:45 +0100 Subject: [PATCH 04/11] fixes --- .../src/Collaboration/Cart/CartSession.php | 28 ++++---- .../Values/CartSessionCreateStruct.php | 2 +- .../extend_collaborative_editing.md | 72 +++++++++---------- 3 files changed, 49 insertions(+), 53 deletions(-) diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartSession.php b/code_samples/collaboration/src/Collaboration/Cart/CartSession.php index eb3cb41aaf..a2c81c3121 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/CartSession.php +++ b/code_samples/collaboration/src/Collaboration/Cart/CartSession.php @@ -6,36 +6,32 @@ */ declare(strict_types=1); -namespace App\Collaboration\Cart; +namespace App\Collaboration\Cart\Persistence\Values; -use DateTimeInterface; -use Ibexa\Contracts\Cart\Value\CartInterface; -use Ibexa\Contracts\Collaboration\Participant\ParticipantCollectionInterface; -use Ibexa\Contracts\Collaboration\Session\AbstractSession; -use Ibexa\Contracts\Core\Repository\Values\User\User; +use DateTimeImmutable; +use Ibexa\Collaboration\Persistence\Values\AbstractSession; final class CartSession extends AbstractSession { - private CartInterface $cart; + private string $cartIdentifier; public function __construct( int $id, - CartInterface $cart, + string $cartIdentifier, string $token, - User $owner, - ParticipantCollectionInterface $participants, + int $userId, bool $isActive, bool $hasPublicLink, - DateTimeInterface $createdAt, - DateTimeInterface $updatedAt + DateTimeImmutable $createdAt, + DateTimeImmutable $updatedAt ) { - parent::__construct($id, $token, $owner, $participants, $isActive, $hasPublicLink, $createdAt, $updatedAt); + parent::__construct($id, $token, $userId, $isActive, $hasPublicLink, $createdAt, $updatedAt); - $this->cart = $cart; + $this->cartIdentifier = $cartIdentifier; } - public function getCart(): CartInterface + public function getCartIdentifier(): string { - return $this->cart; + return $this->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 index 23f4c4c6f7..104d9fe20e 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php @@ -25,7 +25,7 @@ public function __construct( ?DateTimeImmutable $createdAt = null, ?DateTimeImmutable $updatedAt = null ) { - parent::__construct($token, $ownerId, $isActive, $hasPublicLink, $createdAt, $updatedAt); + parent::__construct( $token, $ownerId,$isActive, $hasPublicLink, $createdAt, $updatedAt); $this->cartIdentifier = $cartIdentifier; } diff --git a/docs/content_management/collaborative_editing/extend_collaborative_editing.md b/docs/content_management/collaborative_editing/extend_collaborative_editing.md index afe866606a..43ce9d710e 100644 --- a/docs/content_management/collaborative_editing/extend_collaborative_editing.md +++ b/docs/content_management/collaborative_editing/extend_collaborative_editing.md @@ -71,19 +71,19 @@ When creating the Database Gateways and mappers, you can use the build-in servic In the `Collaboration/Cart/Persistence/Gateway` directory create the following files: -- `DatabaseGateway` - implements the gateway logic for getting and retrieving shared Cart collaboration data from the database, using a Discriminator to indicate the type of session (in this case, a Cart session): +- `DatabaseSchema` - defines and creates the database tables needed to store shared Cart collaboration session data: ``` php -[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php') =]] +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseSchema.php') =]] ``` -- `DatabaseSchema` - defines and creates the database tables needed to store shared Cart collaboration session data: +- `DatabaseGateway` - implements the gateway logic for getting and retrieving shared Cart collaboration data from the database, using a Discriminator to indicate the type of session (in this case, a Cart session): ``` php -[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseSchema.php') =]] +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php') =]] ``` -### Define database Value objects +### 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. @@ -93,19 +93,19 @@ In the `Collaboration/Cart/Persistence/Values` directory create the following Va - `CartSession` - represents the Cart collaboration session data: ``` php -[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSession.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/CartSessionCreateStruct.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/CartSessionUpdateStruct.php') =]] +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php') =]] ``` ### Create the Cart session Struct objects @@ -139,32 +139,7 @@ In the `Collaboration/Cart` directory create the following Session Structs: [[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php') =]] ``` -## Allow participants to access the Cart - -To start collaborating, you need to work on permissions. -This involves decorating the `PermissionResolver` and `CartResolver`. - -This step makes sure that if a Cart is part of a Cart collaboration session, users can access it due to the given permission, and in all other cases, it falls back to the default implementation. - -!!! caution "Decorating permissions" - - Be careful when decorating permissions to change the behavior only as necessary, ensuring 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, allowing 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` – extends the permission resolver to allow access to shared Carts in collaboration sessions, it checks if a Cart belongs to a collaboration session. - -``` php -[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php') =]] -``` - -### Create mappers +## Create mappers Mappers are used to return session data into the format the database needs and to send it to the repository. @@ -194,6 +169,31 @@ In the `src\Collaboration\Cart\Mapper` folder create four mappers: [[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php') =]] ``` +## Allow participants to access the Cart + +To start collaborating, you need to work on permissions. +This involves decorating the `PermissionResolver` and `CartResolver`. + +This step makes sure that if a Cart is part of a Cart collaboration session, users can access it due to the given permission, and in all other cases, it falls back to the default implementation. + +!!! caution "Decorating permissions" + + Be careful when decorating permissions to change the behavior only as necessary, ensuring 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, allowing 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` – extends the permission resolver to allow access to shared Carts in collaboration sessions, it checks if a Cart belongs to a collaboration session. + +``` php +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php') =]] +``` + ## Build dedicated controllers to manage the Cart sharing flow To support Cart sharing, you need to create controllers which handle the collaboration flow. @@ -232,8 +232,8 @@ Finally, `redirectToRoute` redirects the user to the Cart view and passes the id !!! caution "Session parameter" Avoid using a generic session parameter name such as `current_collaboration_session` (it's used here only for example purposes). - If multiple collaboration session types exist, for example, Content and Cart sessions, the parameter may be overwritten when another session is started. - Try to use more specific and unique parameter name to prevent conflicts between different session types. + The user can participate in multiple sessions simultaneously (of one or many types), so using this parameter would cause it to be constantly overwritten. + Therefore, active sessions should not be resolved based on such parameter. ## Integrate with Symfony forms by adding forms and templates From 96811d71d15282a26c89cfca5c5b15115dc56594 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Mon, 16 Feb 2026 11:30:24 +0000 Subject: [PATCH 05/11] PHP & JS CS Fixes --- .../Cart/Persistence/Values/CartSessionCreateStruct.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php index 104d9fe20e..23f4c4c6f7 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php @@ -25,7 +25,7 @@ public function __construct( ?DateTimeImmutable $createdAt = null, ?DateTimeImmutable $updatedAt = null ) { - parent::__construct( $token, $ownerId,$isActive, $hasPublicLink, $createdAt, $updatedAt); + parent::__construct($token, $ownerId, $isActive, $hasPublicLink, $createdAt, $updatedAt); $this->cartIdentifier = $cartIdentifier; } From 70284f9bac77fef042ddf22f3e558285dc2a5ff4 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Mon, 16 Feb 2026 12:32:38 +0100 Subject: [PATCH 06/11] card added --- .../collaborative_editing/collaborative_editing.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content_management/collaborative_editing/collaborative_editing.md b/docs/content_management/collaborative_editing/collaborative_editing.md index 46367f5c2d..3b6e384590 100644 --- a/docs/content_management/collaborative_editing/collaborative_editing.md +++ b/docs/content_management/collaborative_editing/collaborative_editing.md @@ -30,6 +30,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) =]] From bd800f0f55d875ca02bb95ea72a5ad87122cf218 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Thu, 26 Feb 2026 13:32:26 +0100 Subject: [PATCH 07/11] fixes after dev-rev --- .../src/Collaboration/Cart/CartSession.php | 28 +++++++++++-------- .../extend_collaborative_editing.md | 12 ++++---- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartSession.php b/code_samples/collaboration/src/Collaboration/Cart/CartSession.php index a2c81c3121..eb3cb41aaf 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/CartSession.php +++ b/code_samples/collaboration/src/Collaboration/Cart/CartSession.php @@ -6,32 +6,36 @@ */ declare(strict_types=1); -namespace App\Collaboration\Cart\Persistence\Values; +namespace App\Collaboration\Cart; -use DateTimeImmutable; -use Ibexa\Collaboration\Persistence\Values\AbstractSession; +use DateTimeInterface; +use Ibexa\Contracts\Cart\Value\CartInterface; +use Ibexa\Contracts\Collaboration\Participant\ParticipantCollectionInterface; +use Ibexa\Contracts\Collaboration\Session\AbstractSession; +use Ibexa\Contracts\Core\Repository\Values\User\User; final class CartSession extends AbstractSession { - private string $cartIdentifier; + private CartInterface $cart; public function __construct( int $id, - string $cartIdentifier, + CartInterface $cart, string $token, - int $userId, + User $owner, + ParticipantCollectionInterface $participants, bool $isActive, bool $hasPublicLink, - DateTimeImmutable $createdAt, - DateTimeImmutable $updatedAt + DateTimeInterface $createdAt, + DateTimeInterface $updatedAt ) { - parent::__construct($id, $token, $userId, $isActive, $hasPublicLink, $createdAt, $updatedAt); + parent::__construct($id, $token, $owner, $participants, $isActive, $hasPublicLink, $createdAt, $updatedAt); - $this->cartIdentifier = $cartIdentifier; + $this->cart = $cart; } - public function getCartIdentifier(): string + public function getCart(): CartInterface { - return $this->cartIdentifier; + return $this->cart; } } diff --git a/docs/content_management/collaborative_editing/extend_collaborative_editing.md b/docs/content_management/collaborative_editing/extend_collaborative_editing.md index 43ce9d710e..4aea75b0e5 100644 --- a/docs/content_management/collaborative_editing/extend_collaborative_editing.md +++ b/docs/content_management/collaborative_editing/extend_collaborative_editing.md @@ -47,7 +47,7 @@ In this example, it represents the shopping Cart (identified by the Cart identif ); ``` -## Set up the persistance layer +## Set up the persistence layer To extend Collaborative editing feature to support shared Cart collaboration, you need to prepare the persistence layer. This layer handles how the data about collaboration session and the Cart is stored, retrieved, and managed in the database. @@ -62,7 +62,7 @@ It handles all the create, read, update, and delete operations for collaboration It also uses a Discriminator to specify the session type, so it can interact with the correct tables and data structures. This way, the system knows which Gateway to use to get or save the right data for each session type. -When creating the Database Gateways and mappers, you can use the build-in service tag: `ibexa.collaboration.persistence.session.gateway`: +When creating the Database Gateways and mappers, you can use the built-in service tag: `ibexa.collaboration.persistence.session.gateway`: ```yaml tags: @@ -143,7 +143,7 @@ In the `Collaboration/Cart` directory create the following Session Structs: Mappers are used to return session data into the format the database needs and to send it to the repository. -In the `src\Collaboration\Cart\Mapper` folder create four mappers: +In the `src/Collaboration/Cart/Mapper` folder create four mappers: - `CartProxyMapper` - creates a simplified version of the Cart with only the necessary data to reduce memory usage in collaboration sessions. @@ -188,7 +188,7 @@ In the `src/Collaboration/Cart` directory, create the following files: [[= include_file('code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php') =]] ``` -- `CartResolverDecorator` – extends the permission resolver to allow access to shared Carts in collaboration sessions, it checks if a Cart belongs to a collaboration session. +- `CartResolverDecorator` – resolves the shared Carts in collaboration sessions, it checks if a Cart belongs to a collaboration session. ``` php [[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php') =]] @@ -222,7 +222,7 @@ In the next step, `addParticipant`, the user whose email address was provided is 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 indicating that the session cannot be accessed. -If the session exists, the session parameter (`current_collaboration_session`) is retrieved and store the token. +If the session exists, the session parameter (`collaboration_session`) is retrieved and store the token. Finally, `redirectToRoute` redirects the user to the Cart view and passes the identifier of the shared Cart. ``` php @@ -231,7 +231,7 @@ Finally, `redirectToRoute` redirects the user to the Cart view and passes the id !!! caution "Session parameter" - Avoid using a generic session parameter name such as `current_collaboration_session` (it's used here only for example purposes). + 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 this parameter would cause it to be constantly overwritten. Therefore, active sessions should not be resolved based on such parameter. From d0e3c852547ee7b2b472977091e64587221d906f Mon Sep 17 00:00:00 2001 From: Tomasz Kryszan Date: Thu, 26 Feb 2026 14:33:49 +0100 Subject: [PATCH 08/11] [PHPStan] Fixed reported errors --- .../Collaboration/Cart/CartResolverDecorator.php | 5 ++++- .../Collaboration/Cart/Mapper/CartProxyMapper.php | 2 +- .../Cart/Mapper/CartSessionPersistenceMapper.php | 14 +++++++++++--- .../Cart/PermissionResolverDecorator.php | 6 ++++-- .../src/Controller/ShareCartCreateController.php | 8 +++++++- .../collaboration/src/Form/Type/ShareCartType.php | 3 +++ 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php b/code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php index be17e0fba7..4d879c5dfc 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php +++ b/code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php @@ -35,12 +35,15 @@ public function resolveCart(?User $user = null): CartInterface private function getSharedCart(): ?CartInterface { - /** @var \App\Collaboration\Cart\CartSession $session */ 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 $e) { return null; diff --git a/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapper.php b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapper.php index 39a0080c78..89207c9eba 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapper.php +++ b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapper.php @@ -33,7 +33,7 @@ public function createCartProxy(string $identifier): CartInterface &$initializer ) use ($identifier): bool { $initializer = null; - $wrappedObject = $this->repository->sudo(fn () => $this->cartService->getCart($identifier)); + $wrappedObject = $this->repository->sudo(fn (): CartInterface => $this->cartService->getCart($identifier)); return true; }; diff --git a/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php index 8c3e8e7863..ed29967aab 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php +++ b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php @@ -25,12 +25,20 @@ final class CartSessionPersistenceMapper implements SessionPersistenceMapperInte public function toPersistenceCreateStruct( SessionCreateStruct $createStruct ): PersistenceSessionCreateStruct { + $token = $createStruct->getToken(); + $owner = $createStruct->getOwner(); + $hasPublicLink = $createStruct->hasPublicLink(); + + assert($token !== null); + assert($owner !== null); + assert($hasPublicLink !== null); + return new CartSessionCreateStruct( - $createStruct->getToken(), + $token, $createStruct->getCart()->getIdentifier(), - $createStruct->getOwner()->getUserId(), + $owner->getUserId(), $createStruct->isActive(), - $createStruct->hasPublicLink(), + $hasPublicLink, new \DateTimeImmutable(), new \DateTimeImmutable() ); diff --git a/code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php b/code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php index 2eb774fd03..8630dcce30 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php +++ b/code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php @@ -33,7 +33,8 @@ public function __construct( public function canUser(PolicyInterface $policy): bool { - if ($this->nested === false && $this->isCartPolicy($policy) && $this->isSharedCart($policy->getObject())) { + $object = $policy->getObject(); + if ($this->nested === false && $this->isCartPolicy($policy) && $object instanceof CartInterface && $this->isSharedCart($object)) { return true; } @@ -42,7 +43,8 @@ public function canUser(PolicyInterface $policy): bool public function assertPolicy(PolicyInterface $policy): void { - if ($this->nested === false && $this->isCartPolicy($policy) && $this->isSharedCart($policy->getObject())) { + $object = $policy->getObject(); + if ($this->nested === false && $this->isCartPolicy($policy) && $object instanceof CartInterface && $this->isSharedCart($object)) { return; } diff --git a/code_samples/collaboration/src/Controller/ShareCartCreateController.php b/code_samples/collaboration/src/Controller/ShareCartCreateController.php index 73c15e384d..13697187a8 100644 --- a/code_samples/collaboration/src/Controller/ShareCartCreateController.php +++ b/code_samples/collaboration/src/Controller/ShareCartCreateController.php @@ -14,6 +14,7 @@ use Ibexa\Contracts\Cart\CartResolverInterface; use Ibexa\Contracts\Collaboration\Participant\ExternalParticipantCreateStruct; use Ibexa\Contracts\Collaboration\SessionServiceInterface; +use InvalidArgumentException; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -52,10 +53,15 @@ public function __invoke(Request $request): Response new CartSessionCreateStruct($cart) ); + $email = $data->getEmail(); + if ($email === null) { + throw new InvalidArgumentException('Email cannot be null'); + } + $this->sessionService->addParticipant( $session, new ExternalParticipantCreateStruct( - $data->getEmail(), + $email, CartSessionType::SCOPE_EDIT ) ); diff --git a/code_samples/collaboration/src/Form/Type/ShareCartType.php b/code_samples/collaboration/src/Form/Type/ShareCartType.php index a082b2a3c8..758e40d916 100644 --- a/code_samples/collaboration/src/Form/Type/ShareCartType.php +++ b/code_samples/collaboration/src/Form/Type/ShareCartType.php @@ -14,6 +14,9 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +/** + * @extends AbstractType + */ final class ShareCartType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void From 42ede63eeff5cf01d623fd0d6caf70422a88ceba Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Thu, 12 Mar 2026 14:08:16 +0100 Subject: [PATCH 09/11] 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 --- .../collaboration/config/services.yaml | 48 ++++++++++++++++ .../ibexa_collaboration_cart.mysql.sql | 7 +++ .../ibexa_collaboration_cart.postgresql.sql | 7 +++ .../Cart/CartResolverDecorator.php | 12 +--- .../src/Collaboration/Cart/CartSession.php | 14 +---- .../Cart/CartSessionCreateStruct.php | 14 +---- .../Collaboration/Cart/CartSessionType.php | 14 ++--- .../Cart/CartSessionUpdateStruct.php | 8 +-- .../Cart/Mapper/CartProxyMapper.php | 10 +--- .../Cart/Mapper/CartProxyMapperInterface.php | 8 +-- .../Cart/Mapper/CartSessionDomainMapper.php | 10 +--- .../Mapper/CartSessionPersistenceMapper.php | 8 +-- .../Cart/PermissionResolverDecorator.php | 18 ++---- .../Persistence/Gateway/DatabaseGateway.php | 10 +--- .../Persistence/Gateway/DatabaseSchema.php | 14 ++--- .../Collaboration/Cart/Persistence/Mapper.php | 38 +++++++++++++ .../Cart/Persistence/Values/CartSession.php | 14 +---- .../Values/CartSessionCreateStruct.php | 14 +---- .../Values/CartSessionUpdateStruct.php | 8 +-- .../src/Command/ManageSessionsCommand.php | 8 +-- .../Controller/ShareCartCreateController.php | 14 ++--- .../Controller/ShareCartJoinController.php | 14 ++--- .../src/Form/Data/ShareCartData.php | 8 +-- .../src/Form/Type/ShareCartType.php | 11 ++-- .../collaboration/src/Query/Search.php | 3 +- .../themes/standard/cart/share.html.twig | 8 --- .../themes/standard/cart/view.html.twig | 57 ------------------- .../themes/storefront/cart/share.html.twig | 9 +++ .../cart/share_result.html.twig | 2 +- .../themes/storefront/cart/view.html.twig | 8 +++ .../extend_collaborative_editing.md | 25 ++------ .../collaboration_criteria.md | 2 +- .../collaboration_sort_clauses.md | 2 +- 33 files changed, 176 insertions(+), 271 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/Persistence/Mapper.php delete mode 100644 code_samples/collaboration/templates/themes/standard/cart/share.html.twig delete mode 100644 code_samples/collaboration/templates/themes/standard/cart/view.html.twig create mode 100644 code_samples/collaboration/templates/themes/storefront/cart/share.html.twig rename code_samples/collaboration/templates/themes/{standard => storefront}/cart/share_result.html.twig (83%) create mode 100644 code_samples/collaboration/templates/themes/storefront/cart/view.html.twig 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 index 4d879c5dfc..9bf359e4a9 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php +++ b/code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php @@ -1,10 +1,4 @@ -getCart(); - } catch (NotFoundException|\Ibexa\ProductCatalog\Exception\UnauthorizedException $e) { + } catch (NotFoundException|\Ibexa\ProductCatalog\Exception\UnauthorizedException) { return null; } } diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartSession.php b/code_samples/collaboration/src/Collaboration/Cart/CartSession.php index eb3cb41aaf..dcacef4130 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/CartSession.php +++ b/code_samples/collaboration/src/Collaboration/Cart/CartSession.php @@ -1,10 +1,4 @@ -cart = $cart; } public function getCart(): CartInterface diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php b/code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php index 4a51d8ca85..9594b61cd7 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php +++ b/code_samples/collaboration/src/Collaboration/Cart/CartSessionCreateStruct.php @@ -1,10 +1,4 @@ -cart = $cart; } public function getCart(): CartInterface diff --git a/code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php b/code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php index e19c86207e..93c9ab3023 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php +++ b/code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php @@ -1,10 +1,4 @@ - */ -final class CartSessionDomainMapper implements SessionDomainMapperInterface +final readonly class CartSessionDomainMapper implements SessionDomainMapperInterface { public function __construct( private CartProxyMapperInterface $cartProxyMapper, diff --git a/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php index ed29967aab..380ecf6b06 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php +++ b/code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php @@ -1,10 +1,4 @@ -getId() === $session->getCart()->getId(); - } catch (NotFoundException $e) { + } catch (NotFoundException) { } } } finally { diff --git a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php index 7bbfc271d5..8ecca9a74b 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php @@ -1,10 +1,4 @@ - + */ +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 index a2c81c3121..dd58482adf 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSession.php +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSession.php @@ -1,10 +1,4 @@ -cartIdentifier = $cartIdentifier; } public function getCartIdentifier(): string diff --git a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php index 23f4c4c6f7..875dc6a87a 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionCreateStruct.php @@ -1,10 +1,4 @@ -cartIdentifier = $cartIdentifier; } public function getCartIdentifier(): string diff --git a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php index 88474c4a8c..471a5f7fbd 100644 --- a/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php +++ b/code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php @@ -1,10 +1,4 @@ -add('email', EmailType::class, [ 'label' => 'E-mail', + ])->add('submit', SubmitType::class, [ + 'label' => 'Share', ]); } 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 @@ -Share - {{ form_end(form) }} -{% endblock %} diff --git a/code_samples/collaboration/templates/themes/standard/cart/view.html.twig b/code_samples/collaboration/templates/themes/standard/cart/view.html.twig deleted file mode 100644 index e7900e130e..0000000000 --- a/code_samples/collaboration/templates/themes/standard/cart/view.html.twig +++ /dev/null @@ -1,57 +0,0 @@ -{% extends '@ibexadesign/storefront/layout.html.twig' %} - -{% trans_default_domain 'ibexa_storefront' %} - -{% macro render_notice_messages(messages) %} - {% for message in messages -%} - {{ message }}{{ not loop.last ? '
' }} - {%- endfor %} -{% endmacro %} - -{% block content %} - - - {% set quick_order_errors = app.flashes('quick_order_errors') %} - {% set quick_order_successes = app.flashes('quick_order_successes') %} - {% set cart_products_with_errors_codes = app.flashes('cart_products_with_errors_codes') %} - - {% set reorder_errors = app.flashes('reorder_errors') %} - {% set reorder_errors_products_codes = app.flashes('reorder_errors_products_codes') %} - - {% set products_to_highlight_codes = cart_products_with_errors_codes|merge(reorder_errors_products_codes) %} - - {% if quick_order_errors|length %} - {% include '@ibexadesign/storefront/component/notice_card/notice_card.html.twig' with { - type: 'warning', - content: _self.render_notice_messages(quick_order_errors), - } %} - {% endif %} - - {% if quick_order_successes|length %} - {% include '@ibexadesign/storefront/component/notice_card/notice_card.html.twig' with { - type: 'success', - content: _self.render_notice_messages(quick_order_successes), - } %} - {% endif %} - - {% if reorder_errors|length %} - {% include '@ibexadesign/storefront/component/notice_card/notice_card.html.twig' with { - type: 'warning', - content: _self.render_notice_messages(reorder_errors), - } %} - {% endif %} - - {% include '@ibexadesign/cart/component/maincart/maincart.html.twig' with { - products_to_highlight_codes, - checkout_identifier: app.request.get('checkout_identifier'), - checkout_step: app.request.get('checkout_step'), - } %} -{% endblock %} - -{% block javascripts %} - {{ parent() }} - - {{ encore_entry_script_tags('ibexa-storefront-notice-card-js', null, 'storefront') }} -{% endblock %} diff --git a/code_samples/collaboration/templates/themes/storefront/cart/share.html.twig b/code_samples/collaboration/templates/themes/storefront/cart/share.html.twig new file mode 100644 index 0000000000..f4ba2e2913 --- /dev/null +++ b/code_samples/collaboration/templates/themes/storefront/cart/share.html.twig @@ -0,0 +1,9 @@ +{% extends '@ibexadesign/storefront/layout.html.twig' %} + +{% block content %} + {{ form_start(form) }} + {{ form_label(form.email, null, { 'label_attr': { 'class': 'ibexa-store-label' }}) }} + {{ form_widget(form.email, { 'attr': { 'class': 'ibexa-store-input' } }) }} + {{ form_widget(form.submit, { 'attr': { 'class': 'ibexa-store-btn ibexa-store-btn--primary' } }) }} + {{ form_end(form) }} +{% endblock %} diff --git a/code_samples/collaboration/templates/themes/standard/cart/share_result.html.twig b/code_samples/collaboration/templates/themes/storefront/cart/share_result.html.twig similarity index 83% rename from code_samples/collaboration/templates/themes/standard/cart/share_result.html.twig rename to code_samples/collaboration/templates/themes/storefront/cart/share_result.html.twig index b9b24bda31..a830a4d768 100644 --- a/code_samples/collaboration/templates/themes/standard/cart/share_result.html.twig +++ b/code_samples/collaboration/templates/themes/storefront/cart/share_result.html.twig @@ -2,7 +2,7 @@ {% block content %}

- Cart has been shared successfully! Link to session:   + Cart has been shared successfully! Link to session:  {{ url('app.shared_cart.join', { token: session.getToken() }) }} 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/extend_collaborative_editing.md b/docs/content_management/collaborative_editing/extend_collaborative_editing.md index 4aea75b0e5..4abb2fbbf2 100644 --- a/docs/content_management/collaborative_editing/extend_collaborative_editing.md +++ b/docs/content_management/collaborative_editing/extend_collaborative_editing.md @@ -25,26 +25,13 @@ In this example, it represents the shopping Cart (identified by the Cart identif === "MySQL" ``` sql - 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; + [[= include_file('code_samples/collaboration/ibexa_collaboration_cart.mysql.sql', 0, None, ' ') =]] ``` === "PostgreSQL" ``` sql - 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 - ); + [[= include_file('code_samples/collaboration/ibexa_collaboration_cart.postgresql.sql', 0, None, ' ') =]] ``` ## Set up the persistence layer @@ -255,22 +242,22 @@ The form collects the email address of the user that you want to invite, and the 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 following templates in the `templates/themes/standard/cart` folder: +You need to add following templates in the `templates/themes/storefront/cart` folder: - `share` - this Twig template 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/standard/cart/share.html.twig') =]] +[[= include_file('code_samples/collaboration/templates/themes/storefront/cart/share.html.twig') =]] ``` - `share_result` - this Twig template 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/standard/cart/share_result.html.twig') =]] +[[= include_file('code_samples/collaboration/templates/themes/storefront/cart/share_result.html.twig') =]] ``` - `view` - is the template that shows the Cart page. It displays the Cart content and includes the “Share Cart” button and other elements for Cart collaboration. ``` php -[[= include_file('code_samples/collaboration/templates/themes/standard/cart/view.html.twig') =]] +[[= include_file('code_samples/collaboration/templates/themes/storefront/cart/view.html.twig') =]] ``` diff --git a/docs/search/collaboration_search_reference/collaboration_criteria.md b/docs/search/collaboration_search_reference/collaboration_criteria.md index b5b909674a..8ef1bed45a 100644 --- a/docs/search/collaboration_search_reference/collaboration_criteria.md +++ b/docs/search/collaboration_search_reference/collaboration_criteria.md @@ -50,7 +50,7 @@ Session Search Criteria are implementing the [CriterionInterface](/api/php_api/p The following example shows how you can use the criteria to find all the currently active sessions: -```php hl_lines="12-16" +```php hl_lines="11-15" [[= include_file('code_samples/collaboration/src/Query/Search.php') =]] ``` diff --git a/docs/search/collaboration_search_reference/collaboration_sort_clauses.md b/docs/search/collaboration_search_reference/collaboration_sort_clauses.md index be985fb453..33b943f937 100644 --- a/docs/search/collaboration_search_reference/collaboration_sort_clauses.md +++ b/docs/search/collaboration_search_reference/collaboration_sort_clauses.md @@ -33,7 +33,7 @@ Session Search Sort Clauses are implementing the [SortClauseInterface](/api/php_ The following example shows how to use them to sort the searched sessions: -```php hl_lines="18" +```php hl_lines="17" [[= include_file('code_samples/collaboration/src/Query/Search.php') =]] ``` From 22dab12bc1cd53bab786622329e1f4e7c186b4fe Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Fri, 13 Mar 2026 08:37:47 +0100 Subject: [PATCH 10/11] screenshots added --- .../extend_collaborative_editing.md | 199 +++++++++--------- .../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 4 files changed, 103 insertions(+), 96 deletions(-) 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/docs/content_management/collaborative_editing/extend_collaborative_editing.md b/docs/content_management/collaborative_editing/extend_collaborative_editing.md index 4abb2fbbf2..cee802209a 100644 --- a/docs/content_management/collaborative_editing/extend_collaborative_editing.md +++ b/docs/content_management/collaborative_editing/extend_collaborative_editing.md @@ -5,22 +5,22 @@ month_change: true # Extend Collaborative editing -Thanks to the ability to extend the [Collaborative editing](collaborative_editing_guide.md) feature, you can add even more functionalities that can improve workflows not only within content editing but also when working, for example, with the product. +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. In the example below, you will learn how to extend this feature to enable a shared Cart functionality in the Commerce system. !!! tip - If you prefer learning from videos, you can check a presentation from Ibexa Summit 2025 that covers the Collaborative editing feature: + 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, you need to set up the database layer and define the collaboration context, in this example, Cart. +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, it represents the shopping Cart (identified by the Cart identifier) and an additional numeric ID stored in the database. +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" @@ -34,20 +34,19 @@ In this example, it represents the shopping Cart (identified by the Cart identif [[= include_file('code_samples/collaboration/ibexa_collaboration_cart.postgresql.sql', 0, None, ' ') =]] ``` -## Set up the persistence layer +## Set up persistence layer -To extend Collaborative editing feature to support shared Cart collaboration, you need to prepare the persistence layer. -This layer handles how the data about collaboration session and the Cart is stored, retrieved, and managed in the database. +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 the persistence gateway +### 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, so it can interact with the correct tables and data structures. -This way, the system knows which Gateway to use to get or save the right data for each session type. +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`: @@ -56,149 +55,151 @@ When creating the Database Gateways and mappers, you can use the built-in servic - { name: 'ibexa.collaboration.persistence.session.gateway' } ``` -In the `Collaboration/Cart/Persistence/Gateway` directory create the following files: +In the `Collaboration/Cart/Persistence/Gateway` directory, create the following files: - `DatabaseSchema` - defines and creates the database tables needed to store shared Cart collaboration session data: -``` php -[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseSchema.php') =]] -``` + ``` 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, using a Discriminator to indicate the type of session (in this case, a Cart session): -``` php -[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php') =]] -``` + ``` 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. -In the `Collaboration/Cart/Persistence/Values` directory create the following Value Objects: +In the `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') =]] -``` + ``` 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') =]] -``` + ``` 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') =]] -``` + ``` php + [[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php') =]] + ``` -### Create the Cart session Struct objects +### Create Cart session Struct objects -The next step involves the Public API — you need to integrate it with the database to store data and retrieve it from the tables created before. -You need to create new files to define the data that is passed into the public API which are then used by the [SessionService](https://doc.ibexa.co/en/latest/api/php_api/php_api_reference/classes/Ibexa-Contracts-Collaboration-SessionServiceInterface.html) and public API handlers. +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 `Collaboration/Cart` directory create the following Session Structs: +In the `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') =]] -``` + ``` 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') =]] -``` + ``` 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') =]] -``` + ``` php + [[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSession.php') =]] + ``` -- `CartSessionType` - defines the type of the collaboration session (in this case indicating it’s a Cart session): +- `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') =]] -``` + ``` php + [[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartSessionType.php') =]] + ``` ## Create mappers -Mappers are used to return session data into the format the database needs and to send it to the repository. +Mappers convert session data into the format required by the database and pass it to the repository. -In the `src/Collaboration/Cart/Mapper` folder create four mappers: +In the `src/Collaboration/Cart/Mapper` folder, create four mappers: -- `CartProxyMapper` - creates a simplified version of the Cart with only the necessary data to reduce memory usage in collaboration sessions. +- `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') =]] -``` + ``` php + [[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapper.php') =]] + ``` -- `CartProxyMapperInterface` - defines how a Cart should be converted into a simplified object used in collaboration session and specifies what methods the mapper must implement. +- `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') =]] -``` + ``` php + [[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartProxyMapperInterface.php') =]] + ``` -- `CartSessionDomainMapper` - builds the session object that the app works with. +- `CartSessionDomainMapper` - builds the session object from persistence object: -``` php -[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionDomainMapper.php') =]] -``` + ``` php + [[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionDomainMapper.php') =]] + ``` -- `CartSessionPersistenceMapper` - prepares session data to be saved or updated in the database. +- `CartSessionPersistenceMapper` - prepares session data to be saved or updated in the database: -``` php -[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php') =]] -``` + ``` php + [[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php') =]] + ``` -## Allow participants to access the Cart +## Allow participants to access Cart -To start collaborating, you need to work on permissions. +To enable collaboration, you must configure the appropriate permissions. This involves decorating the `PermissionResolver` and `CartResolver`. -This step makes sure that if a Cart is part of a Cart collaboration session, users can access it due to the given permission, and in all other cases, it falls back to the default implementation. +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" - Be careful when decorating permissions to change the behavior only as necessary, ensuring the Cart is shared only with the intended users. + 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, allowing 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`. +- `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') =]] -``` + ``` php + [[= include_file('code_samples/collaboration/src/Collaboration/Cart/PermissionResolverDecorator.php') =]] + ``` -- `CartResolverDecorator` – resolves the shared Carts in collaboration sessions, it checks if a Cart belongs to a collaboration session. +- `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') =]] -``` + ``` php + [[= include_file('code_samples/collaboration/src/Collaboration/Cart/CartResolverDecorator.php') =]] + ``` -## Build dedicated controllers to manage the Cart sharing flow +## Build dedicated controllers to manage Cart sharing flow -To support Cart sharing, you need to create controllers which handle the collaboration 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` - to create the Cart collaboration session and add participants -- `ShareCartJoinController` that enables joining the session. +- `ShareCartCreateController` - creates the Cart collaboration session and adds participants +- `ShareCartJoinController` - enables joining the session. ### `ShareCartCreateController` -When you enter the user email address and submit it, the request is handled by this controller. +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 next step, `addParticipant`, the user whose email address was provided is added to the session and assigned a scope (either `view` or `edit`). +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') =]] @@ -207,9 +208,9 @@ In the next step, `addParticipant`, the user whose email address was provided is ### `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 indicating that the session cannot be accessed. -If the session exists, the session parameter (`collaboration_session`) is retrieved and store the token. +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 @@ -219,7 +220,7 @@ Finally, `redirectToRoute` redirects the user to the Cart view and passes the id !!! 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 this parameter would cause it to be constantly overwritten. + 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 @@ -227,37 +228,43 @@ Finally, `redirectToRoute` redirects the user to the Cart view and passes the id 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 the 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. +- `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') =]] -``` + ``` php + [[= include_file('code_samples/collaboration/src/Form/Type/ShareCartType.php') =]] + ``` -- `ShareCartData` - this class holds the email address submitted through the form and pass it to the controller. +- `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') =]] -``` + ``` 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 following templates in the `templates/themes/storefront/cart` folder: +You need to add the following Twig templates in the `templates/themes/storefront/cart` folder: -- `share` - this Twig template 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. +- `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` - this Twig template 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. +![Share email](img/share_email.png) + +- `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` - is the template that shows the Cart page. It displays the Cart content and includes the “Share Cart” button and other elements for Cart collaboration. +![Share message](img/share_message.png) + +- `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') =]] ``` + +![Share button](img/share_button.png) 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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 literal 0 HcmV?d00001 diff --git a/docs/content_management/collaborative_editing/img/share_email.png b/docs/content_management/collaborative_editing/img/share_email.png new file mode 100644 index 0000000000000000000000000000000000000000..4452a59db09e54c734260e803f15f5f2cd89bec3 GIT binary patch literal 40921 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 literal 0 HcmV?d00001 diff --git a/docs/content_management/collaborative_editing/img/share_message.png b/docs/content_management/collaborative_editing/img/share_message.png new file mode 100644 index 0000000000000000000000000000000000000000..7788d2d88deea2f75a2a2792f86971e3c6df77f5 GIT binary patch literal 55147 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 z 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 HEa?9L9!Jn= literal 0 HcmV?d00001 From efe4ef435ca5fee679b80313491ea24746366049 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Fri, 13 Mar 2026 08:30:28 +0100 Subject: [PATCH 11/11] screenshots added --- .../extend_collaborative_editing.md | 163 ++++++++++++------ 1 file changed, 106 insertions(+), 57 deletions(-) diff --git a/docs/content_management/collaborative_editing/extend_collaborative_editing.md b/docs/content_management/collaborative_editing/extend_collaborative_editing.md index cee802209a..7e8f216d51 100644 --- a/docs/content_management/collaborative_editing/extend_collaborative_editing.md +++ b/docs/content_management/collaborative_editing/extend_collaborative_editing.md @@ -50,49 +50,76 @@ This way, the system uses the correct Gateway to get or save data for each sessi When creating the Database Gateways and mappers, you can use the built-in service tag: `ibexa.collaboration.persistence.session.gateway`: -```yaml - tags: - - { name: 'ibexa.collaboration.persistence.session.gateway' } -``` +- `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 `Collaboration/Cart/Persistence/Gateway` directory, create the following files: -- `DatabaseSchema` - defines and creates the database tables needed to store shared Cart collaboration session data: +- `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') =]] - ``` +``` 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, using a Discriminator to indicate the type of session (in this case, a Cart session): - ``` php - [[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Gateway/DatabaseGateway.php') =]] - ``` +``` 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 `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') =]] - ``` +``` 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') =]] - ``` +``` 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') =]] - ``` +``` php +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Persistence/Values/CartSessionUpdateStruct.php') =]] +``` ### Create Cart session Struct objects @@ -104,57 +131,71 @@ In the `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') =]] - ``` +``` 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') =]] - ``` +``` 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') =]] - ``` +``` 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') =]] - ``` +``` 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` folder, create four mappers: +In the `src/Collaboration/Cart/Mapper` folder, 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') =]] - ``` +``` 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') =]] - ``` +``` 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') =]] - ``` +``` 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') =]] - ``` +``` php +[[= include_file('code_samples/collaboration/src/Collaboration/Cart/Mapper/CartSessionPersistenceMapper.php') =]] +``` + +- `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 @@ -172,15 +213,23 @@ 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') =]] - ``` +``` 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') =]] - ``` +``` 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 @@ -230,15 +279,15 @@ The form collects the email address of the user that you want to invite, and the - `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') =]] - ``` +``` 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') =]] - ``` +``` 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.