diff --git a/docs/index.md b/docs/index.md index 3ae348e397..f51d78ec48 100644 --- a/docs/index.md +++ b/docs/index.md @@ -79,7 +79,7 @@
The latest version of Ibexa DXP is [[= latest_tag_5_0 =]]. You can now update your application to the latest version.
- Release notes + Release notes
The latest release @@ -92,7 +92,7 @@
-

Notable changes in v4.6

+

Notable changes in v5.0

@@ -100,16 +100,16 @@ 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..773c4c99a4 --- /dev/null +++ b/docs/release_notes/ibexa_dxp_v5.0.md @@ -0,0 +1,360 @@ +--- +description: Ibexa DXP v5.0 incorporates features brought by LTS Updates from previous versions, brings upgrades to the tech stack and improvements to developer experience. +title: Ibexa DXP v5.0 LTS +month_change: true +--- + + + +[[= release_notes_filters('Ibexa DXP v5.0 LTS', ['Headless', 'Experience', 'Commerce', 'LTS Update', 'New feature']) =]] + +
+ +[[% set version = 'v5.0.0' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2025-07-22', ['Headless', 'Experience', 'Commerce', 'New feature']) =]] + +### Notable changes + +This version incorporates into the product numerous features brought by [LTS Updates] from previous versions, brings upgrades to the tech stack and improvements to developer experience. + +#### AI Actions + +The AI Actions feature enhances the usability and flexibility of [[= product_name =]] by harnessing the potential of artificial intelligence to automate time-consuming editorial tasks. +By default, the AI Actions feature can help users with their work in following scenarios: + +- Refining text: when editing a content item, users can request that a passage selected in online editor is modified, for example, by adjusting the length of the text, changing its tone, or correcting linguistic errors +- Generating alternative text: when working with images, users can ask AI to generate alternative text for them, which helps improve accessibility and SEO + +![AI Assistant](ai_assistant.png) + +AI Actions integrate with [Ibexa Connect]([[= connect_doc =]]), giving you an opportunity to build complex data transformation workflows without having to rely on custom code. + +For more information, see [AI Actions product guide](ai_actions_guide.md). + +#### Discounts [[% include 'snippets/commerce_badge.md' %]] + +With Discounts, you can temporarily or permanently reduce prices on specific products or categories, making deals more attractive to potential buyers. + +Use them to encourage first-time purchases, reward loyal customers, promote new or slow-moving items, or drive sales during seasonal events. + +By displaying discounted prices clearly in the catalog or cart, businesses can create a sense of urgency, increase customer satisfaction, and ultimately boost revenue. + +![Discounts for products in the cart](4.6_discounts.png) + +For more information, see [Discounts product guide](discounts_guide.md). + +#### Date and time attribute + +The Date and time attributes allow you to represent date and time values as part of the product specification in the [Product Information Management](pim_guide.md) system. + +For more information, see [Date and time attributes](date_and_time.md). + +#### Symbol attribute + +The Symbol attributes allow you to efficiently represent the string-based data as part of the product specification in the [Product Information Management](pim_guide.md) system. + +For more information, see [Symbol attributes](symbol_attribute_type.md). + +#### 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](../api/php_api/php_api_reference/namespaces/ibexa-contracts-collaboration.html) and [Share PHP API](../api/php_api/php_api_reference/namespaces/ibexa-contracts-share.html). + +### Software architecture upgrades + +With improved compatibility, performance and increased security, as well as better developer experience in mind, [[= product_name_base =]] decided to introduce several significant tech stack upgrades. + +For a full list of updated system requirements, see [Requirements](../getting_started/requirements.md). + +#### Symfony 7.3 + +With this release, [[= product_name =]] moves to Symfony 7.3 from the previously used versions of Symfony. + +For details, see [Symfony 7.3](https://symfony.com/blog/symfony-7-3-curated-new-features). + +#### Doctrine 3.9 + +By moving to Doctrine 3.9, [[= product_name =]] brings developers better performance, cleaner code, and stronger foundation for a more modern and maintainable application. + +#### PHP 8.3 + +With performance, coding safety and security in mind, with this version, [[= product_name =]] moves to [PHP 8.3](https://www.php.net/releases/8.3/en.php) and drops support for lower versions of the language. + +#### OpenAPI support + +Adding support for generating the [OpenAPI](https://www.openapis.org/) specification for our REST API makes future changes more manageable, and helps our partners automatically generate REST API clients. + +For more information, see [REST API usage](https://doc.ibexa.co/en/latest/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`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-Action.html) + - [`Ibexa\Contracts\ConnectorAi\Action\ActionContext`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-ActionContext.html) + - [`Ibexa\Contracts\ConnectorAi\Action\ActionFactoryInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-ActionFactoryInterface.html) + - [`Ibexa\Contracts\ConnectorAi\Action\ActionHandlerInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-ActionHandlerInterface.html) + - [`Ibexa\Contracts\ConnectorAi\Action\ActionHandlerResolverInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-ActionHandlerResolverInterface.html) + - [`Ibexa\Contracts\ConnectorAi\Action\GenerateAltTextAction`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-GenerateAltTextAction.html) + - [`Ibexa\Contracts\ConnectorAi\Action\LLMBaseActionTypeInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-LLMBaseActionTypeInterface.html) + - [`Ibexa\Contracts\ConnectorAi\Action\RefineTextAction`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-RefineTextAction.html) + - [`Ibexa\Contracts\ConnectorAi\Action\RuntimeContext`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-RuntimeContext.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationCreateStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationCreateStruct.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationCopyStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationCopyStruct.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationListInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationListInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationOptions`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationOptions.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationQuery`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationQuery.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationUpdateStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationUpdateStruct.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionHandlerOptionsFormMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionHandlerOptionsFormMapperInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionTypeOptionsFormMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionTypeOptionsFormMapperInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\OptionsFormatterInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-OptionsFormatterInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\ActionTypeFactoryInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-ActionTypeFactoryInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\ActionTypeInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-ActionTypeInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\ActionTypeRegistryInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-ActionTypeRegistryInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\OptionsValidatorError`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-OptionsValidatorError.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\OptionsValidatorInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-OptionsValidatorInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionType\OptionsValidatorRegistryInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionType-OptionsValidatorRegistryInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfigurationInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfigurationInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfigurationServiceDecorator`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfigurationServiceDecorator.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfigurationServiceInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfigurationServiceInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionHandlerRegistryInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionHandlerRegistryInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionResponseInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionResponseInterface.html) + - [`Ibexa\Contracts\ConnectorAi\ActionServiceDecorator`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionServiceDecorator.html) + - [`Ibexa\Contracts\ConnectorAi\ActionServiceInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionServiceInterface.html) + - [`Ibexa\Contracts\ConnectorAi\AdapterAwareActionInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-AdapterAwareActionInterface.html) + - [`Ibexa\Contracts\ConnectorAi\DataType`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-DataType.html) + - [`Ibexa\Contracts\ConnectorAi\PromptResolverInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-PromptResolverInterface.html) + - [`Ibexa\Contracts\ConnectorAi\Prompt\PromptFactory`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Prompt-PromptFactory.html) + - [`Ibexa\Contracts\ConnectorAi\Prompt\PromptInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Prompt-PromptInterface.html) + - [`Ibexa\Contracts\ConnectorAi\PromptResolverInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-PromptResolverInterface.html) + - [`Ibexa\Contracts\ConnectorOpenAi\ClientProviderInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorOpenAi-ClientProviderInterface.html) + +??? note "Discounts" + + - [`Ibexa\Contracts\Discounts\DiscountConditionCriterionMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountConditionCriterionMapperInterface.html) + - [`Ibexa\Contracts\Discounts\DiscountFormMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountFormMapperInterface.html) + - [`Ibexa\Contracts\Discounts\DiscountPrioritizationStrategyInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountPrioritizationStrategyInterface.html) + - [`Ibexa\Contracts\Discounts\DiscountServiceDecorator`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountServiceDecorator.html) + - [`Ibexa\Contracts\Discounts\DiscountServiceInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountServiceInterface.html) + - [`Ibexa\Contracts\Discounts\DiscountValueFormatterInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountValueFormatterInterface.html) + - [`Ibexa\Contracts\Discounts\DiscountVariablesResolverInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-DiscountVariablesResolverInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\Form\DiscountValueFormTypeMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-Form-DiscountValueFormTypeMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\Form\FormThemeProviderInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-Form-FormThemeProviderInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\ConditionsMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-ConditionsMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\DiscountValueMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-DiscountValueMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\GeneralPropertiesMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-GeneralPropertiesMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\ProductConditionsMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-ProductConditionsMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\StepDataObjectMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-StepDataObjectMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Admin\FormMapper\UserConditionsMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-FormMapper-UserConditionsMapperInterface.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountConditionNotFoundException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountConditionNotFoundException.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountExpressionInvalidArgumentException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountExpressionInvalidArgumentException.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountExpressionRuntimeException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountExpressionRuntimeException.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountNotFoundException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountNotFoundException.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountRuleNotFoundException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountRuleNotFoundException.html) + - [`Ibexa\Contracts\Discounts\Exception\DiscountValueResolutionException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Exception-DiscountValueResolutionException.html) + - [`Ibexa\Contracts\Discounts\Policy\AbstractDiscountPolicy`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-AbstractDiscountPolicy.html) + - [`Ibexa\Contracts\Discounts\Policy\Create`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-Create.html) + - [`Ibexa\Contracts\Discounts\Policy\Delete`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-Delete.html) + - [`Ibexa\Contracts\Discounts\Policy\Disable`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-Disable.html) + - [`Ibexa\Contracts\Discounts\Policy\Enable`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-Enable.html) + - [`Ibexa\Contracts\Discounts\Policy\Update`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-Update.html) + - [`Ibexa\Contracts\Discounts\Policy\View`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Policy-View.html) + - [`Ibexa\Contracts\Discounts\Value\CartDiscountConditionInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-CartDiscountConditionInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountConditionInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountConditionInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountExpressionAwareInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountExpressionAwareInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountListInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountListInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountRuleInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountRuleInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountTranslationInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountTranslationInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountType`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountType.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountValueInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-DiscountValueInterface.html) + - [`Ibexa\Contracts\Discounts\Value\Struct\DiscountCreateStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-DiscountCreateStruct.html) + - [`Ibexa\Contracts\Discounts\Value\Struct\DiscountStructInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-DiscountStructInterface.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountTranslationStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-DiscountTranslationStruct.html) + - [`Ibexa\Contracts\Discounts\Value\DiscountUpdateStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-DiscountUpdateStruct.html) + - [`Ibexa\Contracts\Discounts\Value\TranslationAwareDiscountStructInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-TranslationAwareDiscountStructInterface.html) + - [`Ibexa\Contracts\Discounts\Value\TranslationAwareDiscountStructTrait`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Struct-TranslationAwareDiscountStructTrait.html) + - [`Ibexa\Contracts\DiscountsCodes\Exception\DiscountCodeNotFoundException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Exception-DiscountCodeNotFoundException.html) + - [`Ibexa\Contracts\DiscountsCodes\Exception\DiscountCodeRateLimitExceededException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Exception-DiscountCodeRateLimitExceededException.html) + - [`Ibexa\Contracts\DiscountsCodes\Exception\DiscountCodeUnusableException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Exception-DiscountCodeUnusableException.html) + - [`Ibexa\Contracts\DiscountsCodes\Exception\DiscountCodeUserInvalidArgumentException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Exception-DiscountCodeUserInvalidArgumentException.html) + - [`Ibexa\Contracts\DiscountsCodes\Value\DiscountCodeUsageInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Value-DiscountCodeUsageInterface.html) + - [`Ibexa\Contracts\DiscountsCodes\Value\DiscountCodeUser`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Value-DiscountCodeUser.html) + - [`Ibexa\Contracts\DiscountsCodes\Value\Query\DiscountCodeUsageQuery`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Value-Query-DiscountCodeUsageQuery.html) + - [`Ibexa\Contracts\DiscountsCodes\Value\Struct\DiscountCodeCreateStruct `](../api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Value-Struct-DiscountCodeCreateStruct.html) + - [`Ibexa\Contracts\DiscountsCodes\Value\StructDiscountCodeUpdateStruct `](../api/php_api/php_api_reference/classes/Ibexa-Contracts-DiscountsCodes-Value-Struct-DiscountCodeUpdateStruct.html) + +??? note "PIM Attributes" + + - [`Ibexa\Contracts\ProductCatalogDateTimeAttribute`](../api/php_api/php_api_reference/namespaces/ibexa-contracts-productcatalogdatetimeattribute.html) + - [Ibexa\Contracts\ProductCatalogSymbolAttribute](../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`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-Enabled.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\Identifier`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-Identifier.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\LogicalAnd`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-LogicalAnd.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\LogicalOr`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-LogicalOr.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\Name`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-Name.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\Criterion\Type`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-Criterion-Type.html) + +??? note "Discounts" + + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\CreatedAtCriterion`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-CreatedAtCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\CreatorCriterion`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-CreatorCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\EndDateCriterion`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-EndDateCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\IdentifierCriterion`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-IdentifierCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\IsEnabledCriterion`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-IsEnabledCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\LogicalAnd`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-LogicalAnd.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\LogicalOr`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-LogicalOr.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\NameCriterion`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-NameCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\PriorityCriterion`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-PriorityCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\StartDateCriterion`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-StartDateCriterion.html) + - [`Ibexa\Contracts\Discounts\Value\Query\Criterion\TypeCriterion`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-Criterion-TypeCriterion.html) + +??? note "PIM Attributes" + + - [`Ibexa\Contracts\ProductCatalogDateTimeAttribute\Search\Criterion\DateTimeAttribute`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalogDateTimeAttribute-Search-Criterion-DateTimeAttribute.html) + - [`Ibexa\Contracts\ProductCatalogDateTimeAttribute\Search\Criterion\DateTimeAttributeRange`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalogDateTimeAttribute-Search-Criterion-DateTimeAttributeRange.html) + - [`Ibexa\Contracts\ProductCatalogSymbolAttribute\Search\Criterion\SymbolAttribute`](../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`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-SortClause-Enabled.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\SortClause\Id`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-SortClause-Id.html) + - [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\Query\SortClause\Identifier`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Query-SortClause-Identifier.html) + +??? note "Discounts" + + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\CreatedAt`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-CreatedAt.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\EndDate`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-EndDate.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\Id`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-Id.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\Identifier`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-Identifier.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\Priority`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-Priority.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\StartDate`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-StartDate.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\Type`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Value-Query-SortClause-Type.html) + - [`Ibexa\Contracts\Discounts\Value\Query\SortClause\UpdatedAt`](../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`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-Event-BeforeExecuteEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\Action\Event\ExecuteEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Action-Event-ExecuteEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\BeforeCreateActionConfigurationEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-BeforeCreateActionConfigurationEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\CreateActionConfigurationEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-CreateActionConfigurationEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\BeforeUpdateActionConfigurationEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-BeforeUpdateActionConfigurationEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\UpdateActionConfigurationEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-UpdateActionConfigurationEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\BeforeDeleteActionConfigurationEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-BeforeDeleteActionConfigurationEvent.html) + - [`\Ibexa\Contracts\ConnectorAi\ActionConfiguration\Event\DeleteActionConfigurationEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-Event-DeleteActionConfigurationEvent.html) + - [`Ibexa\Contracts\ConnectorAi\Events\ContextEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Events-ContextEvent.html) + - [`Ibexa\Contracts\ConnectorAi\Events\ResolveActionConfigurationWidgetConfigEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Events-ResolveActionConfigurationWidgetConfigEvent.html) + - [`Ibexa\Contracts\ConnectorAi\Events\ResolveActionHandlerEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Events-ResolveActionHandlerEvent.html) + +??? note "Discounts" + + - [`\Ibexa\Contracts\Discounts\Event\BeforeCreateDiscountEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-BeforeCreateDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\CreateDiscountEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-CreateDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\BeforeDeleteDiscountEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-BeforeDeleteDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\DeleteDiscountEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-DeleteDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\BeforeUpdateDiscountEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-BeforeUpdateDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\UpdateDiscountEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-UpdateDiscountEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\CreateDiscountCreateStructEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-CreateDiscountCreateStructEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\CreateDiscountUpdateStructEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-CreateDiscountUpdateStructEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\CreateFormDataEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-CreateFormDataEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\MapDiscountToFormDataEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-MapDiscountToFormDataEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\Step\CreateFormDataEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-CreateFormDataEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\Step\MapCreateDataToStructEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-Step-MapCreateDataToStructEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\Step\MapDiscountToFormDataEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-MapDiscountToFormDataEvent.html) + - [`\Ibexa\Contracts\Discounts\Event\Step\MapUpdateDataToStructEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Event-Step-MapUpdateDataToStructEvent.html) + - [`\Ibexa\Contracts\Discounts\Admin\Form\Event\PreDiscountCreateEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Discounts-Admin-Form-Event-PreDiscountCreateEvent.html) + - [`\Ibexa\Contracts\DiscountsCodes\Event\BeforeDiscountCodeApplyEvent`](../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`](../templating/twig_function_reference/ai_actions_twig_functions.md#ibexa_ai_config) +- [`ibexa_render_discount_rule_type`](../templating/twig_function_reference/discounts_twig_functions.md#ibexa_render_discount_rule_type) +- [`ibexa_discounts_render_discount_badge`](../templating/twig_function_reference/discounts_twig_functions.md#ibexa_discounts_render_discount_badge) +- [`ibexa_get_original_price`](../templating/twig_function_reference/discounts_twig_functions.md#ibexa_get_original_price) +- [`ibexa_format_discount_value`](../templating/twig_function_reference/discounts_twig_functions.md#ibexa_format_discount_value) +- [`ibexa_discounts_is_active`](../templating/twig_function_reference/discounts_twig_functions.md#ibexa_discounts_is_active) +- [`ibexa_discounts_form_themes`](../templating/twig_function_reference/discounts_twig_functions.md#ibexa_discounts_form_themes) +- [`ibexa_discounts_can_edit`](../templating/twig_function_reference/discounts_twig_functions.md#ibexa_discounts_can_edit) +- [`ibexa_discounts_can_enable`](../templating/twig_function_reference/discounts_twig_functions.md#ibexa_discounts_can_enable) +- [`ibexa_discounts_can_disable`](../templating/twig_function_reference/discounts_twig_functions.md#ibexa_discounts_can_disable) +- [`ibexa_discounts_can_delete`](../templating/twig_function_reference/discounts_twig_functions.md#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](components.md#php-code) 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](../templating/twig_function_reference/icon_twig_functions.md#icons-reference) replace the ones found in previous versions and serve as a highlight of a future system design + +### Deprecations + +Refer to [Ibexa DXP v5.0 renames, deprecations and removals](ibexa_dxp_v5.0_deprecations.md) for a full list of changes and how they influence your project. + +### Full changelog + +[[% include 'snippets/release_50.md' %]] + +To update your application, see the [update instructions](../update_and_migration/from_4.6/update_to_5.0.md). + +[[= release_note_entry_end() =]] + +
diff --git a/docs/release_notes/ibexa_dxp_v5.0_deprecations.md b/docs/release_notes/ibexa_dxp_v5.0_deprecations.md new file mode 100644 index 0000000000..bb6c79075e --- /dev/null +++ b/docs/release_notes/ibexa_dxp_v5.0_deprecations.md @@ -0,0 +1,578 @@ + + +# Ibexa DXP v5.0 renames, deprecations and removals + +This page lists backwards compatibility breaks and deprecations introduced in [[= product_name =]] v5.0. + +!!! tip "Upgrade to v5" + + For a guide on moving your project to v5.0, + see [Update and migration instructions](../update_and_migration/from_4.6/update_to_5.0.md). + +[[= product_name =]] v5.0 introduces further modifications to significant parts of the code to align with the ones introduced in previous versions. + +These changes include dropped packages, changing database table and column names, field identifiers, namespaces, function names, and others. + +## Dropped packages + +[[= product_name =]] v5.0 no longer includes legacy Commerce packages. +The solution has been replaced with [Commerce](commerce.md) that is included as standard and has been continuously developed since v4.4. + +Also, packages `compatibility-layer` and `icons` have been dropped. + +## Database table and column names + +A number of database table and column names have changed. +If your custom code directly queries them, you need to update the code. + +| Old name | New name | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `ezbinaryfile` | `ibexa_binary_file` | +| `ezcobj_state` | `ibexa_object_state` | +| `ezcobj_state_group` | `ibexa_object_state_group` | +| `ezcobj_state_group_language` | `ibexa_object_state_group_language` | +| `ezcobj_state_language` | `ibexa_object_state_language` | +| `ezcobj_state_link` | `ibexa_object_state_link` | +| `ezcontent_language` | `ibexa_content_language` | +| `ezcontentbrowsebookmark` | `ibexa_content_bookmark` | +| `ezcontentclass` | `ibexa_content_type` | +| `ezcontentclass_attribute` | `ibexa_content_type_field_definition` | +| `ezcontentclass_attribute.contentclass_id` | `ibexa_content_type_field_definition.content_type_id` | +| `ezcontentclass_attribute_ml` | `ibexa_content_type_field_definition_ml` | +| `ezcontentclass_attribute_ml.contentclass_attribute_id` | `ibexa_content_type_field_definition_ml.content_type_field_definition_id` | +| `ezcontentclass_classgroup` | `ibexa_content_type_group_assignment` | +| `ezcontentclass_classgroup.contentclass_id` | `ibexa_content_type_group_assignment.content_type_id` | +| `ezcontentclass_name` | `ibexa_content_type_name` | +| `ezcontentclass_name.contentclass_id` | `ibexa_content_type_name.content_type_id` | +| `ezcontentclassgroup` | `ibexa_content_type_group` | +| `ezcontentobject` | `ibexa_content` | +| `ezcontentobject.contentclass_id` | `ibexa_content.content_type_id` | +| `ezcontentobject_attribute` | `ibexa_content_field` | +| `ezcontentobject_attribute.contentclassattribute_id` | `ibexa_content_field.content_type_field_definition_id` | +| `ezcontentobject_link` | `ibexa_content_relation` | +| `ezcontentobject_link.contentclassattribute_id` | `ibexa_content_relation.content_type_field_definition_id` | +| `ezcontentobject_name` | `ibexa_content_name` | +| `ezcontentobject_trash` | `ibexa_content_trash` | +| `ezcontentobject_tree` | `ibexa_content_tree` | +| `ezcontentobject_version` | `ibexa_content_version` | +| `ezdatebasedpublisher_scheduled_entries` | `ibexa_scheduler_scheduled_entries` | +| `ezdfsfile` | `ibexa_dfs_file` | +| `ezeditorialworkflow_markings` | `ibexa_workflow_markings` | +| `ezeditorialworkflow_transitions` | `ibexa_workflow_transitions` | +| `ezeditorialworkflow_workflows` | `ibexa_workflow_workflows` | +| `ezform_field_attributes` | `ibexa_form_field_attributes` | +| `ezform_field_validators` | `ibexa_form_field_validators` | +| `ezform_fields` | `ibexa_form_fields` | +| `ezform_form_submission_data` | `ibexa_form_form_submission_data` | +| `ezform_form_submissions` | `ibexa_form_form_submissions` | +| `ezform_forms` | `ibexa_form_forms` | +| `ezgmaplocation` | `ibexa_map_location` | +| `ezimagefile` | `ibexa_image_file` | +| `ezkeyword` | `ibexa_keyword` | +| `ezkeyword_attribute_link` | `ibexa_keyword_field_link` | +| `ezmedia` | `ibexa_media` | +| `eznode_assignment` | `ibexa_node_assignment` | +| `eznotification` | `ibexa_notification` | +| `ezpackage` | `ibexa_package` | +| `ezpage_attributes` | `ibexa_page_attributes` | +| `ezpage_blocks` | `ibexa_page_blocks` | +| `ezpage_blocks_design` | `ibexa_page_blocks_design` | +| `ezpage_blocks_visibility` | `ibexa_page_blocks_visibility` | +| `ezpage_map_attributes_blocks` | `ibexa_page_map_attributes_blocks` | +| `ezpage_map_blocks_zones` | `ibexa_page_map_blocks_zones` | +| `ezpage_map_zones_pages` | `ibexa_page_map_zones_pages` | +| `ezpage_pages` | `ibexa_page_pages` | +| `ezpage_zones` | `ibexa_page_zones` | +| `ezpolicy` | `ibexa_policy` | +| `ezpolicy_limitation` | `ibexa_policy_limitation` | +| `ezpolicy_limitation_value` | `ibexa_policy_limitation_value` | +| `ezpreferences` | `ibexa_preferences` | +| `ezrole` | `ibexa_role` | +| `ezsearch_object_word_link` | `ibexa_search_object_word_link` | +| `ezsearch_object_word_link.contentclass_id` | `ibexa_search_object_word_link.content_type_id` | +| `ezsearch_object_word_link.contentclass_attribute_id` | `ibexa_search_object_word_link.content_type_field_definition_id` | +| `ezsearch_word` | `ibexa_search_word` | +| `ezsection` | `ibexa_section` | +| `ezsite` | `ibexa_site` | +| `ezsite_data` | `ibexa_site_data` | +| `ezsite_public_access` | `ibexa_site_public_access` | +| `ezurl` | `ibexa_url` | +| `ezurl_object_link` | `ibexa_url_content_link` | +| `ezurlalias` | `ibexa_url_alias` | +| `ezurlalias_ml` | `ibexa_url_alias_ml` | +| `ezurlalias_ml_incr` | `ibexa_url_alias_ml_incr` | +| `ezurlwildcard` | `ibexa_url_wildcard` | +| `ezuser` | `ibexa_user` | +| `ezuser_accountkey` | `ibexa_user_accountkey` | +| `ezuser_role` | `ibexa_user_role` | +| `ezuser_setting` | `ibexa_user_setting` | + +## Field type identifiers + +Several field type identifiers have changed. + +| Old identifier (`legacy_alias`) | New identifier (`alias`) | +|:--------------------------------|:--------------------------------| +| `ezauthor` | `ibexa_author` | +| `ezbinaryfile` | `ibexa_binaryfile` | +| `ezboolean` | `ibexa_boolean` | +| `ezcontentquery` | `ibexa_content_query` | +| `ezcountry` | `ibexa_country` | +| `ezdate` | `ibexa_date` | +| `ezdatetime` | `ibexa_datetime` | +| `ezemail` | `ibexa_email` | +| `ezfloat` | `ibexa_float` | +| `ezform` | `ibexa_form` | +| `ezgmaplocation` | `ibexa_gmap_location` | +| `ezimage` | `ibexa_image` | +| `ezimageasset` | `ibexa_image_asset` | +| `ezinteger` | `ibexa_integer` | +| `ezisbn` | `ibexa_isbn` | +| `ezkeyword` | `ibexa_keyword` | +| `ezlandingpage` | `ibexa_landing_page` | +| `ezmatrix` | `ibexa_matrix` | +| `ezmedia` | `ibexa_media` | +| `ezobjectrelation` | `ibexa_object_relation` | +| `ezobjectrelationlist` | `ibexa_object_relation_list` | +| `ezrichtext` | `ibexa_richtext` | +| `ezselection` | `ibexa_selection` | +| `ezstring` | `ibexa_string` | +| `eztext` | `ibexa_text` | +| `eztime` | `ibexa_time` | +| `ezurl` | `ibexa_url` | +| `ezuser` | `ibexa_user` | + +## PHP API classes and methods + +!!! note "[[= product_name_base =]] Rector" + + [[[= product_name_base =]] Rector package](https://github.com/ibexa/rector) has been introduced that is based on [Rector](https://github.com/rectorphp) and comes with additional rules for working with Ibexa code. + You can use it to get rid of PHP code deprecations. + +### `ibexa/admin-ui` + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface::getContentCreateLimitations`| `\Ibexa\AdminUi\Permission\LimitationResolverInterface::getContentCreateLimitations` | +| `\Ibexa\Contracts\AdminUi\Permission\PermissionCheckerInterface::getContentUpdateLimitations` | `\Ibexa\AdminUi\Permission\LimitationResolverInterface::getContentUpdateLimitations` | +| `\Ibexa\Contracts\AdminUi\UniversalDiscovery\Provider::getRestFormat` | Removed | +| `\Ibexa\AdminUi\Form\Type\Search\DateIntervalType` | `\Ibexa\AdminUi\Form\Type\Date\DateIntervalType`| +| `\Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface::getSiteaccessesForLocation`| `\Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface::getSiteAccessesList`| +| `\Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface::getSiteaccesses`| `\Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface::getSiteAccessesList`| +| `\Ibexa\AdminUi\Specification\AbstractSpecification`| `\Ibexa\Contracts\Core\Specification\AbstractSpecification`| +| `\Ibexa\AdminUi\Specification\AndSpecification` | `\Ibexa\Contracts\Core\Specification\AndSpecification` | +| `\Ibexa\AdminUi\Specification\NotSpecification` | `\Ibexa\Contracts\Core\Specification\NotSpecification` | +| `\Ibexa\AdminUi\Specification\OrSpecification` | `\Ibexa\Contracts\Core\Specification\OrSpecification` | +| `\Ibexa\AdminUi\Specification\SpecificationInterface` | `\Ibexa\Contracts\Core\Specification\SpecificationInterface` | +| `\Ibexa\AdminUi\Tab\Dashboard\PagerContentToDataMapper` | `\Ibexa\AdminUi\Tab\Dashboard\PagerLocationToDataMapper` | +| `\Ibexa\AdminUi\Translation\Extractor\LimitationTranslationExtractor` | Removed | +| `\Ibexa\AdminUi\Translation\Extractor\PolicyTranslationExtractor` | Removed | +| `\Ibexa\AdminUi\UI\Dataset\ContentDraftsDataset` | `\Ibexa\AdminUi\UI\Dataset\ContentDraftListDataset` | +| `\Ibexa\AdminUi\UI\Dataset\DatasetFactory::relations` | `\Ibexa\AdminUi\UI\Dataset\DatasetFactory::relationList` | +| `\Ibexa\AdminUi\UI\Dataset\DatasetFactory::contentDrafts` | `\Ibexa\AdminUi\UI\Dataset\DatasetFactory::contentDraftList` | +| `\Ibexa\AdminUi\UI\Value\ValueFactory::createRelation` | `\Ibexa\AdminUi\UI\Value\ValueFactory::createRelationItem` | +| `\Ibexa\AdminUi\Validator\ValidationErrorsProcessor` | `\Ibexa\ContentForms\Validator\ValidationErrorsProcessor` | +| `\Ibexa\AdminUi\Validator\Constraints\FieldTypeValidator` | `\Ibexa\ContentForms\Validator\Constraints\FieldTypeValidator` | + +### `ibexa/cart` + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Cart\Money\MoneyFactory`| `\Ibexa\ProductCatalog\Money\IntlMoneyFactory`| + +### `ibexa/content-forms` + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\ContentForms\Controller\UserRegisterController`| `\Ibexa\Bundle\User\Controller\UserRegisterController`| +| `\Ibexa\ContentForms\User\View\UserRegisterConfirmView`| `\Ibexa\User\View\UserRegisterConfirmView`| +| `\Ibexa\ContentForms\User\View\UserRegisterFormView`| `\Ibexa\User\View\UserRegisterFormView`| + +### `ibexa/core` + +Support for facet search has been dropped, use the `Aggregation` API instead. + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\Core\DependencyInjection\Security\PolicyProvider\RepositoryPolicyProvider`| Removed | +| `\Ibexa\Bundle\Core\Imagine\VariationPathGenerator`| `\Ibexa\Contracts\Core\Variation\VariationPathGenerator`| +| `\Ibexa\ContentForms\User\View\UserRegisterFormView`| `\Ibexa\User\View\UserRegisterFormView`| +| `/Ibexa\Bundle\Debug\Collector\PersistenceCacheCollector::getCount` | `\Ibexa\Bundle\Debug\Collector\PersistenceCacheCollector::getStats` | +| `\Ibexa\Bundle\RepositoryInstaller\Installer\Installer::createConfiguration` | Deprecated | +| `\Ibexa\Contracts\Core\FieldType\FieldStorage::getIndexData` | `\Ibexa\Contracts\Core\FieldType\Indexable` | +| `\Ibexa\Contracts\Core\FieldType\BinaryBase\PathGenerator` | `\Ibexa\Contracts\Core\FieldType\BinaryBase\PathGeneratorInterface` | +| `\Ibexa\Contracts\Core\IO\BinaryFile::$mimeType` | `\Ibexa\Core\IO\IOMetadataHandler::getMimeType` | +| `\Ibexa\Contracts\Core\Persistence\Handler::beginTransaction` | `\Ibexa\Contracts\Core\Persistence\TransactionHandler::beginTransaction` | +| `\Ibexa\Contracts\Core\Persistence\Handler::commit` | `\Ibexa\Contracts\Core\Persistence\TransactionHandler::commit` | +| `\Ibexa\Contracts\Core\Persistence\Handler::rollback` | `\Ibexa\Contracts\Core\Persistence\TransactionHandler::rollback` | +| `\Ibexa\Contracts\Core\Persistence\Bookmark\Bookmark::$name` | Removed | +| `\Ibexa\Contracts\Core\Persistence\Bookmark\CreateStruct::$name` | Removed | +| `\Ibexa\Contracts\Core\Persistence\Content\ContentInfo::STATUS_ARCHIVED` | `\Ibexa\Contracts\Core\Persistence\Content\ContentInfo::STATUS_TRASHED` | +| `\Ibexa\Contracts\Core\Persistence\Content\ContentInfo::$isPublished` | Removed. Use `ContentInfo::$status` with value `STATUS_PUBLISHED`. | +| `\Ibexa\Contracts\Core\Persistence\Content\LoadStruct` | Removed | +| `\Ibexa\Contracts\Core\Persistence\Content\Location::$pathIdentificationString` | Removed | +| `\Ibexa\Contracts\Core\Persistence\Content\Location\CreateStruct::$pathIdentificationString` | Removed | +| `\Ibexa\Contracts\Core\Persistence\Content\Location\Handler::markSubtreeModified` | Removed | +| `\Ibexa\Contracts\Core\Persistence\FieldType\IsEmptyValue` | Removed | +| `\Ibexa\Contracts\Core\Persistence\User\Handler::loadPoliciesByUserId` | Removed | +| `\Ibexa\Contracts\Core\Repository\ContentService::loadContentDrafts` | `\Ibexa\Contracts\Core\Repository\ContentService::loadContentDraftList` | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Location::SORT_FIELD_MODIFIED_SUBNODE` | Removed | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\LogicalOperator::getSpecifications` | Removed | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Location\IsMainLocation::createFromQueryBuilder` | Removed. Use the constructor directly. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Location\Priority::createFromQueryBuilder` | Removed. Use the constructor directly. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\ContentTypeFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\CriterionFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\DateRangeFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\FieldFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\FieldRangeFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\Location` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\LocationFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\SectionFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\TermFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\UserFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Query\FacetBuilder\Location\LocationFacetBuilder` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\SearchResult::$facets` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\SearchResult::$spellSuggestion` | `\Ibexa\Contracts\Core\Repository\Values\Content\Search\SearchResult::$spellcheck` | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\ContentTypeFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\CriterionFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\DateRangeFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\FieldFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\FieldRangeFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\LocationFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\RangeFacetEntry` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\SectionFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\TermFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Search\Facet\UserFacet` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Core\Repository\Values\Content\Trash\SearchResult::$count` | `\Ibexa\Contracts\Core\Repository\Values\Content\Trash\SearchResult::$totalCount` | +| `\Ibexa\Contracts\Core\Repository\Values\ContentType\ContentType::@$isContainer` | `\Ibexa\Contracts\Core\Repository\Values\ContentType\ContentType::isContainer` | +| `\Ibexa\Contracts\Core\User\Identity` | Removed. Use the `FOSHttpCacheBundle` user context feature. | +| `\Ibexa\Core\Event\UserService` | Listen to `BeforeUpdateUserPasswordEvent` instead of `BeforeUpdateUserEvent`. | +| `\Ibexa\Core\Event\UserService` | Listen to `UpdateUserPasswordEvent` instead of `UpdateUserEvent`. | +| `\Ibexa\Core\FieldType\GatewayBasedStorage` | `\Ibexa\Contracts\Core\FieldType\GatewayBasedStorage` | +| `\Ibexa\Core\FieldType\StorageGateway` | `\Ibexa\Contracts\Core\FieldType\StorageGatewayInterface` | +| `\Ibexa\Core\FieldType\Image\Value::@$path` | Equivalent to `$id` or `$inputUri`, depending on which one is set. | +| `\Ibexa\Core\FieldType\Image\Value::fromString` | `\Ibexa\Core\FieldType\FieldType::acceptValue` | +| `\Ibexa\Core\Helper\FieldHelper::getFieldDefinition` | If content exists, use `$content->getContentType()->getFieldDefinition($identifier)`. | +| `\Ibexa\Core\Helper\PreviewLocationProvider::loadMainLocation` | `\Ibexa\Core\Helper\PreviewLocationProvider::loadMainLocationByContent` | +| `\Ibexa\Core\IO\IOServiceInterface::getExternalPath` | `\Ibexa\Core\IO\IOServiceInterface::loadBinaryFileByUri` | +| `\Ibexa\Core\IO\IOServiceInterface::getInternalPath` | Removed. Use the `uri` property. | +| `\Ibexa\Core\IO\MetadataHandler` | Removed | +| `\Ibexa\Core\IO\MetadataHandler\ImageSize` | Removed | +| `\Ibexa\Core\IO\Values\BinaryFile::$mimeType` | `\Ibexa\Core\IO\IOServiceInterface::getMimeType` | +| `\Ibexa\Core\MVC\Symfony\MVCEvents::CACHE_CLEAR_CONTENT` | Removed | +| `\Ibexa\Core\MVC\Symfony\Event\ContentCacheClearEvent` | Removed | +| `\Ibexa\Core\MVC\Symfony\Locale\LocaleConverterInterface::convertToEz` | `\Ibexa\Core\MVC\Symfony\Locale\LocaleConverterInterface::convertToRepository` | +| `\Ibexa\Core\MVC\Symfony\SiteAccess\Matcher\Regex\Host` | Removed | +| `\Ibexa\Core\MVC\Symfony\SiteAccess\Matcher\Regex\URI` | Removed | +| `\Ibexa\Core\MVC\Symfony\View\Provider\Content` | Removed | +| `\Ibexa\Core\MVC\Symfony\View\Provider\Location` | Removed | +| `\Ibexa\Core\Persistence\Cache\PersistenceLogger::getCount` | `\Ibexa\Core\Persistence\Cache\PersistenceLogger::getStats` | +| `\Ibexa\Core\Persistence\Legacy\Handler::beginTransaction` | Removed. Use `\Ibexa\Contracts\Core\Persistence\TransactionHandler\TransactionHandler::beginTransaction`. | +| `\Ibexa\Core\Persistence\Legacy\Handler::commit` | Removed. Use `\Ibexa\Contracts\Core\Persistence\TransactionHandler\TransactionHandler::commit`. | +| `\Ibexa\Core\Persistence\Legacy\Handler::rollback` | Removed. Use `\Ibexa\Contracts\Core\Persistence\TransactionHandler\TransactionHandler::rollback`. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\AuthorConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\BinaryFileConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\CheckboxConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\CountryConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTimeConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter` | Removed the `timestamp` property. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\DateConverter` | Removed the `timestamp` property. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\DateConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\EmailAddressConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\FloatConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\IntegerConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\ISBNConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\KeywordConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\MapLocationConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\MediaConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\NullConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\RelationConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\SelectionConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\TextBlockConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\TextLineConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\TimeConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter\UrlConverter::create` | Removed. Use the default constructor. | +| `\Ibexa\Core\Persistence\Legacy\Content\Language\MaskGenerator::generateLanguageMask` | `\Ibexa\Core\Persistence\Legacy\Content\Language\MaskGenerator::generateLanguageMaskFromLanguageCodes` | +| `\Ibexa\Core\Repository\PermissionsCriterionHandler` | Removed | +| `\Ibexa\Core\Repository\SectionService::countAssignedContents` | Deprecated. Use `SearchService` with `Section` criterion. | +| `\Ibexa\Core\Repository\Helper\NameSchemaService` | `\Ibexa\Contracts\Core\Repository\NameSchema\NameSchemaServiceInterface` | +| `\Ibexa\Core\Repository\Helper\RoleDomainMapper` | Removed | +| `\Ibexa\Core\Repository\Mapper\ContentTypeDomainMapper::buildSPIFieldDefinitionUpdate` | `\Ibexa\Core\Repository\Mapper\ContentTypeDomainMapper::buildSPIFieldDefinitionFromUpdateStruct` | +| `\Ibexa\Core\Repository\Mapper\ContentTypeDomainMapper::buildSPIFieldDefinitionCreate` | `\Ibexa\Core\Repository\Mapper\ContentTypeDomainMapper::buildSPIFieldDefinitionFromCreateStruct` | +| `\Ibexa\Core\Repository\User\PasswordHashServiceInterface` | `\Ibexa\Contracts\Core\Repository\PasswordHashService` | +| `\Ibexa\Core\Search\Common\FieldNameResolver::getFieldNamesget` | `\Ibexa\Core\Search\Common\FieldNameResolver::getFieldTypes` | +| `\Ibexa\Core\Search\Common\IncrementalIndexer::createSearchIndex` | Removed | +| `\Ibexa\Tests\Integration\Core\Repository\BaseTest::isVersion4` | Removed | +| `\Ibexa\Tests\Integration\Core\Repository\SearchServiceTest::testDeprecatedCriteriaProperty` | Removed | +| `\Ibexa\Tests\Core\Repository\Service\Mock\PermissionsCriterionHandlerTest` | Removed | +| `\Ibexa\Contracts\Core\Repository\Values\Translation` | Implementations must implement `\Stringable` interface. | +| `\Ibexa\Bundle\Core\ApiLoader\RepositoryConfigurationProvider` | Deprecated. Use `\Ibexa\Contracts\Core\Container\ApiLoader\RepositoryConfigurationProviderInterface`. | +| `\Ibexa\Bundle\Core\ApiLoader\RepositoryFactory` | Deprecated. Use `\Ibexa\Core\Base\Container\ApiLoader\RepositoryFactory`.| + +!!! note "Dropped single colon notation" + + [[= product_name_base =]]-named controllers can no longer be referenced using a single-colon notation. + For example, `ibexa_content:viewAction` must be changed to `ibexa_content::viewAction`. + + The change affects the following controllers: + + - ibexa_content + - ibexa_query + - ibexa_query_render + - ibexa.controller.content.preview + +### ibexa/corporate-account + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\CorporateAccount\Controller\ApplicationController\PersistenceCacheCollector::alreadyExistsAction`| Removed | + +### ibexa/design-engine + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\DesignEngine\Templating\TemplateNameResolverInterface::EZ_DESIGN_NAMESPACE`| Removed. Use the `\Ibexa\Contracts\DesignEngine\DesignAwareInterface::DESIGN_NAMESPACE` constant. | + +### ibexa/elasticsearch + +Support for facets in `ibexa/elasticsearch` has been dropped, use the `Aggregation` API instead. + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Contracts\Elasticsearch\Query\FacetBuilderVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Contracts\Elasticsearch\Query\FacetResultExtractor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\AbstractTermsVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\ContentTypeVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\DispatcherVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\FilteredFacetVisitorDecorator` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\GlobalFacetVisitorDecorator` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\SectionVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\FacetBuilderVisitor\UserVisitor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\AbstractTermsResultExtractor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\ContentTypeResultExtractor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\DispatcherResultExtractor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\FilteredFacetResultExtractorDecorator` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\GlobalFacetResultExtractorDecorator` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\SectionResultExtractor` | Removed. Use the `Aggregation` API. | +| `\Ibexa\Elasticsearch\Query\ResultExtractor\FacetResultExtractor\UserResultExtractor` | Removed. Use the `Aggregation` API. | + +### ibexa/fieldtype-page + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\FieldTypePage\DependencyInjection\Compiler\AbstractConfigurationAwareCompilerPass::EXTENSION_CONFIG_KEY` | Removed. Use the `\Ibexa\Bundle\FieldTypePage\DependencyInjection\IbexaFieldTypePageExtension::EXTENSION_NAME` constant. | +| `\Ibexa\Bundle\FieldTypePage\DependencyInjection\Compiler\BlockDefinitionConfigurationCompilerPass::EXTENSION_CONFIG_KEY` | Removed. Use the `\Ibexa\Bundle\FieldTypePage\DependencyInjection\IbexaFieldTypePageExtension::EXTENSION_NAME` constant. | +| `\Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Event\Listener\PreviewTemplateEventSubscriber` | Removed | +| `\Ibexa\FieldTypePage\ScheduleBlock\ScheduleService::distributeItems` | Removed | + +### ibexa/fieldtype-query + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\FieldTypeQuery\QueryFieldPaginationService` | Removed | +| `\Ibexa\FieldTypeQuery\Persistence\Legacy\Content\FieldValue\Converter\QueryConverter::create` | Removed. Use the default constructor. | + +### ibexa/fieldtype-richtext + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\FieldTypeRichText\Translation\Extractor\OnlineEditorCustomAttributesExtractor` | Removed | +| `\Ibexa\FieldTypeQuery\Persistence\Legacy\Content\FieldValue\Converter\QueryConverter::create` | Removed. Use the default constructor. | + +!!! note "Missing custom tag configuration error" + + If the stored RichText record includes any custom tags that aren’t configured or recognized, saving the content will cause a validation error. + +### ibexa/form-builder + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\FormBuilder\DependencyInjection\Configuration::TREE_ROOT` | Removed. Use the `\Ibexa\Bundle\FormBuilder\DependencyInjection\IbexaFormBuilderExtension::EXTENSION_NAME` constant. | +| `\Ibexa\FormBuilder\FieldType\Storage\FormStorage::getIndexData` | Removed | + +### ibexa/graphql + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\GraphQL\Schema\ImagesVariationsBuilder` | Removed | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentCollectionField` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemConnectionField` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentConnection` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemConnectionName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentCreateInputName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemCreateInputName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentUpdateInputName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemUpdateInputName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentTypeName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemUpdateInputName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainContentField` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemField` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainMutationCreateContentField` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemMutationCreateItemField` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainMutationUpdateContentField` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemMutationUpdateItemField` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainGroupName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemGroupName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::domainGroupTypesName` | `\Ibexa\GraphQL\Schema\Domain\Content\NameHelper::itemGroupTypesName` | +| `\Ibexa\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\FieldDefinitionArgsBuilderMapper` | `\Ibexa\Contracts\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\FieldDefinitionMapper` | +| `\Ibexa\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\FieldDefinitionInputMapper` | `\Ibexa\Contracts\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\FieldDefinitionMapper` | + +### ibexa/measurement + +!!! note "Dropped `measurement` product attribute" + + The deprecated product attribute `measurement` has been removed. + The change does not affect the [measurement field type](measurementfield.md). + +### ibexa/migrations + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Migration\ValueObject\ContentType\Matcher::CONTENT_TYPE_IDENTIFIER` | Removed. Use the `\Ibexa\Migration\StepExecutor\ContentType\IdentifierFinder::CONTENT_TYPE_IDENTIFIER` constant. | + +### ibexa/product-catalog + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\ProductCatalog\Bridge` | Migrate data to a local product catalog. | + +### ibexa/page-builder + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\PageBuilder\DependencyInjection\IbexaPageBuilderExtension::SESSION_KEY_SITEACCESS` | Removed | +| `\Ibexa\PageBuilder\PageBuilder\PreviewLanguageCodeResolver` | Removed | +| `\Ibexa\PageBuilder\Siteaccess\SiteaccessService::resolveSiteAccessForLocation` | `\Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface::getSiteAccessesListForLocation` | +| `\Ibexa\PageBuilder\Siteaccess\SiteaccessService::resolveSiteAccessForContent` | `\Ibexa\Contracts\PageBuilder\Siteaccess\SiteAccessResolver::resolveSiteAccessForContent` | +| `\Ibexa\PageBuilder\Siteaccess\SiteaccessService::resolveSiteAccessBasedOnLanguage` | Removed | + +### ibexa/rest + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\Rest\EventListener\CsrfListener::isLoginRequest` | Add `csrf_protection: false` attribute to route definition. | +| `\Ibexa\Bundle\Rest\EventListener\CsrfListener::isSessionRoute` | Add `csrf_protection: false` attribute to route definition. | +| `\Ibexa\Bundle\Rest\EventListener\RequestListener::REST_PREFIX_PATTERN` | Use `\Ibexa\Contracts\Rest\UriParser\UriParserInterface::isRestRequest` function. | +| `\Ibexa\Bundle\Rest\EventListener\RequestListener::hasRestPrefix` | Use `\Ibexa\Contracts\Rest\UriParser\UriParserInterface::isRestRequest` function. | +| `\Ibexa\Bundle\Rest\RequestParser\Router` | `\Ibexa\Contracts\Rest\UriParser\UriParserInterface` | +| `\Ibexa\Contracts\Rest\Output\Generator::generateMediaType` | `\Ibexa\Contracts\Rest\Output\Generator::generateMediaTypeWithVendor` | +| `\Ibexa\Rest\Output\FieldTypeSerializer::serializeFieldValue` | `\Ibexa\Rest\Output\FieldTypeSerializer::serializeContentFieldValue` | +| `\Ibexa\Rest\Server\Controller\Content::createView` | Forwards the request to the new `/views` location, but returns a 301. | +| `\Ibexa\Rest\Server\Controller\User::$csrfTokenStorage` | Removed | +| `\Ibexa\Rest\Server\Controller\User::$sessionController` | Removed | +| `\Ibexa\Rest\Server\Controller\User::createSession` | `\Ibexa\Rest\Server\Controller\SessionController::refreshSessionAction` | +| `\Ibexa\Rest\Server\Controller\User::refreshSession` | `\Ibexa\Rest\Server\Controller\SessionController::refreshSessionAction` | +| `\Ibexa\Rest\Server\Controller\User::deleteSession` | `\Ibexa\Rest\Server\Controller\SessionController::refreshSessionAction` | + +### ibexa/ibexa/scheduler + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\Rest\EventListener\CsrfListener::isLoginRequest` | Add `csrf_protection: false` attribute to route definition. | + +### ibexa/site-factory + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\SiteFactory\DependencyInjection\Configuration::TREE_ROOT` | Removed. Use the `\Ibexa\Bundle\SiteFactory\DependencyInjection\IbexaSiteFactoryExtension::EXTENSION_NAME` constant. | +| `\Ibexa\SiteFactory\Event\EventDispatcher` | Removed | +| `\Ibexa\SiteFactory\ServiceDecorator\SiteServiceDecorator` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\BeforeCreateSiteEvent` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\BeforeDeleteSiteEvent` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\BeforeUpdateSiteEvent` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\CreateSiteEvent` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\DeleteSiteEvent` | Removed | +| `\Ibexa\SiteFactory\ServiceEvent\Events\UpdateSiteEvent` | Removed | + +### ibexa/solr + +Support for facet search has been dropped, use the `Aggregation` API instead. + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Solr\Handler::$resultExtractor` | Use `$contentResultExtractor` or `$locationResultExtractor`. | +| `\Ibexa\Solr\Gateway\UpdateSerializer` | `\Ibexa\Solr\Gateway\UpdateSerializer\XmlUpdateSerializer` | +| `\Ibexa\Solr\Query\FacetBuilderVisitor` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\FacetFieldVisitor` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\Common\FacetBuilderVisitor\Aggregate` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\Common\FacetBuilderVisitor\ContentType` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\Common\FacetBuilderVisitor\Section` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\Common\FacetBuilderVisitor\User` | Use `Aggregation API`. | +| `\Ibexa\Solr\Query\Content\CriterionVisitor\Field` | `\Ibexa\Solr\Query\Common\CriterionVisitor\Field` | + +### ibexa/storefront + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Contracts\Storefront\Repository\TaxonomyTreeServiceInterface::getPath` | `\Ibexa\Contracts\Taxonomy\Service\TaxonomyServiceInterface::getPath` | + +### ibexa/system-info + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Bundle\SystemInfo\SystemInfo\Collector\IbexaSystemInfoCollector::CONTENT_PACKAGES` | Removed. Use the `\Ibexa\Bundle\SystemInfo\SystemInfo\Collector\IbexaSystemInfoCollector::HEADLESS_PACKAGES` constant. | +| `\Ibexa\Bundle\SystemInfo\SystemInfo\Collector\IbexaSystemInfoCollector::ENTERPRISE_PACKAGES` | Removed. Use `IbexaSystemInfoCollector::EXPERIENCE_PACKAGES` or `IbexaSystemInfoCollector::HEADLESS_PACKAGES` constant. | +| `\Ibexa\Bundle\SystemInfo\SystemInfo\Value\IbexaSystemInfo::$stability` | `\Ibexa\Bundle\SystemInfo\SystemInfo\Value\IbexaSystemInfo` is considered internal. | + +### ibexa/workflow + +| Old FQN | New FQN / Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `\Ibexa\Contracts\Workflow\Service\WorkflowServiceInterface::loadWorkflowMetadataOriginatedByUser` | Removed | +| `\Ibexa\Contracts\Workflow\Service\WorkflowServiceInterface::loadAllWorkflowMetadata` | Removed | + +## Services + +The following service definitions have been removed: + +| Service name | Comment | +|:------------------------------------------------------|:------------------------------------------------------------------------| +| `ibexa.cart.number_formatter.currency.factory` | Removed | + +## JavaScript classes and functions + +|Old class or function|New class or function| +|:----|:----| +| `formatLine` const in `/src/bundle/Resources/public/js/scripts/helpers/form.error.helper.js` | Removed | +| `parseAll` const in `/src/bundle/Resources/public/js/scripts/helpers/middle.ellipsis.js` | Removed | +| `fileSizeToString` const in `src/bundle/ui-dev/src/modules/multi-file-upload/helpers/text.helper.js` | Use `fileSizeToString` function from `/src/bundle/ui-dev/src/modules/common/helpers/text.helper.js`. | +| `src/bundle/ui-dev/src/modules/common/components/backdrop/backdrop.js` | Use the `ibexa.core.Backdrop` component. | +| `src/bundle/ui-dev/src/modules/page-builder/components/block/sidebar.block.js` | `src/bundle/ui-dev/src/modules/page-builder/components/block/block.js` | +| `src/bundle/ui-dev/src/modules/page-builder/components/block/sidebar.blocks.group.js` | `src/bundle/ui-dev/src/modules/page-builder/components/block/blocks.group.js` | +| `src/bundle/ui-dev/src/modules/page-builder/components/sidebar/sidebar.js` | `src/bundle/ui-dev/src/modules/page-builder/components/toolbox.js` | +| `src/bundle/ui-dev/src/modules/tree-builder/components/indentation-vertical/indentation.vertical.js)`| `src/bundle/ui-dev/src/modules/tree-builder/components/indentation-horizontal/indentation.horizontal.js` | +| `src/bundle/ui-dev/src/modules/tree-builder/components/portal-provider/portal.provider.js` | `tree-builder/src/bundle/ui-dev/src/modules/tree-builder/components/portal/portal.js` | +| `src/bundle/ui-dev/src/modules/tree-builder/hooks/usePortal.js` | `tree-builder/src/bundle/ui-dev/src/modules/tree-builder/components/portal/portal.js` | + +## Configuration keys + +| Old name | New name | +|:----|:----| +| `ibexa.system.*.database.*` | `ibexa.repositories` | +| `ibexa.system.*.session_name` | `ibexa.system.*.session.name` | +| `ibexa.site_access.config.default.user_registration.group_id` | `ibexa.site_access.config.default.user_registration.group_remote_id` | +| `ezpublish_http_basic` | Use `http_basic` in `security.yml` directly. | + + +## CSS settings + +|Old setting|New setting| +|:----|:----| +| `ibexa-alert--complementary` | `ibexa-alert--info` | +| `sidebar-drag-items` | `toolbox-drag-items` | +| `sidebar-drag-items-group` | `toolbox-drag-items-group` | +| `sidebar-drag-item` | `tooblox-drag-item` | +| `/src/bundle/Resources/public/scss/mixins/_font.scss` | Removed | +| `/src/bundle/Resources/public/scss/_iframe-backdrop.scss` | Removed | + +## Twig templates, functions and filters + +The global Twig variable `ez_richtext_config` has been renamed to `ibexa_richtext_config`. + +| Old name| New name / Comment | +|:----|:----| +| `\Ibexa\Core\MVC\Symfony\Templating\Twig\Extension\` | Removed `ezplatform` variable, use the `ibexa` global variable. | +| `\Ibexa\Core\MVC\Symfony\View\ParametersInjector\ViewbaseLayout\` | Removed `pagelayout` variable, use `page_layout`. | +| `/src/bundle/Resources/views/themes/admin/account/form_fields.html.twig` | Deprecated, extend `@ibexadesign/ui/form_fields.html.twig` directly. | +| `/src/bundle/Resources/views/themes/admin/content/edit/content_header.html.twig` | Removed | +| `/src/bundle/Resources/views/themes/admin/ui/footer.html.twig` | Deprecated | +| `/src/bundle/Resources/views/themes/corporate/customer_portal/registration/registration_already_exists.html.twig` | Removed | +| `/src/bundle/Resources/views/block_preview.html.twig` | Removed | +| `\Ibexa\Scheduler\Dashboard\AllScheduledTab` | Removed `type` variable. Use `content_type.name`. | +| `\Ibexa\Scheduler\Dashboard\MyScheduledTab` | Removed `type` variable. Use `content_type.name`. | +| `\Ibexa\Bundle\User\Controller\DefaultProfileImageController` | Removed `type` variable. Use `text_color`. Remove `default(text)` from `initials.svg.twig`. | +| `\Ibexa\Bundle\User\Controller\DefaultProfileImageController` | Removed `background` variable, use `background_color`. Remove `default(background)` from `initials.svg.twig`. | diff --git a/docs/release_notes/img/5.0_collaborative_invitation.jpg b/docs/release_notes/img/5.0_collaborative_invitation.jpg new file mode 100644 index 0000000000..20c2b3976e Binary files /dev/null and b/docs/release_notes/img/5.0_collaborative_invitation.jpg differ diff --git a/docs/release_notes/release_notes.md b/docs/release_notes/release_notes.md index 0f84faedde..4378a2b657 100644 --- a/docs/release_notes/release_notes.md +++ b/docs/release_notes/release_notes.md @@ -5,10 +5,11 @@ page_type: landing_page # Release notes -The latest stable and LTS (Long Term Support) version of [[= product_name =]] is [[[= product_name =]] v4.6](ibexa_dxp_v4.6.md). +The latest stable and LTS (Long Term Support) version of [[= product_name =]] is [[[= product_name =]] v5.0](ibexa_dxp_v5.0.md). [[= cards([ + "release_notes/ibexa_dxp_v5.0", "release_notes/ibexa_dxp_v4.6", "release_notes/ibexa_dxp_v3.3", ], columns=2) =]] diff --git a/docs/snippets/release_50.md b/docs/snippets/release_50.md new file mode 100644 index 0000000000..ea3290086f --- /dev/null +++ b/docs/snippets/release_50.md @@ -0,0 +1,13 @@ +[[% if version is not defined %]] + [[% set version = '' %]] +[[% endif %]] + +To learn more about all the included changes, see the full release change logs: + +- [[[= product_name_headless =]] [[= version =]]](https://github.com/ibexa/headless/releases/tag/[[= version =]]) +- [[[= product_name_exp =]] [[= version =]]](https://github.com/ibexa/experience/releases/tag/[[= version =]]) +- [[[= product_name_com =]] [[= version =]]](https://github.com/ibexa/commerce/releases/tag/[[= version =]]) + +[[% if version != 'v5.0.0' %]] +To update your application, see the [update instructions](../update_and_migration/from_4.6/update_to_5.0.md#[[= version_to_anchor(version) =]]). +[[% endif %]] diff --git a/mkdocs.yml b/mkdocs.yml index 4aec29ef29..652b2b0085 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -880,6 +880,8 @@ nav: - Product guides: product_guides/product_guides.md - Release notes: - Release notes: release_notes/release_notes.md + - 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