From 8f8309e1f1a15262167e2113565810f6502b2258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Wed, 23 Jul 2025 14:34:36 +0200 Subject: [PATCH 1/4] [v5] Cherry-pick v5 changes to 4.6 (#2843) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * IBX-10245: Document 5.0 requirements (#2807) * IBX-10245: Document 5.0 requirements --------- Co-authored-by: Marek Nocoń * IBX-10225: v5.0 release notes and deprecations (#2825) * IBX-10225: v5.0 release notes and deprecations --------- Co-authored-by: Marek Nocoń * Procedure to update from 4.6 to 5.0 (#2760) --------- Co-authored-by: Marek Nocoń * Converted links into absolute ones * Update procedure to update from 4.6 to 5.0 (#2844) * update_to_5.0.md: SymfonySetList::SYMFONY_73 * update_to_5.0.md: Use [[= product_name =]] * update_to_5.0.md: Fix Ibexa.EOLWhitespace * Fix broken build by converting the link to absolute * Reverted main page changes * Updated link Co-authored-by: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> * Added latest_tag_5_0 --------- Co-authored-by: Tomasz Dąbrowski <64841871+dabrt@users.noreply.github.com> Co-authored-by: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> --- docs/getting_started/requirements.md | 142 ++- docs/release_notes/ibexa_dxp_v5.0.md | 360 ++++++ .../ibexa_dxp_v5.0_deprecations.md | 578 +++++++++ .../img/5.0_collaborative_invitation.jpg | Bin 0 -> 34568 bytes docs/snippets/release_50.md | 13 + .../from_4.6/update_to_5.0.md | 1064 +++++++++++++++++ .../from_5.0/update_from_5.0.md | 12 + docs/update_and_migration/update_ibexa_dxp.md | 19 +- mkdocs.yml | 6 + 9 files changed, 2179 insertions(+), 15 deletions(-) create mode 100644 docs/release_notes/ibexa_dxp_v5.0.md create mode 100644 docs/release_notes/ibexa_dxp_v5.0_deprecations.md create mode 100644 docs/release_notes/img/5.0_collaborative_invitation.jpg create mode 100644 docs/snippets/release_50.md create mode 100644 docs/update_and_migration/from_4.6/update_to_5.0.md create mode 100644 docs/update_and_migration/from_5.0/update_from_5.0.md diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index c7734965ee..bf0bbc9990 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -16,7 +16,7 @@ The following server requirements cover both running the software on-premise and For running on [Ibexa Cloud](https://www.ibexa.co/products/ibexa-cloud), where recommended configuration and support is provided out of the box, see separate [Ibexa Cloud section](#ibexa-cloud-requirements-and-setup) for further reading on its requirements. The minimal setup requires PHP, MySQL/MariaDB, Apache/Nginx, Node.js and `yarn`. -Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, NFS/EFS/S3 and Solr/Elasticsearch in a [clustered setup](clustering.md). +For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/EFS/S3 and Solr/Elasticsearch in a [clustered setup](clustering.md). !!! caution "Recommended versions" @@ -26,7 +26,18 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Operating system -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v5.0" + + |Name|Version| + |---|---| + |Debian 11 "Bullseye"|11.0-11.7+| + |Ubuntu "Noble Numbat"| 24.04 | + |RHEL / CentOS / CentOS Stream | 8.1-9.5+ | + + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + +=== "[[= product_name =]] v4.6" |Name|Version| |---|---| @@ -53,7 +64,16 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Web server -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v5.0" + + - Nginx 1.27+ + - Apache 2.4 (with required modules `mod_rewrite`, `mod_env` and recommended: `mod_setenvif`, `mod_expires`; + event MPM is recommended, if you need to use prefork you also need the `mod_php` module) + + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + +=== "[[= product_name =]] v4.6" - Nginx 1.18-1.25+ - Apache 2.4 (with required modules `mod_rewrite`, `mod_env` and recommended: `mod_setenvif`, `mod_expires`; @@ -69,7 +89,16 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## DBMS -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v5.0" + + - MariaDB 10.11+ + - MySQL 8.4 + - PostgreSQL 14 + + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + +=== "[[= product_name =]] v4.6" - MariaDB 10.3-10.11+ - MySQL 8.0, 8.4 @@ -106,7 +135,22 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ### PHP extensions -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v5.0" + + - `php-cli` + - `php-fpm` + - `php-mysql` (`php-mysqlnd`) or `php-pgsql` + - `php-xml` + - `php-mbstring` + - `php-process` (on RHEL/CentOS) + - `php-intl` + - `php-curl` + - `php-pear` (optional, provides pecl) + - `php-gd` or `php-imagick` (via pecl on RHEL/CentOS) + - `php-sodium` + - `php-bcmath` + +=== "[[= product_name =]] v4.6" - `php-cli` - `php-fpm` @@ -139,7 +183,11 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ### Cluster PHP extensions -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v5.0" + + - `php-redis` + +=== "[[= product_name =]] v4.6" - `php-redis` or `php-memcached` @@ -149,7 +197,12 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Search -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v5.0" + + - For content search, Solr 8.11.1 or higher. + Alternatively, Elasticsearch 7.16.2 or higher 7.x version. + +=== "[[= product_name =]] v4.6" - For content search, Solr 7.7 LTS or Solr 8, recommended 8.11.1 or higher. Alternatively, Elasticsearch 7.16.2 or higher 7.x version. - The above solutions require Oracle Java/Open JDK. The minimum requirement is 8 LTS, recommended 11 LTS. Newer versions are not supported. @@ -194,7 +247,16 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## [Clustering](clustering.md) -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v5.0" + + - Linux NFS or S3/EFS (for IO, aka binary files stored in content repository, not supported with legacy) + - Redis 7.2+ (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/latest/develop/reference/eviction/), session instance configured for persistence) + - [Varnish](http://varnish-cache.org/) 6.0LTS or 7.1 with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](http_cache.md) (for HTTP Cache) + + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + +=== "[[= product_name =]] v4.6" - Linux NFS or S3/EFS (for IO, aka binary files stored in content repository, not supported with legacy) - Redis 4.0+ or 5.0+ (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/latest/develop/reference/eviction/), session instance configured for persistence) or [Memcached](https://memcached.org/) 1.5 or higher @@ -222,7 +284,11 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Package manager -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v5.0" + + - Composer: recent 2.8 version + +=== "[[= product_name =]] v4.6" - Composer: recent 2.7 version @@ -232,7 +298,15 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Asset manager -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v5.0" + + - `Node.js` 22+ + - `yarn` 1.15.2+ + + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + +=== "[[= product_name =]] v4.6" - `Node.js` 18+, 20+, 22+ - `yarn` 1.15.2+ @@ -268,7 +342,53 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## [[= product_name_cloud =]] requirements and setup -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v5.0" + + ### Cloud hosting with [[= product_name_cloud =]] and Platform.sh + + In general, [[= product_name_cloud =]] supports all features and services of [Platform.sh](https://platform.sh/marketplace/ibexa/) that are compatible and supported by the [[= product_name =]] version you use. + + For example: + + - Platform.sh provides Redis support for versions 7.2, 7.0, and 6.2. [[= product_name =]] supports Redis version 7.2. + As a result, Redis is supported on [[= product_name_cloud =]] in versions 7.2. + + Features or services supported by [[= product_name =]] but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations). + + ### [[= product_name_cloud =]] Setup support matrix + + All [[= product_name =]] features are supported in accordance with the example above. + + !!! note + + As Platform.sh doesn't support a configuration with multiple PostgreSQL databases, for [[= product_name_cloud =]] / Platform.sh it's impossible to have a DFS table in a separate database. + + ### Recommended [[= product_name_cloud =]] setup + + For more details on recommended setup configuration see bundled `.platform.app.yaml` and `.platform/` configuration files. + + These files are kept up-to-date with latest recommendations and can be improved through contributions. + + ### Supported [[= product_name_cloud =]] setup + + Because of the large range of possible configurations of [[= product_name =]], there are many possibilities beyond what is provided in the default recommended configuration. + + Make sure to set aside time and budget for: + + - Verifying your requirements and ensuring they're supported by Platform.sh + - Additional time for adaptation and configuration work, and testing by your development team + - Additional consulting/onboarding time with Platform.sh, Ibexa technical services, and/or one of the many partners with prior experience in using Platform.sh with [[= product_name =]] + + The cost and effort of this isn't included in [[= product_name_cloud =]] subscription and is vary depending on the project. + + ### Custom integrations + + Features supported by [[= product_name =]], but not natively by Platform.sh, can in many cases be used by means of custom integrations with external services. + + For example, you can create an integration with S3 by means of setting up your own S3 bucket and configuring the relevant parts of [[= product_name =]]. + We recommend giving the development team working on the project access to the bucket to ensure work is done in a DevOps way without depending on external teams when changes are needed. + +=== "[[= product_name =]] v4.6" ### Cloud hosting with Ibexa Cloud and Platform.sh diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md new file mode 100644 index 0000000000..3f2fa1359d --- /dev/null +++ b/docs/release_notes/ibexa_dxp_v5.0.md @@ -0,0 +1,360 @@ +--- +description: Ibexa DXP v5.0 incorporates features brought by LTS Updates from previous versions, brings upgrades to the tech stack and improvements to developer experience. +title: Ibexa DXP v5.0 LTS +month_change: true +--- + + + +[[= release_notes_filters('Ibexa DXP v5.0 LTS', ['Headless', 'Experience', 'Commerce', 'LTS Update', 'New feature']) =]] + +
+ +[[% set version = 'v5.0.0' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2025-07-22', ['Headless', 'Experience', 'Commerce', 'New feature']) =]] + +### Notable changes + +This version incorporates into the product numerous features brought by [LTS Updates] from previous versions, brings upgrades to the tech stack and improvements to developer experience. + +#### AI Actions + +The AI Actions feature enhances the usability and flexibility of [[= product_name =]] by harnessing the potential of artificial intelligence to automate time-consuming editorial tasks. +By default, the AI Actions feature can help users with their work in following scenarios: + +- Refining text: when editing a content item, users can request that a passage selected in online editor is modified, for example, by adjusting the length of the text, changing its tone, or correcting linguistic errors +- Generating alternative text: when working with images, users can ask AI to generate alternative text for them, which helps improve accessibility and SEO + +![AI Assistant](ai_assistant.png) + +AI Actions integrate with [Ibexa Connect]([[= connect_doc =]]), giving you an opportunity to build complex data transformation workflows without having to rely on custom code. + +For more information, see [AI Actions product guide](ai_actions_guide.md). + +#### Discounts [[% include 'snippets/commerce_badge.md' %]] + +With Discounts, you can temporarily or permanently reduce prices on specific products or categories, making deals more attractive to potential buyers. + +Use them to encourage first-time purchases, reward loyal customers, promote new or slow-moving items, or drive sales during seasonal events. + +By displaying discounted prices clearly in the catalog or cart, businesses can create a sense of urgency, increase customer satisfaction, and ultimately boost revenue. + +![Discounts for products in the cart](4.6_discounts.png) + +For more information, see [Discounts product guide](discounts_guide.md). + +#### Date and time attribute + +The Date and time attributes allow you to represent date and time values as part of the product specification in the [Product Information Management](pim_guide.md) system. + +For more information, see [Date and time attributes](date_and_time.md). + +#### Symbol attribute + +The Symbol attributes allow you to efficiently represent the string-based data as part of the product specification in the [Product Information Management](pim_guide.md) system. + +For more information, see [Symbol attributes](https://doc.ibexa.co/en/5.0/pim/attributes/symbol_attribute_type/). + +#### Collaboration + +With Collaboration, multiple users can invite each other to work on the same content. +It is a starting point for future functionalities in the collaboration domain. + +![Collaboration invite](img/5.0_collaborative_invitation.jpg "Collaboration invite") + +For more information, see [Collaboration PHP API](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/namespaces/ibexa-contracts-collaboration.html) and [Share PHP API](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/namespaces/ibexa-contracts-share.html). + +### Software architecture upgrades + +With improved compatibility, performance and increased security, as well as better developer experience in mind, [[= product_name_base =]] decided to introduce several significant tech stack upgrades. + +For a full list of updated system requirements, see [Requirements](../getting_started/requirements.md). + +#### Symfony 7.3 + +With this release, [[= product_name =]] moves to Symfony 7.3 from the previously used versions of Symfony. + +For details, see [Symfony 7.3](https://symfony.com/blog/symfony-7-3-curated-new-features). + +#### Doctrine 3.9 + +By moving to Doctrine 3.9, [[= product_name =]] brings developers better performance, cleaner code, and stronger foundation for a more modern and maintainable application. + +#### PHP 8.3 + +With performance, coding safety and security in mind, with this version, [[= product_name =]] moves to [PHP 8.3](https://www.php.net/releases/8.3/en.php) and drops support for lower versions of the language. + +#### OpenAPI support + +Adding support for generating the [OpenAPI](https://www.openapis.org/) specification for our REST API makes future changes more manageable, and helps our partners automatically generate REST API clients. + +For more information, see [REST API usage](https://doc.ibexa.co/en/latehttps://doc.ibexa.co/en/5.0/api/rest_api/rest_api_usage/rest_api_usage/#openapi-support). + +Support for serialization and deserialization of REST payloads with the [Symfony Serializer](https://symfony.com/doc/current/serializer.html) component improves data reliability and simplifies debugging. + +#### React 19 + +[[= product_name =]]'s Back Office now uses [React 19](https://react.dev/blog/2024/12/05/react-19). +This upgrade enhances maintainability, unlocks new UI capabilities, and simplifies future feature development. + +### Developer experience + +#### New packages + +The following packages have been introduced in [[= product_name =]] v5.0.0: + +- ibexa/collaboration +- ibexa/connector-ai +- ibexa/connector-openai +- ibexa/discounts +- ibexa/discounts-codes +- ibexa/product-catalog-date-time-attribute +- ibexa/product-catalog-symbol-attribute +- ibexa/share + +#### REST APIs + +[[= product_name =]] v5.0.0 adds REST API coverage for the following features: + +- AI Actions: + - Action Configurations + - Action Types +- Discounts +- Collaboration + +#### PHP API + +The PHP API has been expanded with the following classes and interfaces: + +??? note "AI Actions" + + - [`Ibexa\Contracts\ConnectorAi\Action\Action`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-Action.html) + - [`Ibexa\Contracts\ConnectorAi\Action\ActionContext`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-ActionContext.html) + - [`Ibexa\Contracts\ConnectorAi\Action\ActionFactoryInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-ActionFactoryInterface.html) + - [`Ibexa\Contracts\ConnectorAi\Action\ActionHandlerInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-ActionHandlerInterface.html) + - [`Ibexa\Contracts\ConnectorAi\Action\ActionHandlerResolverInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-ActionHandlerResolverInterface.html) + - [`Ibexa\Contracts\ConnectorAi\Action\GenerateAltTextAction`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-GenerateAltTextAction.html) + - [`Ibexa\Contracts\ConnectorAi\Action\LLMBaseActionTypeInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-LLMBaseActionTypeInterface.html) + - [`Ibexa\Contracts\ConnectorAi\Action\RefineTextAction`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-RefineTextAction.html) + - [`Ibexa\Contracts\ConnectorAi\Action\RuntimeContext`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-RuntimeContext.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationCreateStruct`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationCreateStruct.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationCopyStruct`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationCopyStruct.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationListInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationListInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationOptions`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationOptions.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationQuery`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationQuery.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationUpdateStruct`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationUpdateStruct.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionHandlerOptionsFormMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionHandlerOptionsFormMapperInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionTypeOptionsFormMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionTypeOptionsFormMapperInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\OptionsFormatterInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-OptionsFormatterInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\ActionTypeFactoryInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-ActionTypeFactoryInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\ActionTypeInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-ActionTypeInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\ActionTypeRegistryInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-ActionTypeRegistryInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\OptionsValidatorError`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-OptionsValidatorError.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\OptionsValidatorInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-OptionsValidatorInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\OptionsValidatorRegistryInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-OptionsValidatorRegistryInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfigurationInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfigurationInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfigurationServiceDecorator`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfigurationServiceDecorator.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfigurationServiceInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfigurationServiceInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionHandlerRegistryInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionHandlerRegistryInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionResponseInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionResponseInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionServiceDecorator`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionServiceDecorator.html) + - [`Ibexa\Contracts\ConnectorAi\ActionServiceInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionServiceInterface.html) + - [`Ibexa\Contracts\ConnectorAi\AdapterAwareActionInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-AdapterAwareActionInterface.html) + - [`Ibexa\Contracts\ConnectorAi\DataType`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-DataType.html) + - [`Ibexa\Contracts\ConnectorAi\PromptResolverInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-PromptResolverInterface.html) + - [`Ibexa\Contracts\ConnectorAi\Prompt\PromptFactory`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Prompt-PromptFactory.html) + - [`Ibexa\Contracts\ConnectorAi\Prompt\PromptInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Prompt-PromptInterface.html) + - [`Ibexa\Contracts\ConnectorAi\PromptResolverInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-PromptResolverInterface.html) + - [`Ibexa\Contracts\ConnectorOpenAi\ClientProviderInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorOpenAi-ClientProviderInterface.html) + +??? note "Discounts" + + - [`Ibexa\Contracts\Discounts\DiscountConditionCriterionMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountConditionCriterionMapperInterface.html) + - [`Ibexa\Contracts\Discounts\DiscountFormMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountFormMapperInterface.html) + - [`Ibexa\Contracts\Discounts\DiscountPrioritizationStrategyInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountPrioritizationStrategyInterface.html) + - [`Ibexa\Contracts\Discounts\DiscountServiceDecorator`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountServiceDecorator.html) + - [`Ibexa\Contracts\Discounts\DiscountServiceInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountServiceInterface.html) + - [`Ibexa\Contracts\Discounts\DiscountValueFormatterInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountValueFormatterInterface.html) + - [`Ibexa\Contracts\Discounts\DiscountVariablesResolverInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountVariablesResolverInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\Form\DiscountValueFormTypeMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-Form-DiscountValueFormTypeMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\Form\FormThemeProviderInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-Form-FormThemeProviderInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\ConditionsMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-ConditionsMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\DiscountValueMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-DiscountValueMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\GeneralPropertiesMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-GeneralPropertiesMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\ProductConditionsMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-ProductConditionsMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\StepDataObjectMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-StepDataObjectMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\UserConditionsMapperInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-UserConditionsMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountConditionNotFoundException`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountConditionNotFoundException.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountExpressionInvalidArgumentException`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountExpressionInvalidArgumentException.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountExpressionRuntimeException`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountExpressionRuntimeException.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountNotFoundException`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountNotFoundException.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountRuleNotFoundException`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountRuleNotFoundException.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountValueResolutionException`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountValueResolutionException.html) + - [`Ibexa\Contracts\Discounts\Policy\AbstractDiscountPolicy`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-AbstractDiscountPolicy.html) + - [`Ibexa\Contracts\Discounts\Policy\Create`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-Create.html) + - [`Ibexa\Contracts\Discounts\Policy\Delete`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-Delete.html) + - [`Ibexa\Contracts\Discounts\Policy\Disable`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-Disable.html) + - [`Ibexa\Contracts\Discounts\Policy\Enable`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-Enable.html) + - [`Ibexa\Contracts\Discounts\Policy\Update`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-Update.html) + - [`Ibexa\Contracts\Discounts\Policy\View`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-View.html) + - [`Ibexa\Contracts\Discounts\Value\CartDiscountConditionInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-CartDiscountConditionInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountConditionInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountConditionInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountExpressionAwareInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountExpressionAwareInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountListInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountListInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountRuleInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountRuleInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountTranslationInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountTranslationInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountType`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountType.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountValueInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountValueInterface.html) + - [`Ibexa\Contracts\Discounts\Value\Struct\DiscountCreateStruct`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-DiscountCreateStruct.html) + - [`Ibexa\Contracts\Discounts\Value\Struct\DiscountStructInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-DiscountStructInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountTranslationStruct`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-DiscountTranslationStruct.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountUpdateStruct`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-DiscountUpdateStruct.html) + - [`Ibexa\Contracts\Discounts\Value\TranslationAwareDiscountStructInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-TranslationAwareDiscountStructInterface.html) + - [`Ibexa\Contracts\Discounts\Value\TranslationAwareDiscountStructTrait`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-TranslationAwareDiscountStructTrait.html) + - [`Ibexa\Contracts\DiscountsCodes\Exception\DiscountCodeNotFoundException`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Exception-DiscountCodeNotFoundException.html) + - [`Ibexa\Contracts\DiscountsCodes\Exception\DiscountCodeRateLimitExceededException`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Exception-DiscountCodeRateLimitExceededException.html) + - [`Ibexa\Contracts\DiscountsCodes\Exception\DiscountCodeUnusableException`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Exception-DiscountCodeUnusableException.html) + - [`Ibexa\Contracts\DiscountsCodes\Exception\DiscountCodeUserInvalidArgumentException`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Exception-DiscountCodeUserInvalidArgumentException.html) + - [`Ibexa\Contracts\DiscountsCodes\Value\DiscountCodeUsageInterface`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Value-DiscountCodeUsageInterface.html) + - [`Ibexa\Contracts\DiscountsCodes\Value\DiscountCodeUser`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Value-DiscountCodeUser.html) + - [`Ibexa\Contracts\DiscountsCodes\Value\Query\DiscountCodeUsageQuery`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Value-Query-DiscountCodeUsageQuery.html) + - [`Ibexa\Contracts\DiscountsCodes\Value\Struct\DiscountCodeCreateStruct `](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Value-Struct-DiscountCodeCreateStruct.html) + - [`Ibexa\Contracts\DiscountsCodes\Value\StructDiscountCodeUpdateStruct `](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Value-Struct-DiscountCodeUpdateStruct.html) + +??? note "PIM Attributes" + + - [`Ibexa\Contracts\ProductCatalogDateTimeAttribute`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/namespaces/ibexa-contracts-productcatalogdatetimeattribute.html) + - [Ibexa\Contracts\ProductCatalogSymbolAttribute](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/namespaces/ibexa-contracts-productcatalogsymbolattribute.html) + +#### Search Criteria + +The following search criteria have been added in the v5.0 release: + +??? note "AI Actions" + + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\Enabled`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-Enabled.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\Identifier`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-Identifier.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\LogicalAnd`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-LogicalAnd.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\LogicalOr`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-LogicalOr.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\Name`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-Name.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\Type`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-Type.html) + +??? note "Discounts" + + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\CreatedAtCriterion`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-CreatedAtCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\CreatorCriterion`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-CreatorCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\EndDateCriterion`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-EndDateCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\IdentifierCriterion`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-IdentifierCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\IsEnabledCriterion`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-IsEnabledCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\LogicalAnd`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-LogicalAnd.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\LogicalOr`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-LogicalOr.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\NameCriterion`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-NameCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\PriorityCriterion`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-PriorityCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\StartDateCriterion`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-StartDateCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\TypeCriterion`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-TypeCriterion.html) + +??? note "PIM Attributes" + + - [`Ibexa\Contracts\ProductCatalogDateTimeAttribute\Search\Criterion\DateTimeAttribute`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalogDateTimeAttribute-Search-Criterion-DateTimeAttribute.html) + - [`Ibexa\Contracts\ProductCatalogDateTimeAttribute\Search\Criterion\DateTimeAttributeRange`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalogDateTimeAttribute-Search-Criterion-DateTimeAttributeRange.html) + - [`Ibexa\Contracts\ProductCatalogSymbolAttribute\Search\Criterion\SymbolAttribute`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalogSymbolAttribute-Search-Criterion-SymbolAttribute.html) + +#### Sort Clauses + +The following sort clauses have been added in the v5.0 release: + +??? note "AI Actions" + + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\SortClause\Enabled`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-SortClause-Enabled.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\SortClause\Id`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-SortClause-Id.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\SortClause\Identifier`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-SortClause-Identifier.html) + +??? note "Discounts" + + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\CreatedAt`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-CreatedAt.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\EndDate`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-EndDate.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\Id`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-Id.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\Identifier`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-Identifier.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\Priority`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-Priority.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\StartDate`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-StartDate.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\Type`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-Type.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\UpdatedAt`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-UpdatedAt.html) + +#### Events + +The following events have been added in the v5.0 release: + +??? note "AI Actions" + + - [`\Ibexa\Contracts\ConnectorAi\Action\Event\BeforeExecuteEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-Event-BeforeExecuteEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\Action\Event\ExecuteEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-Event-ExecuteEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\BeforeCreateActionConfigurationEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-BeforeCreateActionConfigurationEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\CreateActionConfigurationEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-CreateActionConfigurationEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\BeforeUpdateActionConfigurationEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-BeforeUpdateActionConfigurationEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\UpdateActionConfigurationEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-UpdateActionConfigurationEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\BeforeDeleteActionConfigurationEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-BeforeDeleteActionConfigurationEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\DeleteActionConfigurationEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-DeleteActionConfigurationEvent.html) + - [`Ibexa\Contracts\ConnectorAi\Events\ContextEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Events-ContextEvent.html) + - [`Ibexa\Contracts\ConnectorAi\Events\ResolveActionConfigurationWidgetConfigEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Events-ResolveActionConfigurationWidgetConfigEvent.html) + - [`Ibexa\Contracts\ConnectorAi\Events\ResolveActionHandlerEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Events-ResolveActionHandlerEvent.html) + +??? note "Discounts" + + - [`\Ibexa\Contracts\Discounts\Event\BeforeCreateDiscountEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-BeforeCreateDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\CreateDiscountEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-CreateDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\BeforeDeleteDiscountEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-BeforeDeleteDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\DeleteDiscountEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-DeleteDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\BeforeUpdateDiscountEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-BeforeUpdateDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\UpdateDiscountEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-UpdateDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\CreateDiscountCreateStructEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-CreateDiscountCreateStructEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\CreateDiscountUpdateStructEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-CreateDiscountUpdateStructEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\CreateFormDataEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-CreateFormDataEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\MapDiscountToFormDataEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-MapDiscountToFormDataEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\Step\CreateFormDataEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-CreateFormDataEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\Step\MapCreateDataToStructEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-Step-MapCreateDataToStructEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\Step\MapDiscountToFormDataEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-MapDiscountToFormDataEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\Step\MapUpdateDataToStructEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-Step-MapUpdateDataToStructEvent.html) + - [`\Ibexa\Contracts\Discounts\Admin\Form\Event\PreDiscountCreateEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-Form-Event-PreDiscountCreateEvent.html) + - [`\Ibexa\Contracts\DiscountsCodes\Event\BeforeDiscountCodeApplyEvent`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Event-BeforeDiscountCodeApplyEvent.html) + +#### Twig functions + +The following Twig functions have been added in the v5.0 release: + +- [`ibexa_ai_config`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/ai_actions_twig_functions#ibexa_ai_config) +- [`ibexa_render_discount_rule_type`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/discounts_twig_functions#ibexa_render_discount_rule_type) +- [`ibexa_discounts_render_discount_badge`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/discounts_twig_functions#ibexa_discounts_render_discount_badge) +- [`ibexa_get_original_price`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/discounts_twig_functions#ibexa_get_original_price) +- [`ibexa_format_discount_value`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/discounts_twig_functions#ibexa_format_discount_value) +- [`ibexa_discounts_is_active`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/discounts_twig_functions#ibexa_discounts_is_active) +- [`ibexa_discounts_form_themes`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/discounts_twig_functions#ibexa_discounts_form_themes) +- [`ibexa_discounts_can_edit`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/discounts_twig_functions#ibexa_discounts_can_edit) +- [`ibexa_discounts_can_enable`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/discounts_twig_functions#ibexa_discounts_can_enable) +- [`ibexa_discounts_can_disable`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/discounts_twig_functions#ibexa_discounts_can_disable) +- [`ibexa_discounts_can_delete`](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/discounts_twig_functions#ibexa_discounts_can_delete) + +#### Other upgrades + +This release brings other minor upgrades intended to improve the developer's experience: + +- To improve code clarity, reliability, and error detection, type hint declarations that specify the expected data type have been added in multiple places throughout the product +- Developer experience has improved with capabilities offered by PHP in version 8.3. For example, the `AsTwigComponent` attribute [facilitates autoconfiguration](https://doc.ibexa.co/en/5.0/templating/components/#create-twig-component) of Twig components +- With protection against breaking changes and easier refactoring in mind, [TypeScript](https://www.typescriptlang.org/) can now be used to extend the Back Office +- [[[= product_name_base =]] Rector package](https://github.com/ibexa/rector) has been introduced that is based on [Rector](https://github.com/rectorphp) and comes with additional rules for working with Ibexa code. You can use it to get rid of PHP code deprecations +- [New icons](https://doc.ibexa.co/en/5.0/templating/twig_function_reference/icon_twig_functions#icons-reference) replace the ones found in previous versions and serve as a highlight of a future system design + +### Deprecations + +Refer to [Ibexa DXP v5.0 renames, deprecations and removals](ibexa_dxp_v5.0_deprecations.md) for a full list of changes and how they influence your project. + +### Full changelog + +[[% include 'snippets/release_50.md' %]] + +To update your application, see the [update instructions](../update_and_migration/from_4.6/update_to_5.0.md). + +[[= release_note_entry_end() =]] + +
diff --git a/docs/release_notes/ibexa_dxp_v5.0_deprecations.md b/docs/release_notes/ibexa_dxp_v5.0_deprecations.md new file mode 100644 index 0000000000..bb6c79075e --- /dev/null +++ b/docs/release_notes/ibexa_dxp_v5.0_deprecations.md @@ -0,0 +1,578 @@ + + +# Ibexa DXP v5.0 renames, deprecations and removals + +This page lists backwards compatibility breaks and deprecations introduced in [[= product_name =]] v5.0. + +!!! tip "Upgrade to v5" + + For a guide on moving your project to v5.0, + see [Update and migration instructions](../update_and_migration/from_4.6/update_to_5.0.md). + +[[= product_name =]] v5.0 introduces further modifications to significant parts of the code to align with the ones introduced in previous versions. + +These changes include dropped packages, changing database table and column names, field identifiers, namespaces, function names, and others. + +## Dropped packages + +[[= product_name =]] v5.0 no longer includes legacy Commerce packages. +The solution has been replaced with [Commerce](commerce.md) that is included as standard and has been continuously developed since v4.4. + +Also, packages `compatibility-layer` and `icons` have been dropped. + +## Database table and column names + +A number of database table and column names have changed. +If your custom code directly queries them, you need to update the code. + +| Old name | New name | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `ezbinaryfile` | `ibexa_binary_file` | +| `ezcobj_state` | `ibexa_object_state` | +| `ezcobj_state_group` | `ibexa_object_state_group` | +| `ezcobj_state_group_language` | `ibexa_object_state_group_language` | +| `ezcobj_state_language` | `ibexa_object_state_language` | +| `ezcobj_state_link` | `ibexa_object_state_link` | +| `ezcontent_language` | `ibexa_content_language` | +| `ezcontentbrowsebookmark` | `ibexa_content_bookmark` | +| `ezcontentclass` | `ibexa_content_type` | +| `ezcontentclass_attribute` | `ibexa_content_type_field_definition` | +| `ezcontentclass_attribute.contentclass_id` | `ibexa_content_type_field_definition.content_type_id` | +| `ezcontentclass_attribute_ml` | `ibexa_content_type_field_definition_ml` | +| `ezcontentclass_attribute_ml.contentclass_attribute_id` | `ibexa_content_type_field_definition_ml.content_type_field_definition_id` | +| `ezcontentclass_classgroup` | `ibexa_content_type_group_assignment` | +| `ezcontentclass_classgroup.contentclass_id` | `ibexa_content_type_group_assignment.content_type_id` | +| `ezcontentclass_name` | `ibexa_content_type_name` | +| `ezcontentclass_name.contentclass_id` | `ibexa_content_type_name.content_type_id` | +| `ezcontentclassgroup` | `ibexa_content_type_group` | +| `ezcontentobject` | `ibexa_content` | +| `ezcontentobject.contentclass_id` | `ibexa_content.content_type_id` | +| `ezcontentobject_attribute` | `ibexa_content_field` | +| `ezcontentobject_attribute.contentclassattribute_id` | `ibexa_content_field.content_type_field_definition_id` | +| `ezcontentobject_link` | `ibexa_content_relation` | +| `ezcontentobject_link.contentclassattribute_id` | `ibexa_content_relation.content_type_field_definition_id` | +| `ezcontentobject_name` | `ibexa_content_name` | +| `ezcontentobject_trash` | `ibexa_content_trash` | +| `ezcontentobject_tree` | `ibexa_content_tree` | +| `ezcontentobject_version` | `ibexa_content_version` | +| `ezdatebasedpublisher_scheduled_entries` | `ibexa_scheduler_scheduled_entries` | +| `ezdfsfile` | `ibexa_dfs_file` | +| `ezeditorialworkflow_markings` | `ibexa_workflow_markings` | +| `ezeditorialworkflow_transitions` | `ibexa_workflow_transitions` | +| `ezeditorialworkflow_workflows` | `ibexa_workflow_workflows` | +| `ezform_field_attributes` | `ibexa_form_field_attributes` | +| `ezform_field_validators` | `ibexa_form_field_validators` | +| `ezform_fields` | `ibexa_form_fields` | +| `ezform_form_submission_data` | `ibexa_form_form_submission_data` | +| `ezform_form_submissions` | `ibexa_form_form_submissions` | +| `ezform_forms` | `ibexa_form_forms` | +| `ezgmaplocation` | `ibexa_map_location` | +| `ezimagefile` | `ibexa_image_file` | +| `ezkeyword` | `ibexa_keyword` | +| `ezkeyword_attribute_link` | `ibexa_keyword_field_link` | +| `ezmedia` | `ibexa_media` | +| `eznode_assignment` | `ibexa_node_assignment` | +| `eznotification` | `ibexa_notification` | +| `ezpackage` | `ibexa_package` | +| `ezpage_attributes` | `ibexa_page_attributes` | +| `ezpage_blocks` | `ibexa_page_blocks` | +| `ezpage_blocks_design` | `ibexa_page_blocks_design` | +| `ezpage_blocks_visibility` | `ibexa_page_blocks_visibility` | +| `ezpage_map_attributes_blocks` | `ibexa_page_map_attributes_blocks` | +| `ezpage_map_blocks_zones` | `ibexa_page_map_blocks_zones` | +| `ezpage_map_zones_pages` | `ibexa_page_map_zones_pages` | +| `ezpage_pages` | `ibexa_page_pages` | +| `ezpage_zones` | `ibexa_page_zones` | +| `ezpolicy` | `ibexa_policy` | +| `ezpolicy_limitation` | `ibexa_policy_limitation` | +| `ezpolicy_limitation_value` | `ibexa_policy_limitation_value` | +| `ezpreferences` | `ibexa_preferences` | +| `ezrole` | `ibexa_role` | +| `ezsearch_object_word_link` | `ibexa_search_object_word_link` | +| `ezsearch_object_word_link.contentclass_id` | `ibexa_search_object_word_link.content_type_id` | +| `ezsearch_object_word_link.contentclass_attribute_id` | `ibexa_search_object_word_link.content_type_field_definition_id` | +| `ezsearch_word` | `ibexa_search_word` | +| `ezsection` | `ibexa_section` | +| `ezsite` | `ibexa_site` | +| `ezsite_data` | `ibexa_site_data` | +| `ezsite_public_access` | `ibexa_site_public_access` | +| `ezurl` | `ibexa_url` | +| `ezurl_object_link` | `ibexa_url_content_link` | +| `ezurlalias` | `ibexa_url_alias` | +| `ezurlalias_ml` | `ibexa_url_alias_ml` | +| `ezurlalias_ml_incr` | `ibexa_url_alias_ml_incr` | +| `ezurlwildcard` | `ibexa_url_wildcard` | +| `ezuser` | `ibexa_user` | +| `ezuser_accountkey` | `ibexa_user_accountkey` | +| `ezuser_role` | `ibexa_user_role` | +| `ezuser_setting` | `ibexa_user_setting` | + +## Field type identifiers + +Several field type identifiers have changed. + +| Old identifier (`legacy_alias`) | New identifier (`alias`) | +|:--------------------------------|:--------------------------------| +| `ezauthor` | `ibexa_author` | +| `ezbinaryfile` | `ibexa_binaryfile` | +| `ezboolean` | `ibexa_boolean` | +| `ezcontentquery` | `ibexa_content_query` | +| `ezcountry` | `ibexa_country` | +| `ezdate` | `ibexa_date` | +| `ezdatetime` | `ibexa_datetime` | +| `ezemail` | `ibexa_email` | +| `ezfloat` | `ibexa_float` | +| `ezform` | `ibexa_form` | +| `ezgmaplocation` | `ibexa_gmap_location` | +| `ezimage` | `ibexa_image` | +| `ezimageasset` | `ibexa_image_asset` | +| `ezinteger` | `ibexa_integer` | +| `ezisbn` | `ibexa_isbn` | +| `ezkeyword` | `ibexa_keyword` | +| `ezlandingpage` | `ibexa_landing_page` | +| `ezmatrix` | `ibexa_matrix` | +| `ezmedia` | `ibexa_media` | +| `ezobjectrelation` | `ibexa_object_relation` | +| `ezobjectrelationlist` | `ibexa_object_relation_list` | +| `ezrichtext` | `ibexa_richtext` | +| `ezselection` | `ibexa_selection` | +| `ezstring` | `ibexa_string` | +| `eztext` | `ibexa_text` | +| `eztime` | `ibexa_time` | +| `ezurl` | `ibexa_url` | +| `ezuser` | `ibexa_user` | + +## PHP API classes and methods + +!!! note "[[= product_name_base =]] Rector" + + [[[= product_name_base =]] Rector package](https://github.com/ibexa/rector) has been introduced that is based on [Rector](https://github.com/rectorphp) and comes with additional rules for working with Ibexa code. + You can use it to get rid of PHP code deprecations. + +### `ibexa/admin-ui` + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface::getContentCreateLimitations`| `\Ibexa\AdminUi\Permission\LimitationResolverInterface::getContentCreateLimitations` | +| `\Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface::getContentUpdateLimitations` | `\Ibexa\AdminUi\Permission\LimitationResolverInterface::getContentUpdateLimitations` | +| `\Ibexa\Contracts\AdminUi\UniversalDiscovery\Provider::getRestFormat` | Removed | +| `\Ibexa\AdminUi\Form\Type\Search\DateIntervalType` | `\Ibexa\AdminUi\Form\Type\Date\DateIntervalType`| +| `\Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface::getSiteaccessesForLocation`| `\Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface::getSiteAccessesList`| +| `\Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface::getSiteaccesses`| `\Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface::getSiteAccessesList`| +| `\Ibexa\AdminUi\Specification\AbstractSpecification`| `\Ibexa\Contracts\Core\Specification\AbstractSpecification`| +| `\Ibexa\AdminUi\Specification\AndSpecification` | `\Ibexa\Contracts\Core\Specification\AndSpecification` | +| `\Ibexa\AdminUi\Specification\NotSpecification` | `\Ibexa\Contracts\Core\Specification\NotSpecification` | +| `\Ibexa\AdminUi\Specification\OrSpecification` | `\Ibexa\Contracts\Core\Specification\OrSpecification` | +| `\Ibexa\AdminUi\Specification\SpecificationInterface` | `\Ibexa\Contracts\Core\Specification\SpecificationInterface` | +| `\Ibexa\AdminUi\Tab\Dashboard\PagerContentToDataMapper` | `\Ibexa\AdminUi\Tab\Dashboard\PagerLocationToDataMapper` | +| `\Ibexa\AdminUi\Translation\Extractor\LimitationTranslationExtractor` | Removed | +| `\Ibexa\AdminUi\Translation\Extractor\PolicyTranslationExtractor` | Removed | +| `\Ibexa\AdminUi\UI\Dataset\ContentDraftsDataset` | `\Ibexa\AdminUi\UI\Dataset\ContentDraftListDataset` | +| `\Ibexa\AdminUi\UI\Dataset\DatasetFactory::relations` | `\Ibexa\AdminUi\UI\Dataset\DatasetFactory::relationList` | +| `\Ibexa\AdminUi\UI\Dataset\DatasetFactory::contentDrafts` | `\Ibexa\AdminUi\UI\Dataset\DatasetFactory::contentDraftList` | +| `\Ibexa\AdminUi\UI\Value\ValueFactory::createRelation` | `\Ibexa\AdminUi\UI\Value\ValueFactory::createRelationItem` | +| `\Ibexa\AdminUi\Validator\ValidationErrorsProcessor` | `\Ibexa\ContentForms\Validator\ValidationErrorsProcessor` | +| `\Ibexa\AdminUi\Validator\Constraints\FieldTypeValidator` | `\Ibexa\ContentForms\Validator\Constraints\FieldTypeValidator` | + +### `ibexa/cart` + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Cart\Money\MoneyFactory`| `\Ibexa\ProductCatalog\Money\IntlMoneyFactory`| + +### `ibexa/content-forms` + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\ContentForms\Controller\UserRegisterController`| `\Ibexa\Bundle\User\Controller\UserRegisterController`| +| `\Ibexa\ContentForms\User\View\UserRegisterConfirmView`| `\Ibexa\User\View\UserRegisterConfirmView`| +| `\Ibexa\ContentForms\User\View\UserRegisterFormView`| `\Ibexa\User\View\UserRegisterFormView`| + +### `ibexa/core` + +Support for facet search has been dropped, use the `Aggregation` API instead. + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\Core\DependencyInjection\Security\PolicyProvider\RepositoryPolicyProvider`| Removed | +| `\Ibexa\Bundle\Core\Imagine\VariationPathGenerator`| `\Ibexa\Contracts\Core\Variation\VariationPathGenerator`| +| `\Ibexa\ContentForms\User\View\UserRegisterFormView`| `\Ibexa\User\View\UserRegisterFormView`| +| `/Ibexa\Bundle\Debug\Collector\PersistenceCacheCollector::getCount` | `\Ibexa\Bundle\Debug\Collector\PersistenceCacheCollector::getStats` | +| `\Ibexa\Bundle\RepositoryInstaller\Installer\Installer::createConfiguration` | Deprecated | +| `\Ibexa\Contracts\Core\FieldType\FieldStorage::getIndexData` | `\Ibexa\Contracts\Core\FieldType\Indexable` | +| `\Ibexa\Contracts\Core\FieldType\BinaryBase\PathGenerator` | `\Ibexa\Contracts\Core\FieldType\BinaryBase\PathGeneratorInterface` | +| `\Ibexa\Contracts\Core\IO\BinaryFile::$mimeType` | `\Ibexa\Core\IO\IOMetadataHandler::getMimeType` | +| `\Ibexa\Contracts\Core\Persistence\Handler::beginTransaction` | `\Ibexa\Contracts\Core\Persistence\TransactionHandler::beginTransaction` | +| `\Ibexa\Contracts\Core\Persistence\Handler::commit` | `\Ibexa\Contracts\Core\Persistence\TransactionHandler::commit` | +| `\Ibexa\Contracts\Core\Persistence\Handler::rollback` | `\Ibexa\Contracts\Core\Persistence\TransactionHandler::rollback` | +| `\Ibexa\Contracts\Core\Persistence\Bookmark\Bookmark::$name` | Removed | +| `\Ibexa\Contracts\Core\Persistence\Bookmark\CreateStruct::$name` | Removed | +| `\Ibexa\Contracts\Core\Persistence\Content\ContentInfo::STATUS_ARCHIVED` | `\Ibexa\Contracts\Core\Persistence\Content\ContentInfo::STATUS_TRASHED` | +| `\Ibexa\Contracts\Core\Persistence\Content\ContentInfo::$isPublished` | Removed. Use `ContentInfo::$status` with value `STATUS_PUBLISHED`. | +| `\Ibexa\Contracts\Core\Persistence\Content\LoadStruct` | Removed | +| `\Ibexa\Contracts\Core\Persistence\Content\Location::$pathIdentificationString` | Removed | +| `\Ibexa\Contracts\Core\Persistence\Content\Location\CreateStruct::$pathIdentificationString` | Removed | +| `\Ibexa\Contracts\Core\Persistence\Content\Location\Handler::markSubtreeModified` | Removed | +| `\Ibexa\Contracts\Core\Persistence\FieldType\IsEmptyValue` | Removed | +| `\Ibexa\Contracts\Core\Persistence\User\Handler::loadPoliciesByUserId` | Removed | +| `\Ibexa\Contracts\Core\Repository\ContentService::loadContentDrafts` | `\Ibexa\Contracts\Core\Repository\ContentService::loadContentDraftList` | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Location::SORT_FIELD_MODIFIED_SUBNODE` | Removed | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\LogicalOperator::getSpecifications` | Removed | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Location\IsMainLocation::createFromQueryBuilder` | Removed. Use the constructor directly. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Location\Priority::createFromQueryBuilder` | Removed. Use the constructor directly. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\ContentTypeFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\CriterionFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\DateRangeFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\FieldFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\FieldRangeFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\Location` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\LocationFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\SectionFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\TermFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\UserFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\Location\LocationFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\SearchResult::$facets` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\SearchResult::$spellSuggestion` | `\Ibexa\Contracts\Core\Repository\Values\Content\Search\SearchResult::$spellcheck` | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\ContentTypeFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\CriterionFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\DateRangeFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\FieldFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\FieldRangeFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\LocationFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\RangeFacetEntry` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\SectionFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\TermFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\UserFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Trash\SearchResult::$count` | `\Ibexa\Contracts\Core\Repository\Values\Content\Trash\SearchResult::$totalCount` | +| `\Ibexa\Contracts\Core\Repository\Values\ContentType\ContentType::@$isContainer` | `\Ibexa\Contracts\Core\Repository\Values\ContentType\ContentType::isContainer` | +| `\Ibexa\Contracts\Core\User\Identity` | Removed. Use the `FOSHttpCacheBundle` user context feature. | +| `\Ibexa\Core\Event\UserService` | Listen to `BeforeUpdateUserPasswordEvent` instead of `BeforeUpdateUserEvent`. | +| `\Ibexa\Core\Event\UserService` | Listen to `UpdateUserPasswordEvent` instead of `UpdateUserEvent`. | +| `\Ibexa\Core\FieldType\GatewayBasedStorage` | `\Ibexa\Contracts\Core\FieldType\GatewayBasedStorage` | +| `\Ibexa\Core\FieldType\StorageGateway` | `\Ibexa\Contracts\Core\FieldType\StorageGatewayInterface` | +| `\Ibexa\Core\FieldType\Image\Value::@$path` | Equivalent to `$id` or `$inputUri`, depending on which one is set. | +| `\Ibexa\Core\FieldType\Image\Value::fromString` | `\Ibexa\Core\FieldType\FieldType::acceptValue` | +| `\Ibexa\Core\Helper\FieldHelper::getFieldDefinition` | If content exists, use `$content->getContentType()->getFieldDefinition($identifier)`. | +| `\Ibexa\Core\Helper\PreviewLocationProvider::loadMainLocation` | `\Ibexa\Core\Helper\PreviewLocationProvider::loadMainLocationByContent` | +| `\Ibexa\Core\IO\IOServiceInterface::getExternalPath` | `\Ibexa\Core\IO\IOServiceInterface::loadBinaryFileByUri` | +| `\Ibexa\Core\IO\IOServiceInterface::getInternalPath` | Removed. Use the `uri` property. | +| `\Ibexa\Core\IO\MetadataHandler` | Removed | +| `\Ibexa\Core\IO\MetadataHandler\ImageSize` | Removed | +| `\Ibexa\Core\IO\Values\BinaryFile::$mimeType` | `\Ibexa\Core\IO\IOServiceInterface::getMimeType` | +| `\Ibexa\Core\MVC\Symfony\MVCEvents::CACHE_CLEAR_CONTENT` | Removed | +| `\Ibexa\Core\MVC\Symfony\Event\ContentCacheClearEvent` | Removed | +| `\Ibexa\Core\MVC\Symfony\Locale\LocaleConverterInterface::convertToEz` | `\Ibexa\Core\MVC\Symfony\Locale\LocaleConverterInterface::convertToRepository` | +| `\Ibexa\Core\MVC\Symfony\SiteAccess\Matcher\Regex\Host` | Removed | +| `\Ibexa\Core\MVC\Symfony\SiteAccess\Matcher\Regex\URI` | Removed | +| `\Ibexa\Core\MVC\Symfony\View\Provider\Content` | Removed | +| `\Ibexa\Core\MVC\Symfony\View\Provider\Location` | Removed | +| `\Ibexa\Core\Persistence\Cache\PersistenceLogger::getCount` | `\Ibexa\Core\Persistence\Cache\PersistenceLogger::getStats` | +| `\Ibexa\Core\Persistence\Legacy\Handler::beginTransaction` | Removed. Use `\Ibexa\Contracts\Core\Persistence\TransactionHandler\TransactionHandler::beginTransaction`. | +| `\Ibexa\Core\Persistence\Legacy\Handler::commit` | Removed. Use `\Ibexa\Contracts\Core\Persistence\TransactionHandler\TransactionHandler::commit`. | +| `\Ibexa\Core\Persistence\Legacy\Handler::rollback` | Removed. Use `\Ibexa\Contracts\Core\Persistence\TransactionHandler\TransactionHandler::rollback`. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\AuthorConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\BinaryFileConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\CheckboxConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\CountryConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTimeConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter` | Removed the `timestamp` property. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\DateConverter` | Removed the `timestamp` property. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\DateConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\EmailAddressConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\FloatConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\IntegerConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\ISBNConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\KeywordConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\MapLocationConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\MediaConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\NullConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\RelationConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\SelectionConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\TextBlockConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\TextLineConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\TimeConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\UrlConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\Language\MaskGenerator::generateLanguageMask` | `\Ibexa\Core\Persistence\Legacy\Content\Language\MaskGenerator::generateLanguageMaskFromLanguageCodes` | +| `\Ibexa\Core\Repository\PermissionsCriterionHandler` | Removed | +| `\Ibexa\Core\Repository\SectionService::countAssignedContents` | Deprecated. Use `SearchService` with `Section` criterion. | +| `\Ibexa\Core\Repository\Helper\NameSchemaService` | `\Ibexa\Contracts\Core\Repository\NameSchema\NameSchemaServiceInterface` | +| `\Ibexa\Core\Repository\Helper\RoleDomainMapper` | Removed | +| `\Ibexa\Core\Repository\Mapper\ContentTypeDomainMapper::buildSPIFieldDefinitionUpdate` | `\Ibexa\Core\Repository\Mapper\ContentTypeDomainMapper::buildSPIFieldDefinitionFromUpdateStruct` | +| `\Ibexa\Core\Repository\Mapper\ContentTypeDomainMapper::buildSPIFieldDefinitionCreate` | `\Ibexa\Core\Repository\Mapper\ContentTypeDomainMapper::buildSPIFieldDefinitionFromCreateStruct` | +| `\Ibexa\Core\Repository\User\PasswordHashServiceInterface` | `\Ibexa\Contracts\Core\Repository\PasswordHashService` | +| `\Ibexa\Core\Search\Common\FieldNameResolver::getFieldNamesget` | `\Ibexa\Core\Search\Common\FieldNameResolver::getFieldTypes` | +| `\Ibexa\Core\Search\Common\IncrementalIndexer::createSearchIndex` | Removed | +| `\Ibexa\Tests\Integration\Core\Repository\BaseTest::isVersion4` | Removed | +| `\Ibexa\Tests\Integration\Core\Repository\SearchServiceTest::testDeprecatedCriteriaProperty` | Removed | +| `\Ibexa\Tests\Core\Repository\Service\Mock\PermissionsCriterionHandlerTest` | Removed | +| `\Ibexa\Contracts\Core\Repository\Values\Translation` | Implementations must implement `\Stringable` interface. | +| `\Ibexa\Bundle\Core\ApiLoader\RepositoryConfigurationProvider` | Deprecated. Use `\Ibexa\Contracts\Core\Container\ApiLoader\RepositoryConfigurationProviderInterface`. | +| `\Ibexa\Bundle\Core\ApiLoader\RepositoryFactory` | Deprecated. Use `\Ibexa\Core\Base\Container\ApiLoader\RepositoryFactory`.| + +!!! note "Dropped single colon notation" + + [[= product_name_base =]]-named controllers can no longer be referenced using a single-colon notation. + For example, `ibexa_content:viewAction` must be changed to `ibexa_content::viewAction`. + + The change affects the following controllers: + + - ibexa_content + - ibexa_query + - ibexa_query_render + - ibexa.controller.content.preview + +### ibexa/corporate-account + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\CorporateAccount\Controller\ApplicationController\PersistenceCacheCollector::alreadyExistsAction`| Removed | + +### ibexa/design-engine + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\DesignEngine\Templating\TemplateNameResolverInterface::EZ_DESIGN_NAMESPACE`| Removed. Use the `\Ibexa\Contracts\DesignEngine\DesignAwareInterface::DESIGN_NAMESPACE` constant. | + +### ibexa/elasticsearch + +Support for facets in `ibexa/elasticsearch` has been dropped, use the `Aggregation` API instead. + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Contracts\Elasticsearch\Query\FacetBuilderVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Elasticsearch\Query\FacetResultExtractor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\AbstractTermsVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\ContentTypeVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\DispatcherVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\FilteredFacetVisitorDecorator` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\GlobalFacetVisitorDecorator` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\SectionVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\UserVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\AbstractTermsResultExtractor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\ContentTypeResultExtractor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\DispatcherResultExtractor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\FilteredFacetResultExtractorDecorator` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\GlobalFacetResultExtractorDecorator` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\SectionResultExtractor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\UserResultExtractor` | Removed. Use the `Aggregation` API. | + +### ibexa/fieldtype-page + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\FieldTypePage\DependencyInjection\Compiler\AbstractConfigurationAwareCompilerPass::EXTENSION_CONFIG_KEY` | Removed. Use the `\Ibexa\Bundle\FieldTypePage\DependencyInjection\IbexaFieldTypePageExtension::EXTENSION_NAME` constant. | +| `\Ibexa\Bundle\FieldTypePage\DependencyInjection\Compiler\BlockDefinitionConfigurationCompilerPass::EXTENSION_CONFIG_KEY` | Removed. Use the `\Ibexa\Bundle\FieldTypePage\DependencyInjection\IbexaFieldTypePageExtension::EXTENSION_NAME` constant. | +| `\Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Event\Listener\PreviewTemplateEventSubscriber` | Removed | +| `\Ibexa\FieldTypePage\ScheduleBlock\ScheduleService::distributeItems` | Removed | + +### ibexa/fieldtype-query + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\FieldTypeQuery\QueryFieldPaginationService` | Removed | +| `\Ibexa\FieldTypeQuery\Persistence\Legacy\Content\FieldValue\Converter\QueryConverter::create` | Removed. Use the default constructor. | + +### ibexa/fieldtype-richtext + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\FieldTypeRichText\Translation\Extractor\OnlineEditorCustomAttributesExtractor` | Removed | +| `\Ibexa\FieldTypeQuery\Persistence\Legacy\Content\FieldValue\Converter\QueryConverter::create` | Removed. Use the default constructor. | + +!!! note "Missing custom tag configuration error" + + If the stored RichText record includes any custom tags that aren’t configured or recognized, saving the content will cause a validation error. + +### ibexa/form-builder + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\FormBuilder\DependencyInjection\Configuration::TREE_ROOT` | Removed. Use the `\Ibexa\Bundle\FormBuilder\DependencyInjection\IbexaFormBuilderExtension::EXTENSION_NAME` constant. | +| `\Ibexa\FormBuilder\FieldType\Storage\FormStorage::getIndexData` | Removed | + +### ibexa/graphql + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\GraphQL\Schema\ImagesVariationsBuilder` | Removed | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentCollectionField` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemConnectionField` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentConnection` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemConnectionName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentCreateInputName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemCreateInputName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentUpdateInputName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemUpdateInputName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentTypeName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemUpdateInputName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentField` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemField` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainMutationCreateContentField` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemMutationCreateItemField` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainMutationUpdateContentField` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemMutationUpdateItemField` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainGroupName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemGroupName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainGroupTypesName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemGroupTypesName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\FieldDefinitionArgsBuilderMapper` | `\Ibexa\Contracts\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\FieldDefinitionMapper` | +| `\Ibexa\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\FieldDefinitionInputMapper` | `\Ibexa\Contracts\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\FieldDefinitionMapper` | + +### ibexa/measurement + +!!! note "Dropped `measurement` product attribute" + + The deprecated product attribute `measurement` has been removed. + The change does not affect the [measurement field type](measurementfield.md). + +### ibexa/migrations + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Migration\ValueObject\ContentType\Matcher::CONTENT_TYPE_IDENTIFIER` | Removed. Use the `\Ibexa\Migration\StepExecutor\ContentType\IdentifierFinder::CONTENT_TYPE_IDENTIFIER` constant. | + +### ibexa/product-catalog + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\ProductCatalog\Bridge` | Migrate data to a local product catalog. | + +### ibexa/page-builder + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\PageBuilder\DependencyInjection\IbexaPageBuilderExtension::SESSION_KEY_SITEACCESS` | Removed | +| `\Ibexa\PageBuilder\PageBuilder\PreviewLanguageCodeResolver` | Removed | +| `\Ibexa\PageBuilder\Siteaccess\SiteaccessService::resolveSiteAccessForLocation` | `\Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface::getSiteAccessesListForLocation` | +| `\Ibexa\PageBuilder\Siteaccess\SiteaccessService::resolveSiteAccessForContent` | `\Ibexa\Contracts\PageBuilder\Siteaccess\SiteAccessResolver::resolveSiteAccessForContent` | +| `\Ibexa\PageBuilder\Siteaccess\SiteaccessService::resolveSiteAccessBasedOnLanguage` | Removed | + +### ibexa/rest + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\Rest\EventListener\CsrfListener::isLoginRequest` | Add `csrf_protection: false` attribute to route definition. | +| `\Ibexa\Bundle\Rest\EventListener\CsrfListener::isSessionRoute` | Add `csrf_protection: false` attribute to route definition. | +| `\Ibexa\Bundle\Rest\EventListener\RequestListener::REST_PREFIX_PATTERN` | Use `\Ibexa\Contracts\Rest\UriParser\UriParserInterface::isRestRequest` function. | +| `\Ibexa\Bundle\Rest\EventListener\RequestListener::hasRestPrefix` | Use `\Ibexa\Contracts\Rest\UriParser\UriParserInterface::isRestRequest` function. | +| `\Ibexa\Bundle\Rest\RequestParser\Router` | `\Ibexa\Contracts\Rest\UriParser\UriParserInterface` | +| `\Ibexa\Contracts\Rest\Output\Generator::generateMediaType` | `\Ibexa\Contracts\Rest\Output\Generator::generateMediaTypeWithVendor` | +| `\Ibexa\Rest\Output\FieldTypeSerializer::serializeFieldValue` | `\Ibexa\Rest\Output\FieldTypeSerializer::serializeContentFieldValue` | +| `\Ibexa\Rest\Server\Controller\Content::createView` | Forwards the request to the new `/views` location, but returns a 301. | +| `\Ibexa\Rest\Server\Controller\User::$csrfTokenStorage` | Removed | +| `\Ibexa\Rest\Server\Controller\User::$sessionController` | Removed | +| `\Ibexa\Rest\Server\Controller\User::createSession` | `\Ibexa\Rest\Server\Controller\SessionController::refreshSessionAction` | +| `\Ibexa\Rest\Server\Controller\User::refreshSession` | `\Ibexa\Rest\Server\Controller\SessionController::refreshSessionAction` | +| `\Ibexa\Rest\Server\Controller\User::deleteSession` | `\Ibexa\Rest\Server\Controller\SessionController::refreshSessionAction` | + +### ibexa/ibexa/scheduler + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\Rest\EventListener\CsrfListener::isLoginRequest` | Add `csrf_protection: false` attribute to route definition. | + +### ibexa/site-factory + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\SiteFactory\DependencyInjection\Configuration::TREE_ROOT` | Removed. Use the `\Ibexa\Bundle\SiteFactory\DependencyInjection\IbexaSiteFactoryExtension::EXTENSION_NAME` constant. | +| `\Ibexa\SiteFactory\Event\EventDispatcher` | Removed | +| `\Ibexa\SiteFactory\ServiceDecorator\SiteServiceDecorator` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\BeforeCreateSiteEvent` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\BeforeDeleteSiteEvent` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\BeforeUpdateSiteEvent` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\CreateSiteEvent` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\DeleteSiteEvent` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\UpdateSiteEvent` | Removed | + +### ibexa/solr + +Support for facet search has been dropped, use the `Aggregation` API instead. + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Solr\Handler::$resultExtractor` | Use `$contentResultExtractor` or `$locationResultExtractor`. | +| `\Ibexa\Solr\Gateway\UpdateSerializer` | `\Ibexa\Solr\Gateway\UpdateSerializer\XmlUpdateSerializer` | +| `\Ibexa\Solr\Query\FacetBuilderVisitor` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\FacetFieldVisitor` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\Common\FacetBuilderVisitor\Aggregate` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\Common\FacetBuilderVisitor\ContentType` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\Common\FacetBuilderVisitor\Section` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\Common\FacetBuilderVisitor\User` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\Content\CriterionVisitor\Field` | `\Ibexa\Solr\Query\Common\CriterionVisitor\Field` | + +### ibexa/storefront + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Contracts\Storefront\Repository\TaxonomyTreeServiceInterface::getPath` | `\Ibexa\Contracts\Taxonomy\Service\TaxonomyServiceInterface::getPath` | + +### ibexa/system-info + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\SystemInfo\SystemInfo\Collector\IbexaSystemInfoCollector::CONTENT_PACKAGES` | Removed. Use the `\Ibexa\Bundle\SystemInfo\SystemInfo\Collector\IbexaSystemInfoCollector::HEADLESS_PACKAGES` constant. | +| `\Ibexa\Bundle\SystemInfo\SystemInfo\Collector\IbexaSystemInfoCollector::ENTERPRISE_PACKAGES` | Removed. Use `IbexaSystemInfoCollector::EXPERIENCE_PACKAGES` or `IbexaSystemInfoCollector::HEADLESS_PACKAGES` constant. | +| `\Ibexa\Bundle\SystemInfo\SystemInfo\Value\IbexaSystemInfo::$stability` | `\Ibexa\Bundle\SystemInfo\SystemInfo\Value\IbexaSystemInfo` is considered internal. | + +### ibexa/workflow + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Contracts\Workflow\Service\WorkflowServiceInterface::loadWorkflowMetadataOriginatedByUser` | Removed | +| `\Ibexa\Contracts\Workflow\Service\WorkflowServiceInterface::loadAllWorkflowMetadata` | Removed | + +## Services + +The following service definitions have been removed: + +| Service name | Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `ibexa.cart.number_formatter.currency.factory` | Removed | + +## JavaScript classes and functions + +|Old class or function|New class or function| +|:----|:----| +| `formatLine` const in `/src/bundle/Resources/public/js/scripts/helpers/form.error.helper.js` | Removed | +| `parseAll` const in `/src/bundle/Resources/public/js/scripts/helpers/middle.ellipsis.js` | Removed | +| `fileSizeToString` const in `src/bundle/ui-dev/src/modules/multi-file-upload/helpers/text.helper.js` | Use `fileSizeToString` function from `/src/bundle/ui-dev/src/modules/common/helpers/text.helper.js`. | +| `src/bundle/ui-dev/src/modules/common/components/backdrop/backdrop.js` | Use the `ibexa.core.Backdrop` component. | +| `src/bundle/ui-dev/src/modules/page-builder/components/block/sidebar.block.js` | `src/bundle/ui-dev/src/modules/page-builder/components/block/block.js` | +| `src/bundle/ui-dev/src/modules/page-builder/components/block/sidebar.blocks.group.js` | `src/bundle/ui-dev/src/modules/page-builder/components/block/blocks.group.js` | +| `src/bundle/ui-dev/src/modules/page-builder/components/sidebar/sidebar.js` | `src/bundle/ui-dev/src/modules/page-builder/components/toolbox.js` | +| `src/bundle/ui-dev/src/modules/tree-builder/components/indentation-vertical/indentation.vertical.js)`| `src/bundle/ui-dev/src/modules/tree-builder/components/indentation-horizontal/indentation.horizontal.js` | +| `src/bundle/ui-dev/src/modules/tree-builder/components/portal-provider/portal.provider.js` | `tree-builder/src/bundle/ui-dev/src/modules/tree-builder/components/portal/portal.js` | +| `src/bundle/ui-dev/src/modules/tree-builder/hooks/usePortal.js` | `tree-builder/src/bundle/ui-dev/src/modules/tree-builder/components/portal/portal.js` | + +## Configuration keys + +| Old name | New name | +|:----|:----| +| `ibexa.system.*.database.*` | `ibexa.repositories` | +| `ibexa.system.*.session_name` | `ibexa.system.*.session.name` | +| `ibexa.site_access.config.default.user_registration.group_id` | `ibexa.site_access.config.default.user_registration.group_remote_id` | +| `ezpublish_http_basic` | Use `http_basic` in `security.yml` directly. | + + +## CSS settings + +|Old setting|New setting| +|:----|:----| +| `ibexa-alert--complementary` | `ibexa-alert--info` | +| `sidebar-drag-items` | `toolbox-drag-items` | +| `sidebar-drag-items-group` | `toolbox-drag-items-group` | +| `sidebar-drag-item` | `tooblox-drag-item` | +| `/src/bundle/Resources/public/scss/mixins/_font.scss` | Removed | +| `/src/bundle/Resources/public/scss/_iframe-backdrop.scss` | Removed | + +## Twig templates, functions and filters + +The global Twig variable `ez_richtext_config` has been renamed to `ibexa_richtext_config`. + +| Old name| New name / Comment | +|:----|:----| +| `\Ibexa\Core\MVC\Symfony\Templating\Twig\Extension\` | Removed `ezplatform` variable, use the `ibexa` global variable. | +| `\Ibexa\Core\MVC\Symfony\View\ParametersInjector\ViewbaseLayout\` | Removed `pagelayout` variable, use `page_layout`. | +| `/src/bundle/Resources/views/themes/admin/account/form_fields.html.twig` | Deprecated, extend `@ibexadesign/ui/form_fields.html.twig` directly. | +| `/src/bundle/Resources/views/themes/admin/content/edit/content_header.html.twig` | Removed | +| `/src/bundle/Resources/views/themes/admin/ui/footer.html.twig` | Deprecated | +| `/src/bundle/Resources/views/themes/corporate/customer_portal/registration/registration_already_exists.html.twig` | Removed | +| `/src/bundle/Resources/views/block_preview.html.twig` | Removed | +| `\Ibexa\Scheduler\Dashboard\AllScheduledTab` | Removed `type` variable. Use `content_type.name`. | +| `\Ibexa\Scheduler\Dashboard\MyScheduledTab` | Removed `type` variable. Use `content_type.name`. | +| `\Ibexa\Bundle\User\Controller\DefaultProfileImageController` | Removed `type` variable. Use `text_color`. Remove `default(text)` from `initials.svg.twig`. | +| `\Ibexa\Bundle\User\Controller\DefaultProfileImageController` | Removed `background` variable, use `background_color`. Remove `default(background)` from `initials.svg.twig`. | diff --git a/docs/release_notes/img/5.0_collaborative_invitation.jpg b/docs/release_notes/img/5.0_collaborative_invitation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..20c2b3976eccaef5ee644d0bddc0dbbfff5a7bcd GIT binary patch literal 34568 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 EU$~ha#{d8T literal 0 HcmV?d00001 diff --git a/docs/snippets/release_50.md b/docs/snippets/release_50.md new file mode 100644 index 0000000000..ea3290086f --- /dev/null +++ b/docs/snippets/release_50.md @@ -0,0 +1,13 @@ +[[% if version is not defined %]] + [[% set version = '' %]] +[[% endif %]] + +To learn more about all the included changes, see the full release change logs: + +- [[[= product_name_headless =]] [[= version =]]](https://github.com/ibexa/headless/releases/tag/[[= version =]]) +- [[[= product_name_exp =]] [[= version =]]](https://github.com/ibexa/experience/releases/tag/[[= version =]]) +- [[[= product_name_com =]] [[= version =]]](https://github.com/ibexa/commerce/releases/tag/[[= version =]]) + +[[% if version != 'v5.0.0' %]] +To update your application, see the [update instructions](../update_and_migration/from_4.6/update_to_5.0.md#[[= version_to_anchor(version) =]]). +[[% endif %]] diff --git a/docs/update_and_migration/from_4.6/update_to_5.0.md b/docs/update_and_migration/from_4.6/update_to_5.0.md new file mode 100644 index 0000000000..aa0dc0909b --- /dev/null +++ b/docs/update_and_migration/from_4.6/update_to_5.0.md @@ -0,0 +1,1064 @@ +--- +description: Update your installation to v5.0 from the latest v4.6 version. +month_change: true +--- + +# Update from v4.6 to v5.0 + +## Update from v4.6.x to v4.6.latest + +Before you update to v5.0, you need to [update to the latest maintenance release of v4.6 (v[[= latest_tag_4_6 =]])](update_from_4.6.md). + +### Move from old to new Commerce + +If you've chosen to use the [deprecated Commerce packages](update_from_4.3_old_commerce.md) during the update to 4.4, +you have to move to [new Commerce ones](update_from_4.3_new_commerce.md). + +## Update from v4.6.latest to v5.0.0 + +When you have the last version of 4.6, you can update to v5.0.0. + +### Requirements + +First, match v5.0's [requirements](requirements.md). +It supports only PHP 8.3 and above. + +### Update custom code for PHP 8.3+ and DXP 4.6 + +It's important to stop using deprecated PHP classes as they're removed in 5.0. + +The [`ibexa/compatibility-layer`](to_4.0.md#add-compatibility-layer-package) isn't supported in 5.0. +If you use it, remove it (`composer remove ibexa/compatibility-layer`) and make the necessary changes. +See [[[= product_name =]] v4.0 deprecations and backwards compatibility breaks](/release_notes/ibexa_dxp_v4.0_deprecations.md) for the list of changes. + +[Rector](https://getrector.com/) and the [[= product_name_base =]] rule sets help to upgrade your code. + +Install [`ibexa/rector`](https://github.com/ibexa/rector) which contains rules to ensure custom code is up to date with DXP 4.6: + +```bash +composer require --dev ibexa/rector +``` + +Customize the `rector.php` config file by: + +- making it match your directory structure (for example, you may not have the `tests` directory) +- adding project-specific rules: + - specify [PHP rules by using `withPhpSets`](https://getrector.com/documentation/set-lists#content-php-sets) + - specify [Symfony, Twig, or Doctrine rules by using `withComposerBased`](https://getrector.com/documentation/composer-based-sets). + +It's recommended to activate one rule set at a time and preview the output by running Rector with the `--dry-run` option to decide which rulesets should be used and in which order. + +Your configuration could look like the following example: + +```php +return RectorConfig::configure() + ->withPaths( + [ + __DIR__ . '/src', + ] + ) + ->withSets( + [ + IbexaSetList::IBEXA_46->value, + ] + ) + ->withPhpSets(php83: true) + ->withComposerBased(symfony: true) +; +``` +Run the following command to preview the changes done by Rector: +```bash +php vendor/bin/rector --dry-run +``` + +### Move from annotation to attribute + +Delete [`config/routes/annotations.yaml`](https://github.com/symfony/recipes/blob/main/doctrine/annotations/1.0/config/routes/annotations.yaml) +if you haven't customized it. + +If you have customized it, +change all occurrences of `type: annotation` to `type: attribute`. + +The `config/routes.yaml` file should start with the following declaration from the [Symfony recipe](https://github.com/symfony/recipes/blob/main/symfony/routing/7.0/config/routes.yaml): + +```yaml +controllers: + resource: + path: ../src/Controller/ + namespace: App\Controller + type: attribute +``` + +You can add the new declaration to the top of the file manually, +or recreate the file by running `composer sync-recipes symfony/routing --force --reset`. + +### Remove GraphQL schema + +The GraphQL schema used in 4.6 isn't compatible with version 5.0 and must be deleted. +You can do it, for example, with the following command: + +```bash +rm -r config/graphql +``` + +### Update [[= product_name =]] application + +#### Update package requirements + +[[= product_name =]] 5.0 is based on Symfony 7.3 and both must be updated. +Your development packages must be updated as well. +The example below assumes that [`symfony/debug-pack`](https://symfony.com/packages/Debug%20Pack) and `ibexa/rector` are installed. +Adjust the list based on your project requirements. +Notice the use of the `--no-update` option to only edit the `composer.json` entries and avoid triggering the package update and Composer scripts. + +=== "[[= product_name_headless =]]" + + ```bash + # Update required PHP version + composer require --no-update 'php:>=8.3'; + # Update required Symfony version + composer config extra.symfony.require '7.3.*' + # Upgrade Ibexa and Symfony packages: application + composer require --no-update \ + ibexa/headless:[[= latest_tag_5_0 =]] \ + symfony/console:^7.3 \ + symfony/dotenv:^7.3 \ + symfony/framework-bundle:^7.3 \ + symfony/runtime:^7.3 \ + symfony/yaml:^7.3 \ + ; + # Upgrade Ibexa and Symfony packages: development tools + composer require --dev --no-update \ + ibexa/rector:[[= latest_tag_5_0 =]] \ + symfony/debug-bundle:^7.3 \ + symfony/stopwatch:^7.3 \ + symfony/web-profiler-bundle:^7.3 \ + ; + ``` + +=== "[[= product_name_exp =]]" + + ```bash + # Update required PHP version + composer require --no-update 'php:>=8.3'; + # Update required Symfony version + composer config extra.symfony.require '7.3.*' + # Upgrade Ibexa and Symfony packages: application + composer require --no-update \ + ibexa/experience:[[= latest_tag_5_0 =]] \ + symfony/console:^7.3 \ + symfony/dotenv:^7.3 \ + symfony/framework-bundle:^7.3 \ + symfony/runtime:^7.3 \ + symfony/yaml:^7.3 \ + ; + # Upgrade Ibexa and Symfony packages: development tools + composer require --dev --no-update \ + ibexa/rector:[[= latest_tag_5_0 =]] \ + symfony/debug-bundle:^7.3 \ + symfony/stopwatch:^7.3 \ + symfony/web-profiler-bundle:^7.3 \ + ; + ``` + +=== "[[= product_name_com =]]" + + ```bash + # Update required PHP version + composer require --no-update 'php:>=8.3'; + # Update required Symfony version + composer config extra.symfony.require '7.3.*' + # Upgrade Ibexa and Symfony packages: application + composer require --no-update \ + ibexa/commerce:[[= latest_tag_5_0 =]] \ + symfony/console:^7.3 \ + symfony/dotenv:^7.3 \ + symfony/framework-bundle:^7.3 \ + symfony/runtime:^7.3 \ + symfony/yaml:^7.3 \ + ; + # Upgrade Ibexa and Symfony packages: development tools + composer require --dev --no-update \ + ibexa/rector:[[= latest_tag_5_0 =]] \ + symfony/debug-bundle:^7.3 \ + symfony/stopwatch:^7.3 \ + symfony/web-profiler-bundle:^7.3 \ + ; + ``` + +#### Remove 4.6 LTS Updates constraints + +4.6 LTS Update packages are included by default in 5.0. +Remove them from your composer.json to avoid updating their version manually with each update. + +For example, the following command removes all of the released LTS Updates for 4.6 from `composer.json`: + +```bash +composer remove --no-update \ + ibexa/connector-ai \ + ibexa/connector-openai \ + ibexa/product-catalog-date-time-attribute \ + ibexa/product-catalog-symbol-attribute \ + ibexa/discounts \ + ibexa/discounts-codes \ +; +``` + +#### Remove PHP 8.2 error handler + +If you were using the [`Php82HideDeprecationsErrorHandler`](update_from_4.6.md#v468) to avoid deprecation messages, +you must remove it: + +```bash +composer config --unset extra.runtime.error_handler +``` + +#### Update required packages + +It's time to apply the new composer.json and update the dependencies: + +```bash +composer update --with-all-dependencies --no-scripts +``` + +#### Remove Stimulus bootstrap + +To help moving from Symfony's Webpack Encore bundle 1.x to 2.x, +delete the Stimulus bootstrap file +and reset Webpack Encore recipe: + +```bash +rm assets/bootstrap.js +composer recipes:install symfony/webpack-encore-bundle --reset --force --yes +``` + +Compare with your previous version, merge them together and test your customizations if needed. + +#### Apply [[= product_name =]] recipe + +=== "[[= product_name_headless =]]" + + ```bash + composer recipes:install ibexa/headless --reset --force --yes + ``` + +=== "[[= product_name_exp =]]" + + ```bash + composer recipes:install ibexa/experience --reset --force --yes + ``` + +=== "[[= product_name_com =]]" + + ```bash + composer recipes:install ibexa/commerce --reset --force --yes + ``` + +#### Sort commands + +Executing the recipes appends a new command at the end`composer.json`'s `auto-scripts` section, resulting in incorrect script order. +You have to manually sort the commands so the `tsconfig.json` file +is created by `yarn ibexa-generate-tsconfig` +before being used by `ibexa:encore:compile`. +Your `auto-scripts` entry should look like this: + +```json + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd", + "yarn install": "script", + "yarn ibexa-generate-tsconfig --relative-paths": "script", + "ibexa:encore:compile --config-name app": "symfony-cmd", + "bazinga:js-translation:dump %PUBLIC_DIR%/assets --merge-domains": "symfony-cmd", + "ibexa:encore:compile": "symfony-cmd", + "ibexa:encore:compile --frontend-configs-name ibexa,internals,libs,richtext": "symfony-cmd" + }, +``` + +#### Remove Ibexa Icons + +Remove from your `config/bundles.php` the line about `IbexaIconsBundle`. + +#### Post update script + +```bash +rm -rf var/cache +composer run-script post-update-cmd +``` + +### Update database + +[[% include 'snippets/update/db/db_backup_warning.md' %]] + +The main schema has changed and the provided SQL file `ibexa-4.6.latest-to-5.0.0.sql` updates it: + +=== "MySQL" + + ```bash + mysql -u -p < vendor/ibexa/installer/upgrade/db/mysql/ibexa-4.6.latest-to-5.0.0.sql + ``` + +=== "PostgreSQL" + + ```bash + psql < vendor/ibexa/installer/upgrade/db/postgresql/ibexa-4.6.latest-to-5.0.0.sql + ``` + +As this script targets all editions, on editions lower than Commerce you may encounter errors about missing tables which can safely be ignored. + +Many tables and columns are renamed. +If you have custom code directly querying those, you will need to update them. + +You can track the renaming in the `ibexa-4.6.latest-to-5.0.0.sql` file or below. + +??? note "Tables and columns renaming map" + + | Old name | New name | + |:------------------------------------------------------|:------------------------------------------------------------------------| + | ezbinaryfile | ibexa_binary_file | + | ezcobj_state | ibexa_object_state | + | ezcobj_state_group | ibexa_object_state_group | + | ezcobj_state_group_language | ibexa_object_state_group_language | + | ezcobj_state_language | ibexa_object_state_language | + | ezcobj_state_link | ibexa_object_state_link | + | ezcontent_language | ibexa_content_language | + | ezcontentbrowsebookmark | ibexa_content_bookmark | + | ezcontentclass | ibexa_content_type | + | ezcontentclass_attribute | ibexa_content_type_field_definition | + | ezcontentclass_attribute.contentclass_id | ibexa_content_type_field_definition.content_type_id | + | ezcontentclass_attribute_ml | ibexa_content_type_field_definition_ml | + | ezcontentclass_attribute_ml.contentclass_attribute_id | ibexa_content_type_field_definition_ml.content_type_field_definition_id | + | ezcontentclass_classgroup | ibexa_content_type_group_assignment | + | ezcontentclass_classgroup.contentclass_id | ibexa_content_type_group_assignment.content_type_id | + | ezcontentclass_name | ibexa_content_type_name | + | ezcontentclass_name.contentclass_id | ibexa_content_type_name.content_type_id | + | ezcontentclassgroup | ibexa_content_type_group | + | ezcontentobject | ibexa_content | + | ezcontentobject.contentclass_id | ibexa_content.content_type_id | + | ezcontentobject_attribute | ibexa_content_field | + | ezcontentobject_attribute.contentclassattribute_id | ibexa_content_field.content_type_field_definition_id | + | ezcontentobject_link | ibexa_content_relation | + | ezcontentobject_link.contentclassattribute_id | ibexa_content_relation.content_type_field_definition_id | + | ezcontentobject_name | ibexa_content_name | + | ezcontentobject_trash | ibexa_content_trash | + | ezcontentobject_tree | ibexa_content_tree | + | ezcontentobject_version | ibexa_content_version | + | ezdatebasedpublisher_scheduled_entries | ibexa_scheduler_scheduled_entries | + | ezdfsfile | ibexa_dfs_file | + | ezeditorialworkflow_markings | ibexa_workflow_markings | + | ezeditorialworkflow_transitions | ibexa_workflow_transitions | + | ezeditorialworkflow_workflows | ibexa_workflow_workflows | + | ezform_field_attributes | ibexa_form_field_attributes | + | ezform_field_validators | ibexa_form_field_validators | + | ezform_fields | ibexa_form_fields | + | ezform_form_submission_data | ibexa_form_form_submission_data | + | ezform_form_submissions | ibexa_form_form_submissions | + | ezform_forms | ibexa_form_forms | + | ezgmaplocation | ibexa_map_location | + | ezimagefile | ibexa_image_file | + | ezkeyword | ibexa_keyword | + | ezkeyword_attribute_link | ibexa_keyword_field_link | + | ezmedia | ibexa_media | + | eznode_assignment | ibexa_node_assignment | + | eznotification | ibexa_notification | + | ezpackage | ibexa_package | + | ezpage_attributes | ibexa_page_attributes | + | ezpage_blocks | ibexa_page_blocks | + | ezpage_blocks_design | ibexa_page_blocks_design | + | ezpage_blocks_visibility | ibexa_page_blocks_visibility | + | ezpage_map_attributes_blocks | ibexa_page_map_attributes_blocks | + | ezpage_map_blocks_zones | ibexa_page_map_blocks_zones | + | ezpage_map_zones_pages | ibexa_page_map_zones_pages | + | ezpage_pages | ibexa_page_pages | + | ezpage_zones | ibexa_page_zones | + | ezpolicy | ibexa_policy | + | ezpolicy_limitation | ibexa_policy_limitation | + | ezpolicy_limitation_value | ibexa_policy_limitation_value | + | ezpreferences | ibexa_preferences | + | ezrole | ibexa_role | + | ezsearch_object_word_link | ibexa_search_object_word_link | + | ezsearch_object_word_link.contentclass_id | ibexa_search_object_word_link.content_type_id | + | ezsearch_object_word_link.contentclass_attribute_id | ibexa_search_object_word_link.content_type_field_definition_id | + | ezsearch_word | ibexa_search_word | + | ezsection | ibexa_section | + | ezsite | ibexa_site | + | ezsite_data | ibexa_site_data | + | ezsite_public_access | ibexa_site_public_access | + | ezurl | ibexa_url | + | ezurl_object_link | ibexa_url_content_link | + | ezurlalias | ibexa_url_alias | + | ezurlalias_ml | ibexa_url_alias_ml | + | ezurlalias_ml_incr | ibexa_url_alias_ml_incr | + | ezurlwildcard | ibexa_url_wildcard | + | ezuser | ibexa_user | + | ezuser_accountkey | ibexa_user_accountkey | + | ezuser_role | ibexa_user_role | + | ezuser_setting | ibexa_user_setting | + +??? note "DFS (Distributed File System)" + + If [DFS IO handler](clustering.md#dfs-io-handler) is used and, as recommended, its table is on its own database, you'll have to rename table and columns there. + Here are the DFS renaming queries (extracted from `ibexa-4.6.latest-to-5.0.0.sql`): + + ```sql + ALTER TABLE ezdfsfile RENAME TO ibexa_dfs_file; + ALTER TABLE ibexa_dfs_file RENAME INDEX ezdfsfile_name_trunk TO ibexa_dfs_file_name_trunk; + ALTER TABLE ibexa_dfs_file RENAME INDEX ezdfsfile_expired_name TO ibexa_dfs_file_expired_name; + ALTER TABLE ibexa_dfs_file RENAME INDEX ezdfsfile_name TO ibexa_dfs_file_name; + ALTER TABLE ibexa_dfs_file RENAME INDEX ezdfsfile_mtime TO ibexa_dfs_file_mtime; + ``` + +### Update custom code for [[= product_name =]] 5.0 + +#### Update PHP framework standards + +Among other things, +previously deprecated classes have been removed, +and the type hinting strictness has been increased. + +Update the `rector.php` file to use [`IbexaSetList::IBEXA_50`](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/classes/Ibexa-Contracts-Rector-Sets-IbexaSetList.html#enumcase_IBEXA_50) rule set. +If you didn't edit it the first time, you can run its recipe: + +```bash +composer recipe:install ibexa/rector --force --reset --yes +``` + +You can adjust the other rule sets (for example, the Symfony ones) to match higher versions. + +Again, it's recommended to activate one rule set at a time and preview the output by running Rector with the `--dry-run` option to decide which rulesets should be used and in which order. + +As this update spans across a broad range of versions, multiple rules can be considered as in the example below. + +```php +//… +use Rector\Symfony\Set\SymfonySetList; +use Rector\Symfony\Set\SensiolabsSetList; +//… + ->withSets( + [ + IbexaSetList::IBEXA_50->value, + SymfonySetList::SYMFONY_54, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-54 + SymfonySetList::SYMFONY_60, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-60 + SymfonySetList::SYMFONY_61, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-61 + SymfonySetList::SYMFONY_62, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-62 + SymfonySetList::SYMFONY_63, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-63 + SymfonySetList::SYMFONY_64, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-64 + SymfonySetList::SYMFONY_70, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-70 + SymfonySetList::SYMFONY_71, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-71 + SymfonySetList::SYMFONY_72, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-72 + SymfonySetList::SYMFONY_73, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-symfonysymfony-73 + SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES, + SensiolabsSetList::ANNOTATIONS_TO_ATTRIBUTES, + ] + ) + ->withPhpSets() + ->withComposerBased(twig: true, symfony: true) + ->withAttributesSets(symfony: true, sensiolabs: true) + ->withPreparedSets( + deadCode: true, // https://getrector.com/find-rule?activeRectorSetGroup=core&rectorSet=core-dead-code + codeQuality: true, // https://getrector.com/find-rule?activeRectorSetGroup=core&rectorSet=core-code-quality + codingStyle: true, // https://getrector.com/find-rule?activeRectorSetGroup=core&rectorSet=core-coding-style + typeDeclarations: true, // https://getrector.com/find-rule?activeRectorSetGroup=core&rectorSet=core-type-declarations + privatization: true, // https://getrector.com/find-rule?activeRectorSetGroup=core&rectorSet=core-privatization + naming: true, // https://getrector.com/find-rule?activeRectorSetGroup=core&rectorSet=core-naming + instanceOf: true, // https://getrector.com/find-rule?activeRectorSetGroup=core&rectorSet=core-instanceof + earlyReturn: true, // https://getrector.com/find-rule?activeRectorSetGroup=core&rectorSet=core-early-return + strictBooleans: true, // https://getrector.com/find-rule?activeRectorSetGroup=core&rectorSet=core-strict-booleans + rectorPreset: true, + symfonyCodeQuality: true, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-code-quality + symfonyConfigs: true, // https://getrector.com/find-rule?activeRectorSetGroup=symfony&rectorSet=symfony-configs + ); +``` + +In the following example, you can see optimization thanks to the following features: + +- [Constructor parameter promoted as properties](https://www.php.net/manual/en/language.oop5.decon.php#language.oop5.decon.constructor.promotion) (available since PHP 8.0) +- [`AsCommand` attribute to register a command](https://symfony.com/doc/7.3/console.html#console_registering-the-command) (available since Symfony 6.2) + +```diff ++#[AsCommand(name: 'app:test', description: 'Command to test something.')] + class TestCommand extends Command + { +- private Repository $repository; +- +- public function __construct(Repository $repository) ++ public function __construct(private readonly Repository $repository) + { +- $this->repository = $repository; +- parent::__construct('app:test'); + } +- +- protected function configure() +- { +- $this->setDescription('Command to test something.'); +- } + + protected function execute(InputInterface $input, OutputInterface $output): int +``` + +#### Update JavaScript + +If you haven't renamed your Webpack file since 3.3, do it now as v5.0 no longer supports the old names. + +| Old name | New name | +|:----------------------------|:-------------------------------| +| ez.config.js | ibexa.config.js | +| ez.config.manager.js | ibexa.config.manager.js | +| ez.webpack.custom.config.js | ibexa.webpack.custom.config.js | + +`ibexa/rector` 5.0 also comes with the [JavaScript Transform module](https://github.com/ibexa/rector/blob/v5.0.0/js/README.md) to help you maintain your JavaScript code. + +Customize the `rector.config.js` config file by: + +- making it match your directory structure +- modifying the list of enabled plugins and their configuration + +The example below is made to fix in place the JS files from `asset/js/` directory, +and is ready to enable plugin rule sets one at a time (plugin path is relative to `vendor/ibexa/rector/` directory). + +```js +module.exports = { + config: { + paths: [ + { + input: 'assets/js', + output: 'assets/js', + }, + ], + }, + plugins: (plugins) => { + return [ + './js/ibexa-rename-ez-global.js', + //'./js/ibexa-rename-variables.js', + //'./js/ibexa-rename-string-values.js', + //'./js/ibexa-rename-trans-id.js', + //'./js/ibexa-rename-in-translations.js', + //'./js/ibexa-rename-icons.js', + ]; + }, + pluginsConfig: (config) => { + return config; + }, +}; +``` + +Install the tool dependencies once with the following command: + +```bash +yarn --cwd ./vendor/ibexa/rector/js install +``` + +Run it using the following command: + +```bash +yarn --cwd ./vendor/ibexa/rector/js transform +``` + +#### Update field type identifiers + +Several field type identifiers have changed. +The old identifiers are still supported, but it's recommended to migrate as soon as possible. + +You can list existing field type services with the command `php bin/console debug:container --tag=ibexa.field_type`. +The output as an `alias` column with new identifiers and a `legacy_alias` column with the old identifiers. + +??? note "Field type identifiers renaming map" + + | old identifier (`legacy_alias`) | new identifier (`alias`) | + |:--------------------------------|:--------------------------------| + | ibexa_address | ibexa_address | + | ezauthor | ibexa_author | + | ezbinaryfile | ibexa_binaryfile | + | ezboolean | ibexa_boolean | + | ezcontentquery | ibexa_content_query | + | ezcountry | ibexa_country | + | ibexa_customer_group | ibexa_customer_group | + | ezdate | ibexa_date | + | ezdatetime | ibexa_datetime | + | ezemail | ibexa_email | + | ezfloat | ibexa_float | + | ezform | ibexa_form | + | ezgmaplocation | ibexa_gmap_location | + | ezimage | ibexa_image | + | ezimageasset | ibexa_image_asset | + | ezinteger | ibexa_integer | + | ezisbn | ibexa_isbn | + | ezkeyword | ibexa_keyword | + | ezlandingpage | ibexa_landing_page | + | ezmatrix | ibexa_matrix | + | ibexa_measurement | ibexa_measurement | + | ezmedia | ibexa_media | + | ezobjectrelation | ibexa_object_relation | + | ezobjectrelationlist | ibexa_object_relation_list | + | ibexa_product_specification | ibexa_product_specification | + | ezrichtext | ibexa_richtext | + | ezselection | ibexa_selection | + | ibexa_seo | ibexa_seo | + | ezstring | ibexa_string | + | ibexa_taxonomy_entry | ibexa_taxonomy_entry | + | ibexa_taxonomy_entry_assignment | ibexa_taxonomy_entry_assignment | + | eztext | ibexa_text | + | eztime | ibexa_time | + | ezurl | ibexa_url | + | ezuser | ibexa_user | + +You may have to update them in several places, for example: + +- Update the field identifiers in templates to display or edit fields or their definition. For example, in a `@IbexaCore/content_fields.html.twig` extension, `{% block ezstring_field %)` must be changed for `{% block ibexa_string_field %}` +- Update the field identifiers in migration files + +#### Update icons + +The provided built-it icon set has been changed. + +The `ibexa/rector` JavaScript Transform module's plugin `ibexa-rename-icons.js` refactors the icon usage in JavaScript files. +You may have to update them in other contexts, for example, in configuration files associating icons to content types or Page Builder blocks. + +The icon library file's path changed from `/bundles/ibexaicons/img/all-icons.svg` to `/bundles/ibexaadminuiassets/vendors/ids-assets/dist/img/all-icons.svg`. + +Some icons have been renamed. +You can find an [`ibexa-rename-icons` map in `vendor/ibexa/rector/js/rules.config.json` (`"old-name": "new-name"`)](https://github.com/ibexa/rector/blob/v5.0.0/js/rules.config.json#L63). + +??? note "Icons renaming map" + + | Old name | New name | + |:------------------------|:-----------------------------| + | about-info | help | + | about | info-square | + | airtime | signal-radio | + | align-center | align-text-center | + | align-justify | align-text-justified | + | align-left | align-text-left | + | align-right | align-text-right | + | approved | check-circle | + | article | file-text | + | assign-section | assign | + | author | user-editor | + | autosave-error | cloud-error | + | autosave-off | cloud-discard | + | autosave-on | cloud | + | autosave-saved | cloud-check | + | autosave-saving | cloud-synch | + | b2b | handshake | + | back | arrow-left | + | back-current-date | calendar-back | + | bestseller | badge-star | + | block-invisible | block-hidden | + | block-visible-recurring | block-lock | + | blog | app-blog | + | blog_post | note-blog | + | bold | text-bold | + | bookmark | favourite-outline | + | bookmark-active | favourite-filled | + | bookmark-manager | book | + | box-collapse | arrow-move-right | + | browse | folder-browse | + | bubbles | message-bubble | + | business-deal-cash | user-money | + | button | cursor-clicked | + | campaign | speaker | + | captcha | form-captcha | + | caret-back | arrow-chevron-left | + | caret-double-back | arrow-double-left | + | caret-double-next | arrow-double-right | + | caret-down | arrow-chevron-down | + | caret-expanded | arrow-double-left | + | caret-next | arrow-chevron-right | + | caret-up | arrow-chevron-up | + | cart | shopping-cart | + | cart-full | shopping-cart | + | cart-upload | shopping-cart-arrow-up | + | cart-wishlist | shopping-cart-heart | + | category | tag | + | checkbox | form-checkbox | + | checkbox-multiple | form-check-list | + | checkmark | form-check | + | circle-caret-down | chevron-down-circle | + | circle-caret-left | chevron-left-circle | + | circle-caret-right | chevron-right-circle | + | circle-caret-up | chevron-up-circle | + | circle-close | discard-circle | + | circle-create | add-circle | + | circle-minus | minus-circle | + | circle-pause | minus-circle | + | clicked-recommendations | cursor-clicked-hand | + | clipboard | clipboard-check | + | collapse | arrow-collapse-right | + | content-write | file-text-write | + | column-settings | table-settings-column | + | comment | message | + | components | box-component | + | connect | connection | + | content-draft | draft | + | contentlist | list-content | + | content-list | list-content | + | content-type | tools | + | content-type-content | file-type | + | content-type-group | tool-group | + | copy-subtree | content-tree-copy | + | create | add | + | create-content | file-add | + | create-location | content-tree-create-location | + | customer | user-customer | + | customer-portal | device-monitor-user | + | customer-portal-page | app-user | + | customer-type | device-monitor-type | + | custom_tags | prompt | + | date | calendar | + | date-updated | calendar-reload | + | discount-coupon | discount-ticket | + | drafts | edit-draft | + | dropdown | form-dropdown | + | earth-access | world-cursor | + | embed | text-embedded | + | embed-inline | text-embedded-inline | + | erp | connection-erp | + | error | exclamation-mark | + | error-icon | file-warning | + | expand-left | arrow-expand-left | + | expand-right | arrow-expand-right | + | explore | ai | + | fields | form-input | + | file-video | video | + | flash | lightning | + | focus | arrows-outside | + | focus-image | focus-target | + | folder-empty | folder-open | + | form | form-check-square | + | full-view | arrows-full-view | + | future-publication | calendar-clock | + | gallery | image-gallery | + | go-right | arrow-to-right | + | go-to-root | content-tree-arrow-up | + | go-up | arrow-to-up | + | h1 | header-1 | + | h2 | header-2 | + | h3 | header-3 | + | h4 | header-4 | + | h5 | header-5 | + | h6 | header-6 | + | hide | visibility-hidden | + | hierarchy | hierarchy-site-map | + | history-file | file-history | + | 'home-page' | home | + | image-center | align-block-center | + | image-editor | image-edit | + | image-left | align-block-left | + | image-right | align-block-right | + | image-variations | image-focus | + | imported-items | database-synch | + | information | info-square | + | input-hidden | form-input-hidden | + | input-line | form-input-single-line | + | input-line-multiple | form-input-multi-line | + | input-number | form-input-number | + | interface-block | forbidden | + | italic | text-italic | + | keyword | hash | + | landing_page | layout-navbar | + | landingpage-add | layout-navbar-add | + | landingpage-preview | layout-navbar-visible | + | languages | world | + | languages-add | world-add | + | last-purchased | cursor-clicked-hand | + | last-viewed | app-recent | + | layout-manager | layout | + | link-content | file-link | + | link-remove | unlink | + | list | list-bullet | + | list-numbered | list-number | + | localize | target-location | + | location-add-new | content-tree-create-location | + | lock-unlock | unlock | + | logout | log-out | + | maform | chart-histogram | + | mail | message-email | + | mail-open | message-email-read | + | markup | file-code | + | menu | menu-hamburger | + | move | folder-open-move | + | newsletter | news | + | notice | alert-error | + | open-newtab | open-new-window | + | open-sametab | open-same-window | + | options | more | + | order-history | file-history | + | order-management | receipt-settings | + | order-status | product-search | + | panels | view-panels | + | paragraph | text-paragraph | + | paragraph-add | text-paragraph-add | + | pdf-file | file-pdf | + | personalize | user-target | + | personalize-block | file-settings | + | personalize-content | tag-settings | + | pin-unpin | unpin | + | place | pin-location | + | places | pins-locations | + | portfolio | suitcase | + | previewed | overdue | + | product-category | product-tag | + | product-list | clipboard-list | + | product_list | clipboard-list | + | product-low | product-arrow-down | + | product type | product-collection | + | product-type | product-collection | + | profile | user-profile | + | publish | rocket | + | publish-later | calendar-number | + | publish-later-cancel | calendar-discard | + | publish-later-create | calendar-add | + | qa-content | qa-file | + | qa-form | qa-form-check | + | radio-button | form-radio | + | radio-button-multiple | form-radio-list | + | rate | stars | + | rate-review | star-circle | + | recent-activity | activity-clock | + | recently-added | history | + | recommendation-calls | arrows-circle | + | redo | action-redo | + | refresh | arrows-reload | + | rejected | arrow-to-down-circle | + | relations | hierarchy-square | + | restore | arrow-restore | + | restore-parent | content-tree-restore-parent | + | review | message-edit | + | roles | user-id | + | rss | signal-rss | + | schedule | calendar-schedule | + | sections | database | + | send-email | send | + | settings-block | settings | + | settings-config | settings-configure | + | sites-all | sites | + | spinner | arrow-rotate | + | stats | chart-dots | + | strikethrough | text-strikethrough | + | subscriber | user-mail | + | subscript | text-subscript | + | superscript | text-superscript | + | swap | arrows-synchronize | + | system-information | info-circle | + | trash-empty | trash-discard | + | trash-notrashed | trash-open | + | underscore | text-underline | + | undo | action-undo | + | un-focus | arrows-inside | + | un-full-view | arrows-full-view-out | + | upload-image | image-upload | + | user-blocked | user-block | + | user_group | user-group | + | users-personalization | user-focus | + | user-recycle | arrows-reload-user | + | users-select | users-add | + | user-tick | user-check | + | version-compare | action-compare-versions | + | version-compare-action | action-compare | + | versions | archived-version | + | vertical-left-right | arrow-collapse-expand | + | view | visibility | + | view-desktop | device-monitor | + | view-hide | visibility-hidden | + | view-mobile | device-mobile | + | view-tablet | device-tablet | + | warning | alert-warning | + | warning-triangle | alert-warning | + +The following example illustrates the update of a custom page block's icon: + +```diff + ibexa_fieldtype_page: + blocks: + event: + name: About Block + category: Custom +- thumbnail: /bundles/ibexaicons/img/all-icons.svg#about ++ thumbnail: /bundles/ibexaadminuiassets/vendors/ids-assets/dist/img/all-icons.svg#info-square +``` + +### Install new features' schemas + +Features which were optional 4.6 LTS Updates are now part of 5.0.0. + +* If you have already installed the feature, its schema has been updated by the previous step. +* If you haven't installed the feature, you need to add its schema to your database. + Store the SQL of the schema into a file, **review it carefully**, then run it. +* If you mistakenly reinstall a schema, you might encounter "Table already exists" errors which can be ignored. + +#### Install AI actions schema + +=== "MySQL" + + ```bash + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/connector-ai/src/bundle/Resources/config/schema.yaml > schema_connector-ai.sql + # Pause to review schema_connector-ai.sql + mysql -u -p < schema_connector-ai.sql + ``` + +=== "PostgreSQL" + + ```bash + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/connector-ai/src/bundle/Resources/config/schema.yaml > schema_connector-ai.sql + # Pause to review schema_connector-ai.sql + psql < schema_connector-ai.sql + ``` + +#### Install date and time attribute type + +=== "MySQL" + + ```bash + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/product-catalog-date-time-attribute/src/bundle/Resources/config/schema.yaml > schema_date-time-attribute.sql + # Pause to review schema_date-time-attribute.sql + mysql -u -p < schema_date-time-attribute.sql + ``` + +=== "PostgreSQL" + + ```bash + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/product-catalog-date-time-attribute/src/bundle/Resources/config/schema.yaml > schema_date-time-attribute.sql + # Pause to review schema_date-time-attribute.sql + psql < schema_date-time-attribute.sql + ``` + +#### Install symbol attribute type + +=== "MySQL" + + ```bash + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/product-catalog-symbol-attribute/src/bundle/Resources/config/schema.yaml > schema_symbol-attribute.sql + # Pause to review schema_symbol-attribute.sql + mysql -u -p < schema_symbol-attribute.sql + ``` + +=== "PostgreSQL" + + ```bash + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/product-catalog-symbol-attribute/src/bundle/Resources/config/schema.yaml > schema_symbol-attribute.sql + # Pause to review schema_symbol-attribute.sql + psql < schema_symbol-attribute.sql + ``` + + +#### Install collaboration + +=== "MySQL" + + ```bash + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/collaboration/src/bundle/Resources/config/schema.yaml > schema_collaboration.sql + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/share/src/bundle/Resources/config/schema.yaml > schema_share.sql + # Pause to review schema_collaboration.sql and schema_share.sql + mysql -u -p < schema_collaboration.sql + mysql -u -p < schema_share.sql + ``` + +=== "PostgreSQL" + + ```bash + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/collaboration/src/bundle/Resources/config/schema.yaml > schema_collaboration.sql + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/share/src/bundle/Resources/config/schema.yaml > schema_share.sql + # Pause to review schema_collaboration.sql and schema_share.sql + psql < schema_collaboration.sql + psql < schema_share.sql + ``` + +#### Install discounts [[% include 'snippets/commerce_badge.md' %]] + +=== "MySQL" + + ```bash + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/discounts/src/bundle/Resources/config/schema.yaml > schema_discounts.sql + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/discounts-codes/src/bundle/Resources/config/schema.yaml > schema_discounts-codes.sql + # Pause to review schema_discounts.sql and schema_discounts-codes.sql + mysql -u -p < schema_discounts.sql + mysql -u -p < schema_discounts-codes.sql + ``` + +=== "PostgreSQL" + + ```bash + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/discounts/src/bundle/Resources/config/schema.yaml > schema_discounts.sql + php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/discounts-codes/src/bundle/Resources/config/schema.yaml > schema_discounts-codes.sql + # Pause to review schema_discounts.sql and schema_discounts-codes.sql + psql < schema_discounts.sql + psql < schema_discounts-codes.sql + ``` + +### Clear cache pool + +The persistence cache pool needs to be cleared to be able to use the repository again. + +```bash +php bin/console cache:pool:clear --all +``` + +### Migrations + +#### Taxonomy + +```bash +php bin/console ibexa:migrations:import vendor/ibexa/taxonomy/src/bundle/Resources/install/migrations/2025_08_09_14_47_mark_tag_as_container.yaml +php bin/console ibexa:migrations:migrate --file=2025_08_09_14_47_mark_tag_as_container.yaml --siteaccess=admin +``` + +#### Product catalog + +```bash +php bin/console ibexa:migrations:import vendor/ibexa/product-catalog/src/bundle/Resources/migrations/2025_07_09_13_52_mark_product_category_container.yaml +php bin/console ibexa:migrations:migrate --file=2025_07_09_13_52_mark_product_category_container.yaml --siteaccess=admin +``` + +#### Corporate accounts [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] + +```bash +php bin/console ibexa:migrations:import vendor/ibexa/corporate-account/src/bundle/Resources/migrations/2025_07_08_09_27_set_container_to_company.yaml +php bin/console ibexa:migrations:migrate --file=2025_07_08_09_27_set_container_to_company.yaml --siteaccess=admin +``` + +### Generate GraphQL schema + +GraphQL usage is no longer required for the [[= product_name =]] back office. +If you are using GraphQL in your project, you can generate its schema by running: + +```bash +php bin/console ibexa:graphql:generate-schema +``` + +### Update search indexes + +Ensure your search index is up to date with the following command: + +```bash +php bin/console ibexa:reindex +``` + +### Finalizing + +#### Clear cache and rebuild + +Finish the update process: + +``` +composer run-script post-update-cmd +``` + +#### HTTP Cache + +Use the newer VCL files. +Depending on your reverse proxy, you'll find them in the following directories: + +- Varnish: `vendor/ibexa/http-cache/docs/varnish/vcl/` +- Fastly: `vendor/ibexa/fastly/fastly/` + +#### Ibexa Cloud + +Generate the Ibexa Cloud Platform.sh configuration files, review the changes with your own version, and merge your customizations. + +```bash +composer ibexa:setup --platformsh +``` + +#### Conclusion + +Your project is now running the latest major version of [[= product_name =]]. diff --git a/docs/update_and_migration/from_5.0/update_from_5.0.md b/docs/update_and_migration/from_5.0/update_from_5.0.md new file mode 100644 index 0000000000..8df53b0c19 --- /dev/null +++ b/docs/update_and_migration/from_5.0/update_from_5.0.md @@ -0,0 +1,12 @@ +--- +description: Update your installation to the latest v5.0 version from an earlier v5.0 version. +month_change: true +--- + +# Update from v5.0.x to v5.0.latest + +[[= product_name =]] v5.0.0 is the latest version. +Revisit this page when a new bugfix release is available to stay up to date. + +To update from v4.6.x, see [Update from v4.6 to v5.0](update_to_5.0.md). +To update from an older version, visit [the update page](update_ibexa_dxp.md) and choose the applicable path. diff --git a/docs/update_and_migration/update_ibexa_dxp.md b/docs/update_and_migration/update_ibexa_dxp.md index bbeba46794..134d629471 100644 --- a/docs/update_and_migration/update_ibexa_dxp.md +++ b/docs/update_and_migration/update_ibexa_dxp.md @@ -11,20 +11,31 @@ To update [[= product_name =]] to a newer version, select the version you are cu If you have a v1.13 installation, or a v2.x installation lower than the latest v2.5, [update to the v2.5 LTS](from_1.x_2.x/update_from_1.x_2.x.md). - Afterwards, it is strongly recommended to [update to the v3.3 LTS](from_2.5/update_from_2.5.md) and then update to the latest LTS, [v4.6](from_4.5/update_from_4.5.md) (through [v4.0](from_3.3/to_4.0.md) up to v4.6). + Afterwards, it's strongly recommended to [update to the v3.3 LTS](from_2.5/update_from_2.5.md), + then [update to v4.6 LTS](from_4.5/update_from_4.5.md) (through [v4.0](from_3.3/to_4.0.md) up to v4.6), + and finally [to the lastest v5.0 LTS](from_4.6/update_to_5.0.md). === "I am using v2.5" If you have a v2.5 installation, [update to the v3.3 LTS](from_2.5/update_from_2.5.md). - Afterwards, it is strongly recommended to also update to the latest LTS, [v4.6](from_4.5/update_from_4.5.md) (through [v4.0](from_3.3/to_4.0.md) up to v4.6). + Afterwards, it's strongly recommended to also [update to v4.6 LTS](from_4.5/update_from_4.5.md) (through [v4.0](from_3.3/to_4.0.md) up to v4.6), + and finally [to the lastest v5.0 LTS](from_4.6/update_to_5.0.md). === "I am using v3.3" If you already have a v3.3 installation, [update to the latest v3.3 version](from_3.3/update_from_3.3.md). - Afterwards, it is strongly recommended to also update to the latest LTS, [v4.6](from_4.5/update_from_4.5.md) (through [v4.0](from_3.3/to_4.0.md) up to v4.6). + Afterwards, it's strongly recommended to also [update to v4.6 LTS](from_4.5/update_from_4.5.md) (through [v4.0](from_3.3/to_4.0.md) up to v4.6), + and finally [to the lastest v5.0 LTS](from_4.6/update_to_5.0.md). === "I am using v4.x" - If you already have a v4.x installation, [update to the v4.6 LTS](from_4.5/update_from_4.5.md). + - If you have a v4.x installation prior to v4.6, [update to the v4.6 LTS](from_4.5/update_from_4.5.md). + - If you have a v4.6 installation, [update to the latest patch v[[= latest_tag_4_6 =]]](from_4.6/update_from_4.6.md). + + Afterwards, it's strongly recommended to also [update to the lastest v5.0 LTS](from_4.6/update_to_5.0.md). + +=== "I am using v5.0" + + Refer to the [v5.0 update page](from_5.0/update_from_5.0.md) to make sure you're staying up to date. diff --git a/mkdocs.yml b/mkdocs.yml index d608cdaa33..300e77eab8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -627,11 +627,16 @@ nav: - 'Update to v4.6': 'update_and_migration/from_4.5/update_from_4.5.md' - Update from v4.6: - 'Update to v4.6': 'update_and_migration/from_4.6/update_from_4.6.md' + - 'Update to v5.0': update_and_migration/from_4.6/update_to_5.0.md + - Update from v5.0: + - Update to v5.0: update_and_migration/from_5.0/update_from_5.0.md - Migrate to Ibexa DXP: - 'Migrate from eZ Publish Platform': 'migrating/migrating_from_ez_publish_platform.md' - 'Migrate from eZ Publish': 'migrating/migrating_from_ez_publish.md' - 'Common migration issues': 'migrating/common_issues.md' - Release notes: + - 'Ibexa DXP v5.0 LTS': release_notes/ibexa_dxp_v5.0.md + - 'Ibexa DXP v5.0 deprecations and BC breaks': release_notes/ibexa_dxp_v5.0_deprecations.md - 'Ibexa DXP v4.6 LTS': 'release_notes/ibexa_dxp_v4.6.md' - 'Ibexa DXP v4.5': 'release_notes/ibexa_dxp_v4.5.md' - 'Ibexa DXP v4.4': 'release_notes/ibexa_dxp_v4.4.md' @@ -711,6 +716,7 @@ extra: latest_tag_4_4: '4.4.4' latest_tag_4_5: '4.5.7' latest_tag_4_6: '4.6.21' + latest_tag_5_0: '5.0.0' symfony_doc: 'https://symfony.com/doc/5.x' user_doc: 'https://doc.ibexa.co/projects/userguide/en/3.3' From 440b18854b169a89105308139865e71c96b53e68 Mon Sep 17 00:00:00 2001 From: Adrien Dupuis <61695653+adriendupuis@users.noreply.github.com> Date: Wed, 23 Jul 2025 14:31:53 +0200 Subject: [PATCH 2/4] update_to_5.0.md: Link to ibexa_dxp_v5.0_deprecations.md (#2846) --- docs/update_and_migration/from_4.6/update_to_5.0.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/update_and_migration/from_4.6/update_to_5.0.md b/docs/update_and_migration/from_4.6/update_to_5.0.md index aa0dc0909b..1c9afac73a 100644 --- a/docs/update_and_migration/from_4.6/update_to_5.0.md +++ b/docs/update_and_migration/from_4.6/update_to_5.0.md @@ -410,6 +410,9 @@ You can track the renaming in the `ibexa-4.6.latest-to-5.0.0.sql` file or below. ### Update custom code for [[= product_name =]] 5.0 +See [[[= product_name =]] v5.0 deprecations and backwards compatibility breaks](/release_notes/ibexa_dxp_v5.0_deprecations.md) for the list of changes. +The following sections presents some of those changes and how to apply them. + #### Update PHP framework standards Among other things, From 8e95808f6d3dca5726fe791e8073fc3fe36225ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Wed, 13 Aug 2025 09:42:24 +0200 Subject: [PATCH 3/4] Adjusted homepage --- docs/index.md | 8 ++++---- docs/release_notes/ibexa_dxp_v4.6.md | 6 +++++- docs/release_notes/ibexa_dxp_v5.0.md | 18 +++++++++--------- docs/snippets/release_50.md | 13 ------------- mkdocs.yml | 2 +- 5 files changed, 19 insertions(+), 28 deletions(-) delete mode 100644 docs/snippets/release_50.md diff --git a/docs/index.md b/docs/index.md index 302c6bbd40..621a5e1548 100644 --- a/docs/index.md +++ b/docs/index.md @@ -73,11 +73,11 @@
-

The latest release is v4.6

-
The latest version of Ibexa DXP is v4.6. You can now update your application to the latest version.
+

The latest release is v5.0 LTS

+
The latest version of Ibexa DXP is 5.0.0. You can now update your application to the latest version.
The latest release @@ -214,4 +214,4 @@
- \ No newline at end of file + diff --git a/docs/release_notes/ibexa_dxp_v4.6.md b/docs/release_notes/ibexa_dxp_v4.6.md index fe092b97e5..1cd2ac1c19 100644 --- a/docs/release_notes/ibexa_dxp_v4.6.md +++ b/docs/release_notes/ibexa_dxp_v4.6.md @@ -8,12 +8,16 @@ description: Ibexa DXP v4.6 brings improvements to Commerce, PIM and Personaliza **Version number**: v4.6 -**Release date**: February 13, 2024 +**Initial release date**: February 13, 2024 **Release type**: [LTS](https://support.ibexa.co/Public/service-life) **Update**: [v4.5.x to v4.6](https://doc.ibexa.co/en/latest/update_and_migration/from_4.5/update_from_4.5/) +## Latest changes + +To learn more about the latest changes in v4.6, visit the [full release notes for 4.6](https://doc.ibexa.co/en/latest/release_notes/ibexa_dxp_v4.6/). + ## Notable changes ### Ibexa Headless diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md index 3f2fa1359d..6c3b86076a 100644 --- a/docs/release_notes/ibexa_dxp_v5.0.md +++ b/docs/release_notes/ibexa_dxp_v5.0.md @@ -4,14 +4,13 @@ title: Ibexa DXP v5.0 LTS month_change: true --- - +# Ibexa DXP v5.0 LTS -[[= release_notes_filters('Ibexa DXP v5.0 LTS', ['Headless', 'Experience', 'Commerce', 'LTS Update', 'New feature']) =]] +## Ibexa DXP v5.0.0 -
+## Latest changes -[[% set version = 'v5.0.0' %]] -[[= release_note_entry_begin("Ibexa DXP " + version, '2025-07-22', ['Headless', 'Experience', 'Commerce', 'New feature']) =]] +To learn more about the latest changes in v5, visit the [full release notes for v5.0](https://doc.ibexa.co/en/latest/release_notes/ibexa_dxp_v4.6/). ### Notable changes @@ -351,10 +350,11 @@ Refer to [Ibexa DXP v5.0 renames, deprecations and removals](ibexa_dxp_v5.0_depr ### Full changelog -[[% include 'snippets/release_50.md' %]] -To update your application, see the [update instructions](../update_and_migration/from_4.6/update_to_5.0.md). +To learn more about all the included changes, see the full release change logs: -[[= release_note_entry_end() =]] +- [Ibexa Headless v5.0.0](https://github.com/ibexa/headless/releases/tag/v5.0.0) +- [Ibexa Experience v5.0.0](https://github.com/ibexa/experience/releases/tag/v5.0.0) +- [Ibexa Commerce v5.0.0](https://github.com/ibexa/commerce/releases/tag/v5.0.0) -
+To update your application, see the [update instructions](../update_and_migration/from_4.6/update_to_5.0.md). diff --git a/docs/snippets/release_50.md b/docs/snippets/release_50.md deleted file mode 100644 index ea3290086f..0000000000 --- a/docs/snippets/release_50.md +++ /dev/null @@ -1,13 +0,0 @@ -[[% if version is not defined %]] - [[% set version = '' %]] -[[% endif %]] - -To learn more about all the included changes, see the full release change logs: - -- [[[= product_name_headless =]] [[= version =]]](https://github.com/ibexa/headless/releases/tag/[[= version =]]) -- [[[= product_name_exp =]] [[= version =]]](https://github.com/ibexa/experience/releases/tag/[[= version =]]) -- [[[= product_name_com =]] [[= version =]]](https://github.com/ibexa/commerce/releases/tag/[[= version =]]) - -[[% if version != 'v5.0.0' %]] -To update your application, see the [update instructions](../update_and_migration/from_4.6/update_to_5.0.md#[[= version_to_anchor(version) =]]). -[[% endif %]] diff --git a/mkdocs.yml b/mkdocs.yml index 300e77eab8..c0490cd62c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -715,7 +715,7 @@ extra: latest_tag_4_3: '4.3.5' latest_tag_4_4: '4.4.4' latest_tag_4_5: '4.5.7' - latest_tag_4_6: '4.6.21' + latest_tag_4_6: '4.6.22' latest_tag_5_0: '5.0.0' symfony_doc: 'https://symfony.com/doc/5.x' From 2860b01c69ffb6d0704aab988b530de5bcd73ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Noco=C5=84?= Date: Wed, 13 Aug 2025 11:40:01 +0200 Subject: [PATCH 4/4] Fixes links --- docs/release_notes/ibexa_dxp_v5.0.md | 16 ++++++++-------- .../release_notes/ibexa_dxp_v5.0_deprecations.md | 4 ++-- mkdocs.yml | 2 ++ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md index 6c3b86076a..08407b7b87 100644 --- a/docs/release_notes/ibexa_dxp_v5.0.md +++ b/docs/release_notes/ibexa_dxp_v5.0.md @@ -24,11 +24,11 @@ By default, the AI Actions feature can help users with their work in following s - Refining text: when editing a content item, users can request that a passage selected in online editor is modified, for example, by adjusting the length of the text, changing its tone, or correcting linguistic errors - Generating alternative text: when working with images, users can ask AI to generate alternative text for them, which helps improve accessibility and SEO -![AI Assistant](ai_assistant.png) +![AI Assistant](https://doc.ibexa.co/en/5.0/ai_actions/img/ai_assistant.png) AI Actions integrate with [Ibexa Connect]([[= connect_doc =]]), giving you an opportunity to build complex data transformation workflows without having to rely on custom code. -For more information, see [AI Actions product guide](ai_actions_guide.md). +For more information, see [AI Actions product guide](https://doc.ibexa.co/en/5.0/ai_actions/ai_actions_guide). #### Discounts [[% include 'snippets/commerce_badge.md' %]] @@ -38,19 +38,19 @@ Use them to encourage first-time purchases, reward loyal customers, promote new By displaying discounted prices clearly in the catalog or cart, businesses can create a sense of urgency, increase customer satisfaction, and ultimately boost revenue. -![Discounts for products in the cart](4.6_discounts.png) +![Discounts for products in the cart](https://doc.ibexa.co/en/5.0/release_notes/img/4.6_discounts.png) -For more information, see [Discounts product guide](discounts_guide.md). +For more information, see [Discounts product guide](https://doc.ibexa.co/en/5.0/discounts/discounts_guide). #### Date and time attribute -The Date and time attributes allow you to represent date and time values as part of the product specification in the [Product Information Management](pim_guide.md) system. +The Date and time attributes allow you to represent date and time values as part of the product specification in the [Product Information Management](https://doc.ibexa.co/en/5.0/pim/pim_guide/) system. -For more information, see [Date and time attributes](date_and_time.md). +For more information, see [Date and time attributes](https://doc.ibexa.co/en/5.0/pim/attributes/date_and_time/). #### Symbol attribute -The Symbol attributes allow you to efficiently represent the string-based data as part of the product specification in the [Product Information Management](pim_guide.md) system. +The Symbol attributes allow you to efficiently represent the string-based data as part of the product specification in the [Product Information Management](https://doc.ibexa.co/en/5.0/pim/pim_guide/) system. For more information, see [Symbol attributes](https://doc.ibexa.co/en/5.0/pim/attributes/symbol_attribute_type/). @@ -67,7 +67,7 @@ For more information, see [Collaboration PHP API](https://doc.ibexa.co/en/5.0/ap With improved compatibility, performance and increased security, as well as better developer experience in mind, [[= product_name_base =]] decided to introduce several significant tech stack upgrades. -For a full list of updated system requirements, see [Requirements](../getting_started/requirements.md). +For a full list of updated system requirements, see [Requirements](https://doc.ibexa.co/en/5.0/getting_started/requirements). #### Symfony 7.3 diff --git a/docs/release_notes/ibexa_dxp_v5.0_deprecations.md b/docs/release_notes/ibexa_dxp_v5.0_deprecations.md index bb6c79075e..2cbdef149f 100644 --- a/docs/release_notes/ibexa_dxp_v5.0_deprecations.md +++ b/docs/release_notes/ibexa_dxp_v5.0_deprecations.md @@ -16,7 +16,7 @@ These changes include dropped packages, changing database table and column names ## Dropped packages [[= product_name =]] v5.0 no longer includes legacy Commerce packages. -The solution has been replaced with [Commerce](commerce.md) that is included as standard and has been continuously developed since v4.4. +The solution has been replaced with [Commerce](https://doc.ibexa.co/en/5.0/commerce/commerce/) that is included as standard and has been continuously developed since v4.4. Also, packages `compatibility-layer` and `icons` have been dropped. @@ -416,7 +416,7 @@ Support for facets in `ibexa/elasticsearch` has been dropped, use the `Aggregati !!! note "Dropped `measurement` product attribute" The deprecated product attribute `measurement` has been removed. - The change does not affect the [measurement field type](measurementfield.md). + The change does not affect the [measurement field type](https://doc.ibexa.co/en/5.0/content_management/field_types/field_type_reference/measurementfield/). ### ibexa/migrations diff --git a/mkdocs.yml b/mkdocs.yml index c0490cd62c..83f41efbdf 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -720,7 +720,9 @@ extra: symfony_doc: 'https://symfony.com/doc/5.x' user_doc: 'https://doc.ibexa.co/projects/userguide/en/3.3' + user_doc: 'https://doc.ibexa.co/projects/userguide/en/3.3' user_doc_4_6: 'https://doc.ibexa.co/projects/userguide/en/4.6' + connect_doc: 'https://doc.ibexa.co/projects/connect/en/latest' extra_css: - fonts/MavenPro.css