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/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 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.

@@ -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
new file mode 100644
index 0000000000..08407b7b87
--- /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
+---
+
+# Ibexa DXP v5.0 LTS
+
+## Ibexa DXP v5.0.0
+
+## Latest changes
+
+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
+
+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 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](https://doc.ibexa.co/en/5.0/ai_actions/ai_actions_guide).
+
+#### 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.
+
+
+
+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](https://doc.ibexa.co/en/5.0/pim/pim_guide/) system.
+
+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](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/).
+
+#### 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.
+
+
+
+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](https://doc.ibexa.co/en/5.0/getting_started/requirements).
+
+#### 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
+
+
+To learn more about all the included changes, see the full release change logs:
+
+- [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/release_notes/ibexa_dxp_v5.0_deprecations.md b/docs/release_notes/ibexa_dxp_v5.0_deprecations.md
new file mode 100644
index 0000000000..2cbdef149f
--- /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](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.
+
+## 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](https://doc.ibexa.co/en/5.0/content_management/field_types/field_type_reference/measurementfield/).
+
+### 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 0000000000..20c2b3976e
Binary files /dev/null and b/docs/release_notes/img/5.0_collaborative_invitation.jpg differ
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..1c9afac73a
--- /dev/null
+++ b/docs/update_and_migration/from_4.6/update_to_5.0.md
@@ -0,0 +1,1067 @@
+---
+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
+
+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,
+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..83f41efbdf 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'
@@ -710,11 +715,14 @@ 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'
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