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 version of Ibexa DXP is v4.6. You can now update your application to the latest version.
+

The latest release is v5.0 LTS

+
The latest version of Ibexa DXP is 5.0.0. You can now update your application to the latest version.
The latest release @@ -214,4 +214,4 @@
- \ No newline at end of file + diff --git a/docs/release_notes/ibexa_dxp_v4.6.md b/docs/release_notes/ibexa_dxp_v4.6.md index fe092b97e5..1cd2ac1c19 100644 --- a/docs/release_notes/ibexa_dxp_v4.6.md +++ b/docs/release_notes/ibexa_dxp_v4.6.md @@ -8,12 +8,16 @@ description: Ibexa DXP v4.6 brings improvements to Commerce, PIM and Personaliza **Version number**: v4.6 -**Release date**: February 13, 2024 +**Initial release date**: February 13, 2024 **Release type**: [LTS](https://support.ibexa.co/Public/service-life) **Update**: [v4.5.x to v4.6](https://doc.ibexa.co/en/latest/update_and_migration/from_4.5/update_from_4.5/) +## Latest changes + +To learn more about the latest changes in v4.6, visit the [full release notes for 4.6](https://doc.ibexa.co/en/latest/release_notes/ibexa_dxp_v4.6/). + ## Notable changes ### Ibexa Headless diff --git a/docs/release_notes/ibexa_dxp_v5.0.md b/docs/release_notes/ibexa_dxp_v5.0.md 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 Assistant](https://doc.ibexa.co/en/5.0/ai_actions/img/ai_assistant.png) + +AI Actions integrate with [Ibexa Connect]([[= connect_doc =]]), giving you an opportunity to build complex data transformation workflows without having to rely on custom code. + +For more information, see [AI Actions product guide](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. + +![Discounts for products in the cart](https://doc.ibexa.co/en/5.0/release_notes/img/4.6_discounts.png) + +For more information, see [Discounts product guide](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. + +![Collaboration invite](img/5.0_collaborative_invitation.jpg "Collaboration invite") + +For more information, see [Collaboration PHP API](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/namespaces/ibexa-contracts-collaboration.html) and [Share PHP API](https://doc.ibexa.co/en/5.0/api/php_api/php_api_reference/namespaces/ibexa-contracts-share.html). + +### Software architecture upgrades + +With improved compatibility, performance and increased security, as well as better developer experience in mind, [[= product_name_base =]] decided to introduce several significant tech stack upgrades. + +For a full list of updated system requirements, see [Requirements](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