[f] - Fully covered with oro/upgrade-toolkit
[p] - Partially covered with oro/upgrade-toolkit
Before:
$this->extendExtension->getNameGenerator()->generateEnumTableName('opportunity_status')
After:
OutdatedExtendExtension::generateEnumTableName('opportunity_status')
\Oro\Bundle\DataGridBundle\Event\BuildBeforeListenerInterface that can be used to make lazy services for final listener classes that cannot be proxied due to missing interface.\Oro\Bundle\DataGridBundle\Event\OrmResultAfterListenerInterface that can be used to make lazy services for final listener classes that cannot be proxied due to missing interface.\Oro\Bundle\DataGridBundle\Extension\Action\DataGridActionConfiguratorInterface as general interface for action configurators.Before:
Stored in the generated table, which begins with the prefix "oro_enum_" (that is, each enum has its own table).
Example of enum for "oro_enum_auth_status" table:
| id | name | priority | is_default |
| reset | Reset | 2 | false |
| locked | Locked | 3 | false |
| expired | Expired | 4 | false |
| active | Active | 1 | true |
After:
Stored in the "oro_enum_option" table.
Example:
| id | internal_id | enum_code | name | priority | is_default |
| auth_status.locked | locked | auth_status | Locked | 3 | false |
| auth_status.expired | expired | auth_status | Expired | 4 | false |
| auth_status.active | active | auth_status | Active | 1 | true |
| auth_status.reset | reset | auth_status | Reset | 2 | false |
Class Oro\Bundle\EntityExtendBundle\Entity\Repository\EnumValueRepository was removed.
Use Oro\Bundle\EntityExtendBundle\Entity\Repository\EnumOptionRepository instead.
Use Oro\Bundle\EntityExtendBundle\Entity\Repository\EnumOptionRepository::createEnumOption
instead of Oro\Bundle\EntityExtendBundle\Entity\Repository\EnumOptionRepository::createEnumValue
Before:
$statusEnum = $this->doctrine
->getRepository(ExtendHelper::buildEnumValueClassName(Attendee::STATUS_ENUM_CODE))
->find(Attendee::STATUS_NONE);
After:
$statusEnum = $this->doctrine
->getRepository(EnumOption::class)
->find(ExtendHelper::buildEnumOptionId(Attendee::STATUS_ENUM_CODE, Attendee::STATUS_NONE)
);
->findBy(...) instead of ->findAll() while querying to Enum Option RepositoryBefore:
$internalStatuses = $this->doctrine
->getRepository(ExtendHelper::buildEnumValueClassName(Order::INTERNAL_STATUS_CODE))
->findAll();
After:
$internalStatuses = $this->doctrine
->getRepository(EnumOption::class)
->findBy(['enumCode' => Order::INTERNAL_STATUS_CODE]);
->findBy(...) and ->findOneBy(...) method callsBefore:
$internalStatus = $this->doctrine
->getRepository(ExtendHelper::buildEnumValueClassName(Order::INTERNAL_STATUS_CODE))
->findOneBy(['name' => $name]);
After:
$internalStatus = $this->doctrine
->getRepository(EnumOption::class)
->findOneBy(['id' => ExtendHelper::buildEnumOptionId(Order::INTERNAL_STATUS_CODE, $name)]);
Before:
$queries->addPostQuery(new InsertEnumValuesQuery($this->extendExtension, 'cu_auth_status', [
new EnumDataValue(CustomerUserAuthStatus::STATUS_EXPIRED, 'Expired', 3)
]));
After:
class LoadLeadStatusOptionData extends AbstractEnumFixture
{
protected function getData(): array
{
return [
'new' => 'New',
'qualified' => 'Qualified',
'canceled' => 'Disqualified',
];
}
protected function getDefaultValue(): string
{
return 'new';
}
protected function getEnumCode(): string
{
return 'lead_status';
}
}
AbstractEnumFixture, add a dependency on LoadLanguageData. [f]class LoadLeadStatusOptionData extends AbstractFixture implements DependentFixtureInterface
{
// fixture data migration methods ...
#[\Override]
public function getDependencies(): array // this dependency is required if your fixture is not extend `AbstractEnumFixture`
{
return [LoadLanguageData::class];
}
}
Before:
->leftJoin('attendee.status', 'attendee_status')
After:
->leftJoin(
EnumOption::class,
'attendee_status',
Expr\Join::WITH,
"JSON_EXTRACT(attendee.serialized_data, 'status') = attendee_status"
)
$qb = $this->doctrine->getRepository(CustomerUser::class)
->createQueryBuilder('u')
->select('COUNT(u.id)')
->andWhere('IDENTITY(u.auth_status) <> :authStatus')
After:
$qb = $this->doctrine->getRepository(CustomerUser::class)
->createQueryBuilder('u')
->select('COUNT(u.id)')
->andWhere("JSON_EXTRACT(u.serialized_data, 'auth_status') <> :authStatus")
->addLeftJoin(
$path,
EnumOption::class,
Join::WITH,
QueryBuilderUtil::sprintf(
"JSONB_ARRAY_CONTAINS_JSON(%s.serialized_data, '%s', CONCAT('\"', %s.id, '\"')) = true",
$parentAlias,
$fieldName,
$alias
)
)
->andWhere(
QueryBuilderUtil::sprintf(
"JSONB_ARRAY_CONTAINS_JSON(e.serialized_data, '%s', '\"%s\"') = true",
$fieldName,
$optionId
)
)
Before:
quote_creating_definition:
preconditions:
'[@and](https://github.com/and)':
- '[@neq](https://github.com/neq)': [$status.id, 'lost']
- '[@neq](https://github.com/neq)': [$status.id, 'won']
- '[@type](https://github.com/type)': [$customer.target, 'Oro\Bundle\CustomerBundle\Entity\Customer']
After:
quote_creating_definition:
preconditions:
'[@and](https://github.com/and)':
- '[@neq](https://github.com/neq)': [$status.internalId, 'lost']
- '[@neq](https://github.com/neq)': [$status.internalId, 'won']
- '[@type](https://github.com/type)': [$customer.target, 'Oro\Bundle\CustomerBundle\Entity\Customer']
Before:
partner_level:
options:
enum_code: partner_level
excluded_values:
- gold
After:
partner_level:
options:
enum_code: partner_level
excluded_values:
- 'partner_level.gold'
Before:
actions:
- '[@request_enum_entity](https://github.com/request_enum_entity)':
enum_code: lead_status
identifier: 'new'
After:
actions:
- '[@request_enum_entity](https://github.com/request_enum_entity)':
enum_code: lead_status
identifier: 'lead_status.new'
Before:
- '[@find_entity](https://github.com/find_entity)':
attribute: $.status
class: Extend\Entity\EV_Task_Status
identifier: 'open'
After:
- '[@find_entity](https://github.com/find_entity)':
attribute: $.status
class: Oro\Bundle\EntityExtendBundle\Entity\EnumOption
identifier: 'task_status.open'
Before:
$changeSet = $unitOfWork->getEntityChangeSet($entity);
if (isset($changeSet['status']) || isset($changeSet['inventory_status'])) {}
After:
$changeSet = $unitOfWork->getEntityChangeSet($entity);
if (isset($changeSet['serialized_data'][0]['status']) # $changeSet['serialized_data'][0] - previous status value
|| isset($changeSet['serialized_data'][0]['inventory_status'])) {}
Before:
public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('oro_seller_dashboard');
$rootNode = $treeBuilder->getRootNode();
SettingsBuilder::append(
$rootNode,
[
'order_count_status_criteria' => [
'type' => 'array',
'value' => [
OrderStatusesProviderInterface::INTERNAL_STATUS_OPEN
]
]
]
);
}
After:
public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('oro_seller_dashboard');
$rootNode = $treeBuilder->getRootNode();
SettingsBuilder::append(
$rootNode,
[
'order_count_status_criteria' => [
'type' => 'array',
'value' => [
ExtendHelper::buildEnumOptionId(
Order::INTERNAL_STATUS_CODE,
OrderStatusesProviderInterface::INTERNAL_STATUS_OPEN
),
]
]
]
);
}
Before:
<i {% if invitationClass %}class="{{ invitationClass }}" title="{{ attendee.status.name }}" {% endif %}></i>
After:
<i {% if invitationClass %}class="{{ invitationClass }}" title="{{ attendee.status.id|trans_enum }}" {% endif %}></i>
Before:
Scenario: Create Multi-Select fields with one auditable
...
And I fill form with:
| Field name | AuditableMultiSelect |
| Type | Multi-Select |
And I click "Continue"
And set Options with:
| Label |
| Option1 |
| Option2 |
| Option3 |
And I fill form with:
| Auditable | Yes |
And I save and create new form
Then click update schema # schema update step is needed
When I click update schema
Then I should see Schema updated flash message
...
After:
Scenario: Create Multi-Select fields with one auditable
...
And I fill form with:
| Field name | AuditableMultiSelect |
| Type | Multi-Select |
And I click "Continue"
And set Options with:
| Label |
| Option1 |
| Option2 |
| Option3 |
And I fill form with:
| Auditable | Yes |
And I save and create new form
# Then click update schema # This step is not needed more for enums fields!!!
# When I click update schema
# Then I should see Schema updated flash message
...
Oro\Bundle\EntityExtendBundle\Provider\EnumValueProvider was removed.
Use Oro\Bundle\EntityExtendBundle\Provider\EnumOptionsProvider instead. [f]Oro\Bundle\EntityExtendBundle\Provider\EnumOptionsProvider::getEnumValueByCode() method
instead of Oro\Bundle\EntityExtendBundle\Provider\EnumValueProvider::getEnumValueByCode() [f]oro_entity_extend.enum_value_provider to oro_entity_extend.enum_options_provider [p]Before:
shippingRuleD:
name: 'D'
enabled: true
sortOrder: 1
stopProcessing: true
expression: "lineItems.any( lineItem.product.shipping_category.id = 'd' )"
After:
shippingRuleD:
name: 'D'
enabled: true
sortOrder: 1
stopProcessing: true
expression: "lineItems.any( lineItem.product.shipping_category.internalId = 'd' )" # use internalId instead of id
Before:
join:
left:
- { join: ra.status, alias: status }
After:
join:
left:
# - { join: ra.status, alias: status } # removed
Before:
orders-grid:
acl_resource: oro_order_view
extends: base-orders-grid
source:
query:
select:
- internalStatus.name as internalStatusName
- internalStatus.id as internalStatusId
join:
left:
- { join: order1.internal_status, alias: internalStatus }
groupBy: order1.id
hints:
- HINT_TRANSLATABLE
columns:
internalStatusName:
label: oro.order.internal_status.label
After:
orders-grid:
acl_resource: oro_order_view
extends: base-orders-grid
source:
query:
select:
# - internalStatus.name as internalStatusName # removed
# - internalStatus.id as internalStatusId # removed
join:
left:
# - { join: order1.internal_status, alias: internalStatus } # removed
groupBy: order1.id
hints:
- HINT_TRANSLATABLE
columns:
internal_status:
label: oro.order.internal_status.label
Before:
Extend\Entity\EV_Acc_Internal_Rating:
1_of_5:
__construct:
- '1_of_5'
- '1_of_5'
After:
Oro\Bundle\EntityExtendBundle\Entity\EnumOption:
1_of_5:
__construct:
- 'acc_internal_rating' # enum_code
- '1_of_5'
- '1_of_5'
Before:
if ($user->getAuthStatus()->getId() !== UserManager::STATUS_ACTIVE) {}
if (!$originalValue instanceof AbstractEnumValue) {}
After:
if ($user->getAuthStatus()->getIntenalId() !== UserManager::STATUS_ACTIVE) {}
if (!$originalValue instanceof EnumOptionInterface) {}
wsse_secured renamed to old_api_secured.api_wsse_secured renamed to api_secured.extra.oro-post-install-cmd, during post-update - into section extra.oro-post-update-cmd.oro_distribution.route_collection.all dispatched when routes are loaded from all route loaders. Implemented via \Oro\Bundle\DistributionBundle\Routing\DelegatingLoader decorating the routing.loader service.\Oro\Bundle\DistributionBundle\EventListener\RoutePrioritizingListener as a general solution to alter route priorities.oro_distribution.event_listener.route_prioritizing.web_debug_toolbar to increase the priorities of web debug toolbar routes (_wdt, _profiler*, _preview_error)._template_override request attribute. Useful for overriding the template of a forwarded request. Implemented in \Oro\Bundle\DistributionBundle\EventListener\ControllerTemplateListener.When) in \Oro\Bundle\FormBundle\Validator\ConstraintFactory that creates constraints from an array definition (e.g. fetched from system_configuration.yml).time HTML tag with a datetime attribute in html_purifier_modes.\Oro\Bundle\ThemeBundle\Entity\ThemeConfiguration entity that contains theme configuration options.oro:theme:configuration:validate command that validates theme configuration.\Oro\Bundle\ThemeBundle\Fallback\Provider\ThemeConfigurationFallbackProvider fallback provider which fetches data from theme configuration.\Oro\Bundle\ThemeBundle\Acl\Voter\ThemeConfigurationDependencyDeleteVoter voter that forbids removal operation for dependent entities if they are used in theme configuration.getThemeConfigurationOptionsNamesByType method for \Oro\Bundle\ThemeBundle\Provider\ThemeConfigurationProvider provider that returns all theme options names by type of option.oro_is_string that finds whether the given variable type is a string.html_controls_after variable for form_row widget that renders passed html content.oro_theme_configuration_value that returns theme configuration option value.\Oro\Bundle\LayoutBundle\Layout\Extension\ThemeConfiguration.\Oro\Bundle\AttachmentBundle\Form\Type\ContentFileType form type that saves content from the uploaded file but does not save file in the system.\Oro\Bundle\SecurityBundle\DoctrineExtension\Dbal\Types\CryptedTextType doctrine type that stores text data in crypted format.\Oro\Bundle\SecurityBundle\Request\SessionHttpKernelDecorator into \Oro\Bundle\SecurityBundle\Request\SessionStorageOptionsManipulator.oro_security.session.storage.options container parameters that holds original session storage options.crypted_text doctrine type as a data type to api_doc_data_types and open_api sections of ORO API configuration.validate flag to create and update operations, making API requests with transaction rollback instead of commit.rollback_validated_request event for customize_form_data action.dynamic-imports scripts for the storefront.purchase-volume-chart chart.transTemplate datagrid option for the itemsCounter section that allows to set translation template for the datagrid items counter.orodatagrid/js/datagrid/builder/items-count-external datagrid builder that allows the showing of datagrid item count in an element with the specific data attribute.\Oro\Bundle\PlatformBundle\Entity\NumberSequence entity for managing sequential number generation, supporting custom sequence types and discriminators.\Oro\Bundle\PlatformBundle\Entity\Repository\NumberSequenceRepository with a getLockedSequence() method for transactional retrieval using row-level locking.\Oro\Bundle\PlatformBundle\NumberSequence\Manager\NumberSequenceManagerInterface to define a common interface for sequential number management operations.\Oro\Bundle\PlatformBundle\NumberSequence\Manager\GenericNumberSequenceManager with support for:
nextNumber())resetSequence())reserveSequence())\Oro\Bundle\PlatformBundle\Command\Cron\DeleteOldNumberSequenceCronCommand to schedule removal of old sequence records.\Oro\Bundle\PlatformBundle\Async\DeleteOldNumberSequenceProcessor and \Oro\Bundle\PlatformBundle\Async\Topic\DeleteOldNumberSequenceTopic to handle asynchronous cleanup of number sequences via message queue.\Oro\Bundle\PlatformBundle\EventListener\DeleteOldNumberSequenceEventListener to remove outdated number sequences while preserving the most recent one.OperationServiceInterface and OperationServiceAbstract for operation servicesoro_operation_service to gather operation services in a separate service locatorOperation execution events added for better extensibility and control of operation execution flow
announce event is triggered during checking pre-conditionsguard event is triggered during checking conditionspre_execute and execute events are triggered before and after operation logic executionFor all event types 2 events are triggered: oro_operation.<event_name> and oro_operation.<operation_name>.<event_name>.
Added ActionExecutor to be able to run actions and action groups from PHP code without a need to work with ActionData, context, PropertyPaths, etc.
Added ActionGroupWrapper to be able to call a service method as an action group. All such services should be added to service locator with tag oro_action_group_service. If service needs to add/change some context variables it has to return an array with an appropriate keys. Note that argument names are used to map data from context to method arguments and must be named same to call parameters.
Moved logic from action groups YAML definitions to PHP services for checkout-related action_groups
Added ability to define action group as a service + method config parameters
added return_value_name for action_group to map value to action group result correctly for action group services
added method_argument_name to parameter config to map action group parameter to service method argument
Moved acl_resource check to the guard event listener instead of constantly adding it to pre-conditions (this check was lost for service-based action_groups)
Action group execution events added for better extensibility and control of execution flow
guard event is triggered during checking conditions
*pre_execute and execute events are triggered before and after operation logic executionFor all event types 2 events are triggered. oro_action_group.<event_name> and oro_action_group.<operation_name>.<event_name>
conditional_steps_to to allow to transit workflow to different steps with single transition based on condition per-stepconditional_steps_to are shown in workflow UI[@BundleName](https://github.com/BundleName)/path/to/configs/workflow.yml syntaxTransitionServiceInterface and TransitionServiceAbstract for transition servicesoro_workflow.transition_service to gather transition services in a separate service locatorTransitionAssembler, Transition and Workflow configuration to work with transition servicesContinueToShippingAddress for b2b checkout workflow as a transition service exampleAdded workflow events
pre_announce, announce. These events are triggered during checking pre-conditionspre_guard, guard. These events are triggered during checking conditionsNext event are triggered during transition execution:
start (workflow)leave (step)enter (step)entered (step)transition (transition)completed (transition)For all events except start 3 events are triggered. oro_workflow.<event_name>, oro_workflow.<workflow_name>.<event_name> and oro_workflow.<workflow_name>.<event_name>.<step_name|transition_name>
acl_resource check to pre_announce event listener instead of constantly adding it to pre-conditionsis_granted_workflow_transition check for steps to pre_announce event listenerresolve_destination_page from actions to oro_workflow.transition listener for all workflows to support usage of this option with transition_serviceaclResource and aclMessages were added to Transition model--watch and --watch-interval options to oro:workflow:definition:load command to periodically reload the workflow definition(s). Can be used during development to not bother the developer who might forget to reload the definition.import_condition (Expression Language syntax same to on used in DI) option for workflow importWorkflowConfigurationImportsProcessor::addImportFilter and should implement the ImportFilterInterfacetype field on a string instead of the removed \Oro\Bundle\ThemeBundle\Entity\Enum\ThemeConfigurationType enum for \Oro\Bundle\ThemeBundle\Entity\ThemeConfiguration entity.masterRequest attribute in API context was replaced with mainRequest. If you have API processors that use the masterRequest attribute in the oro.api.processor service tag it should be replaces with the mainRequest attribute.\Oro\Bundle\ApiBundle\Filter\FilterValueAccessorInterface to be able to use filters by same field but with different operators, e.g. ?filter[id][gt]=1&filter[id][lt]=10:
getOne methodget method from ?FilterValue to FilterValue[]getGroup method from array [filter key => FilterValue, ...] to array [filter key => [FilterValue, ...], ...]getAll method from array [filter key => FilterValue, ...] to array [filter key => [FilterValue, ...], ...]filter[id]>=1 is not supported from now, use filter[field][operator]=value syntax instead, e.g. filter[id][gte]=1.return_value_name for action_group to map value to action group result correctly for action group servicesmethod_argument_name to parameter config to map action group parameter to service method argumentconditional_steps_to to allow to transit workflow to different steps with single transition based on condition per-stepconditional_steps_to are shown in workflow UI[@BundleName](https://github.com/BundleName)/path/to/configs/workflow.yml syntaxAdded workflow events
Next event are triggered during transition execution:
For all events except start 3 events are triggered. oro_workflow.<event_name>, oro_workflow.<workflow_name>.<event_name> and oro_workflow.<workflow_name>.<event_name>.<step_name|transition_name>
acl_resource check to pre_announce event listener instead of constantly adding it to pre-conditions. After this change, acl_resource checks will be done before pre-actions. It's no longer possible to reference variables in acl_resource, such checks must be moved to pre-conditions.is_granted_workflow_transition check for steps to pre_announce event listenerresolve_destination_page from actions to oro_workflow.transition listener for all workflows to support usage of this option with transition_serviceResolveDestinationPage was updated to support destination as variable in workflowsaclResource and aclMessages were added to Transition model--watch and --watch-interval options to oro:workflow:definition:load command to periodically reload the workflow definition(s). Can be used during development to not bother the developer who might forget to reload the definition.getContext replaced by getData. It's no longer possible to work directly with the workflow/action execution context.getContext replaced by getData. It's no longer possible to work directly with the workflow/action execution context.import_condition (Expression Language syntax same to on used in DI) option for workflow importWorkflowConfigurationImportsProcessor::addImportFilter and should implement the ImportFilterInterface\Oro\Bundle\EntityBundle\Provider\EntityNameProvider to make it work with enum fields.\Oro\Bundle\EntityBundle\Layout\DataProvider\EntityNameLayoutDataProvider that provides entity name on frontend layouts.\Oro\Bundle\EmailBundle\Sync\NotificationAlertManager fails to update an existing alert if user is null.\Oro\Bundle\UserBundle\Controller\ResetController::sendEmailAction so it redirects to the _return_route route request attribute in case of error.\Oro\Bundle\UserBundle\Controller\ResetController::sendEmailAction so it redirects to the _target_route request attribute in case of success.[@OroUser](https://github.com/OroUser)/Reset templates to enable the ability to override form action path, return path and target path.[@OroUser](https://github.com/OroUser)/Security/login.html.twig template to enable the ability to override form action path, return path and target path.crypted_text doctrine type now.data attributes of the button_options section for operations. Now, using the dash symbol for data attribute naming is possible.Updating the ORO Enum implementation is caused by:
Based on symfony security changes, the approach to user authentication was updated. The main differences in the new approach will be described below.
SecurityExtension::addAuthenticatorFactory() instead of SecurityExtension::addSecurityListenerFactory().[f]Before:
$extension->addSecurityListenerFactory(new OrganizationFormLoginFactory());
After:
$extension->addAuthenticatorFactory(new OrganizationFormLoginFactory());
Before:
Oro\Bundle\SecurityBundle\Http\Firewal\OrganizationBasicAuthenticationListener
Oro\Bundle\SecurityBundle\Authentication\Provider\UsernamePasswordOrganizationAuthenticationProvider
After:
Oro\Bundle\SecurityBundle\Authentication\Authenticator\UsernamePasswordOrganizationAuthenticator
security.access_control rules instead of anonymous authenticator.Before:
security:
firewalls:
healthcheck_http_status_checks:
pattern: /healthcheck/http_status_check(s$|/.*)
provider: chain_provider
anonymous: true # anonymous authentication is not available
After:
security:
firewalls:
healthcheck_http_status_checks:
pattern: /healthcheck/http_status_check(s$|/.*)
provider: chain_provider
oro_security:
access_control:
- { path: /healthcheck/http_status_check(s$|/.*), roles: PUBLIC_ACCESS }
anonymous_customer_user authnetication. To check whether the user is authorized, it is not enough to check whether the user is absent in the token, it is also worth checking whether this user is not a customer visitor (CustomerVisitor::class).[p]Before:
if ($this->getUser()) {
# implementation
}
if (null !== $this->getUser()) {
# implementation
}
After:
if ($this->getUser() instanceof AbstractUser) {
# implementation
}
if (!$this->getUser() instanceof CustomerUser) {
# implementation
}
is_authenticated that excludes from the check (anonymous customer user).Before:
{% if app.user is not null %}
# implementation
{% endif %}
After:
{% if is_authenticated() %}
# implementation
{% endif %}
feature_firewall_authenticators option to api_firewalls configuration to disable authenticator when some API feature is disabled.Before:
oro_api:
api_firewalls:
api_wsse_secured:
feature_firewall_listeners:
- Oro\Bundle\OAuth2ServerBundle\Security\Firewall\OAuth2Listener
wsse_secured:
feature_firewall_listeners:
- Oro\Bundle\OAuth2ServerBundle\Security\Firewall\OAuth2Listener
frontend_api_wsse_secured:
feature_firewall_listeners:
- Oro\Bundle\OAuth2ServerBundle\Security\Firewall\OAuth2Listener
After:
oro_api:
api_firewalls:
api_wsse_secured:
feature_firewall_authenticators: # FeatureDependAuthenticatorChecker
- Oro\Bundle\OAuth2ServerBundle\Security\Authenticator\OAuth2Authenticator
wsse_secured:
feature_firewall_authenticators: # FeatureDependAuthenticatorChecker
- Oro\Bundle\OAuth2ServerBundle\Security\Authenticator\OAuth2Authenticator
frontend_api_wsse_secured:
feature_firewall_authenticators: # FeatureDependAuthenticatorChecker
- Oro\Bundle\OAuth2ServerBundle\Security\Authenticator\OAuth2Authenticator
filter[code]= , filter[code]=code1, ,code2. If by some reasons you want to allow value(s) contains
only space symbols for some filters, you can use allow_empty filter option in Resources/config/oro/api.yml, e.g.:api:
entities:
Acme\Bundle\AcmeBundle\Entity\SomeEntity:
filters:
code:
options:
allow_empty: true
\Symfony\Component\Validator\Constraints\GroupSequence in validation groups of API config via nested arrays.\Oro\Bundle\FormBundle\Form\Extension\JsValidation\ConstraintConverter with basic implementation in \Oro\Bundle\FormBundle\Form\Extension\JsValidation\GenericConstraintConverter.\Oro\Bundle\FormBundle\Form\Extension\JsValidation\RangeConstraintConverter for Range constraint with the ability to handle minPropertyPath and maxPropertyPath.\Oro\Bundle\FormBundle\Validator\Constraints\AdaptivelyValidCollection validation constraint for validating a collection of entities with different validation groups for the new, updated and unchanged elements.\Oro\Bundle\PlatformBundle\Validator\Constraints\ValidEmbeddable that allows to apply Valid constraint with explicit validation groups specified in embeddedGroups option.oro_email.email_template_wysiwyg_enabled system config setting allowing to toggle WYSIWYG an Email Template create/edit page. Now WYSIWYG is turned off by default. It is not recommended to turn it on if you are using the email template inheritance feature as it may break template syntax.\Oro\Bundle\EmailBundle\Provider\RenderedEmailTemplateProvider as an entry point to get a rendered email template by criteria.\Oro\Bundle\EmailBundle\Sender\EmailTemplateSender as an entry point to render email template and send it to recipients.\Oro\Bundle\EmailBundle\Factory\EmailModelFromEmailTemplateFactory as an entry point to render an email template and create an email model ready to be sent.\Oro\Bundle\EmailBundle\Provider\EmailTemplateContextProvider that dispatches \Oro\Bundle\EmailBundle\Event\EmailTemplateContextCollectEvent to collect email template context (e.g. localization) needed for its searching and rendering.\Oro\Bundle\EmailBundle\Controller\AjaxEmailController::compileEmailAction to use it for email template rendering instead of \Oro\Bundle\EmailBundle\Controller\Api\Rest\EmailTemplateController::getCompiledAction in a Compose Email dialog.getEntityTreeNodeByPropertyPath to JS EntityStructureDataProvider (see documentation)entityTree to EntityStructureDataProvider (see documentation) that allows walk through entity fields treeEntityTreeNode that is used in EntityStructureDataProviderExpressionEditorComponent (see documentation that used instead regular ViewComponent in formtype options of rule editor. It's designed to prepare instance of EntityStructureDataProvider and create instance of ExpressionEditorView
expression-editor-component.js\Oro\Bundle\FormBundle\Validator\Constraints\UniqueEntity validation constraint and validator.renderCollapsibleWysiwygContentPreview and renderWysiwygContentPreview TWIG macros to UIBundle for
rendering WYSIWYG content in backoffice.readonly attribute in \Oro\Bundle\CurrencyBundle\Form\Type\PriceType.{[@feature](https://github.com/feature)} placeholder in API documentation. It was done because API documentation should not
depend on the application configuration changes made by users.\Oro\Bundle\EmailBundle\Provider\EmailRenderer, made it as an entry point to render an email template.
\Oro\Bundle\EmailBundle\Event\EmailTemplateRenderBeforeEvent and \Oro\Bundle\EmailBundle\Event\EmailTemplateRenderAfterEvent\Oro\Bundle\EmailBundle\Form\Type\EmailType into \Oro\Bundle\EmailBundle\Form\EventListener\EmailTemplateRenderingSubscriber to move the email template rendering responsibility to the form subscriber.\Oro\Bundle\EmailBundle\Migrations\Data\ORM\AbstractEmailFixture to make it ensure that an email template name is equal to its file name.EntityStructureDataProvider [?] (see documentation)
getPropertyPathByPath renamed to getRelativePropertyPathByPathgetPathByPropertyPath renamed to getPathByRelativePropertyPathgetPathByPropertyPathSafely renamed to getPathByRelativePropertyPathSafely\Oro\Bundle\EntityBundle\Twig\Sandbox\TemplateRenderer into separate processors and factories. Moved the TWIG sandbox configuration out of its responsibility.ExpressionEditorView [?] (see documentation)ExpressionEditorUtil [?] (see documentation)
BaseClass\Oro\Bundle\LocaleBundle\Provider\CurrentLocalizationProvider::setCurrentLocalization to make it additionally switch localization, language, locale in \Locale, \Gedmo\Translatable\TranslatableListener and Symfony translator.*-filter-initialized modules, defined over init_module option in filter configuration, now expected to export a sync callback function<BundleName>/Resources/config/oro/datagrids.yml to layouts folder of the default theme <BundleName>/Resources/views/layouts/default/config/datagrids.yml.
This means that storefront datagrids can now differ between themes. Any storefront grid customization should also be moved to the theme folder.\Oro\Bundle\SearchBundle\Event\BeforeIndexEntitiesEvent that is dispatched in \Oro\Bundle\SearchBundle\EventListener\IndexListener in postFlush method after changing or updating indexing entities.\Oro\Bundle\DataGridBundle\Extension\MassAction\DeleteMassActionHandler.$offset-* scss variablesspacing scss function.
$offset-x\$offset-y => spacing('base')
$offset-x-m\$offset-y-m => spacing('sm')
$offset-x-s\$offset-y-s => spacing('xs')\Oro\Bundle\EmailBundle\Manager\EmailTemplateManager, use instead \Oro\Bundle\EmailBundle\Sender\EmailTemplateSender.[f]\Oro\Bundle\EmailBundle\Tools\EmailTemplateSerializer, use instead \Oro\Bundle\EmailBundle\Sender\EmailTemplateSender.[f]\Oro\Bundle\EmailBundle\Provider\LocalizedTemplateProvider use instead \Oro\Bundle\EmailBundle\Provider\EmailTemplateProvider and \Oro\Bundle\EmailBundle\Provider\TranslatedEmailTemplateProvider.[f]\Oro\Bundle\EmailBundle\Provider\\Oro\Bundle\EmailBundle\Provider\EmailTemplateContentProvider, use instead \Oro\Bundle\EmailBundle\Provider\RenderedEmailTemplateProvider.[f]To remove the code generation in runtime, OroPlatform now uses extendable implementation of magic __get, __set and __call methods.
To migrate your entities, follow the steps below:[f]
ExtendEntityInterface implementation for extendable entity.ExtendEntityTrait for extendable entity.Before:
/**
* Extendable User entity.
*/
class User extends ExtendUser implements
EmailOwnerInterface,
EmailHolderInterface,
FullNameInterface,
AdvancedApiUserInterface
{
}
<?php
namespace Oro\Bundle\UserBundle\Model;
use Oro\Bundle\EntityExtendBundle\Entity\AbstractEnumValue;
use Oro\Bundle\UserBundle\Entity\AbstractUser;
/**
* This class is required to make User entity extendable.
*
* [@method](https://github.com/method) setAuthStatus(AbstractEnumValue $enum)
* [@method](https://github.com/method) AbstractEnumValue getAuthStatus()
*/
abstract class ExtendUser extends AbstractUser
{
/**
* Constructor
*
* The real implementation of this method is auto generated.
*
* IMPORTANT: If the derived class has own constructor it must call parent constructor.
*/
public function __construct()
{
parent::__construct();
}
}
After:
/**
* Extendable User entity.
*
* [@method](https://github.com/method) setAuthStatus(AbstractEnumValue $enum)
* [@method](https://github.com/method) AbstractEnumValue getAuthStatus()
*/
class User extends AbstractUser implements
EmailOwnerInterface,
EmailHolderInterface,
FullNameInterface,
AdvancedApiUserInterface,
ExtendEntityInterface
{
use ExtendEntityTrait; // The implementation of the ExtendEntityInterface
}
Before:
protected function getPropertyAccessor(): PropertyAccessorInterface
{
if (!$this->propertyAccessor) {
$this->propertyAccessor = new PropertyAccessor();
}
return $this->propertyAccessor;
}
After:
protected function getPropertyAccessor(): PropertyAccessorInterface
{
if (!$this->propertyAccessor) {
$this->propertyAccessor = PropertyAccess::createPropertyAccessor();
// or PropertyAccess::createPropertyAccessorWithDotSyntax()
}
return $this->propertyAccessor;
}
OR:
services:
acme_test.factory.test_factory:
class: Acme\Bundle\TestBundle\Factory\TestFactory
arguments:
- '[@property_accessor](https://github.com/property_accessor)' // or '[@oro_entity_extend](https://github.com/oro_entity_extend).accessor.property_accessor_with_dot_array_syntax' instead of Oro PropertyAccessor
Important: : property_exists() or method_exists() native methods are not working with extended entities.
Before:
if(property_exists($extendedEntity, 'extendPropertyName')) {
}
if(method_exists($extendedEntity, 'getExtendMethodName')) {
}
After:
if(EntityPropertyInfo::propertyExists($extendedEntity, 'extendPropertyName')) {
}
if(EntityPropertyInfo::methodExists($extendedEntity, 'getExtendMethodName')) {
}
Before:
$reflectionClass = new ReflectionClass($className);
$reflectionProperty = new ReflectionProperty($className, 'extendProperty')
$reflectionProperty = new ReflectionMethod($className, 'getExtendPropertyMethod')
After:
$reflectionClass = new EntityReflectionClass($entity);
$reflectionProperty = ReflectionVirtualProperty::create($extendPropertyName);
$reflectionMethod = VirtualReflectionMethod::create($objectOrClass, $extendedMethodName);
Instead of entity generators, implement Oro\Bundle\EntityExtendBundle\EntityExtend\EntityFieldExtensionInterface, that allows extending magic methods behavior in runtime.
To copy all the values of the extend entity (together with the virtual fields), call the
ExtendEntityTrait->cloneExtendEntityStorage() method
Entities need to be extended manually, before ActivityInterface and ExtendActivity (trait) are added at the code generation stage in the new implementation.
Before:
class Call extends ExtendCall implements DatesAwareInterface
{
}
After:
class Call implements DatesAwareInterface, ActivityInterface, ExtendEntityInterface
{
use ExtendActivity;
use ExtendEntityTrait;
}
Oro\Bundle\AttachmentBundle\Provider\OriginalFileNameProvider filename provider that
uses a sanitized original filename for files if attachment_original_filenames feature is enabled.Oro\Bundle\AttachmentBundle\Entity\File::$externalUrl property to store external file URL.Oro\Bundle\AttachmentBundle\Provider\ExternalUrlProvider (oro_attachment.provider.external_url_provider) that
returns Oro\Bundle\AttachmentBundle\Entity\File::$externalUrl for a file, a resized or a filtered image URL.oro_attachment.provider.external_url_provider to the decorators chain of the file url providers
Oro\Bundle\AttachmentBundle\Provider\FileUrlProviderInterface (oro_attachment.provider.file_url).Oro\Bundle\AttachmentBundle\Model\ExternalFile model as a descendant of \SplFileInfo that represents
an externally stored file.Oro\Bundle\AttachmentBundle\Tools\ExternalFileFactory that creates Oro\Bundle\AttachmentBundle\Model\ExternalFile
from a URL or Oro\Bundle\AttachmentBundle\Entity\File entity.isExternalFile form option to Oro\Bundle\AttachmentBundle\Form\Type\FileType that enables the external file URL
input instead of the upload input.Oro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormTypeProvider that provides form type and common form options
for extend fields.Oro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormOptionsProvider (oro_entity_extend.provider.extend_field_form_options)
that collects extend field form options from the underlying providers
of Oro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormOptionsProviderInterface interface.oro_entity_extend.form_options_provider for extend field form options providers to be used
in oro_entity_extend.provider.extend_field_form_options.Oro\Bundle\AttachmentBundle\Provider\ExtendFieldFileFormOptionsProvider that provides form options for
file, image, multiFile, multiImage types of extend fields.Oro\Bundle\FormBundle\Validator\Constraints\RegExpSyntax validation constraint for checking regular expression
syntax.Oro\Bundle\AttachmentBundle\ImportExport\FileManipulator that uploads a file or clones it from the existing
one during import.Oro\Bundle\DigitalAssetBundle\Provider\ExtendFieldFileDamFormOptionsProvider that manages dam_widget_enabled
form option based on use_dam, is_stored_externally entity field config values for file, image,
multiFile, multiImage types of extend fields.markAsSkipped and isFieldSkipped method to \Oro\Bundle\ImportExportBundle\Event\DenormalizeEntityEvent
to mark certain field as skipped during denormalization process to avoid possible type conflicts.Locale entityoro:localization:localized-fallback-values:cleanup-unused command that finds and deletes orphaned
Oro\Bundle\LocaleBundle\Entity\LocalizedFallbackValue entities that could appear due to disabled orphanRemoval option.cloneLocalizedFallbackValueAssociations() method that is generated automatically and should be used in
__clone() for entities with localized fallback value relations to ensure correct cloning of localized fallback value
collections.\Oro\Bundle\LocaleBundle\Cache\Normalizer\LocalizedFallbackValueCollectionNormalizer and \Oro\Bundle\LocaleBundle\Cache\Normalizer\LocalizedFallbackValueNormalizer for using when caching complex structuresaddAggregate methodbehat_test environment to run tests that depend on mocks in a separate environment.[@behat-test-env](https://github.com/behat-test-env) tag.--do-not-run-consumer argument to the bin/behat command to run application tests in the production-like environment where the supervisord or systemd runs the consumer.Added renderCollapsibleWysiwygContentPreview and renderWysiwygContentPreview TWIG macros to UIBundle for
rendering WYSIWYG content in backoffice.
Added oroui/js/app/modules/swipeable-module instead of swipeableView to
dispatch Custom Swipe Events to a document.
The provided Swipe Events are:
swipestart event is fired when one or more touch points are placed on the touch surface;swipemove event is fired when one or more touch points are moved along the touch surface
with the detail option that includes the x and y coordinates of the pointer;swipeend event fires when one or more touch points are removed from the touch surface
with the detail option that includes the x and y coordinates and direction of the pointer;swipeleft and swiperight events are fired when one or more touch points are moved along the touch surface
with the detail option that includes the x and y coordinates of the pointer.
It is fired only if the elapsed time between the start and end events is less than or equal to maxAllowedTime;\Oro\Component\Layout\Extension\Theme\Model\ThemeManager::getThemesHierarchy to easily get the theme hierarchy for the specified theme.response_status_code.\Oro\Component\Layout\ContextInterface and \Oro\Component\Layout\LayoutContextStack to \Oro\Component\Layout\Layout so now it is aware of own context and can push/pop the current context in the layout context stack.\Oro\Bundle\NavigationBundle\Entity\MenuUpdateInterface::isSynthetic to distinguish menu updates applied to the system menu items even if they do not exist anymore.\Oro\Bundle\NavigationBundle\Entity\MenuUpdate.\Oro\Bundle\NavigationBundle\Event\MenuUpdatesApplyAfterEvent that is dispatched in \Oro\Bundle\NavigationBundle\Menu\MenuUpdateBuilder after all menu updates are applied.menu form option as required for \Oro\Bundle\NavigationBundle\Form\Type\MenuUpdateType.\Oro\Bundle\NavigationBundle\Manager\MenuUpdateDisplayManager, \Oro\Bundle\NavigationBundle\Manager\MenuUpdateMoveManager.\Oro\Bundle\NavigationBundle\Menu\DividerBuilder that adds "divider" class to menu items.\Oro\Bundle\NavigationBundle\Menu\HideEmptyItemsBuilder that recursively hides menu items that do not have any children.\Oro\Bundle\NavigationBundle\Menu\LostItemsBuilder that removes menu items added by non-custom menu updates when target system menu item does not exist anymore.\Oro\Bundle\NavigationBundle\Menu\OrphanItemsBuilder that moves orphaned menu items to the menu root.\Oro\Bundle\NavigationBundle\MenuUpdate\Applier\MenuUpdateApplier that applies a menu update to menu item.\Oro\Bundle\NavigationBundle\MenuUpdate\Factory\MenuUpdateFactory.\Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\MenuUpdateToMenuItemPropagatorInterface, \Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\BasicPropagator, \Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\ExtrasPropagator and \Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\CompositePropagator that propagate the menu update data to the target menu item.\Oro\Bundle\NavigationBundle\Utils\MenuUpdateUtils::createRecursiveIterator, \Oro\Bundle\NavigationBundle\Utils\MenuUpdateUtils::flattenMenuItem for more convenient access to the menu item.slick-carousel: 1.7.1 to fork [@oroinc](https://github.com/oroinc)/slick-carousel: 1.7.1-oro1 with patched internal postSlide method~slick-carousel/slick/slick.scss to ~[@oroinc](https://github.com/oroinc)/slick-carousel/slick/slick.scss
and path of js from slick-carousel/slick/slick to [@oroinc](https://github.com/oroinc)/slick-carousel/slick/slickTesting component.
Old namespace for these classes was Oro\Component\TestUtils\ORM.
New namespace is Oro\Component\Testing\Unit\ORM.[f]throwException was removed from the method convertToEntityType
of Oro\Bundle\ApiBundle\Util\ValueNormalizerUtil. Use the tryConvertToEntityType method
when an entity type might not exist.[f]throwException was removed from the method convertToEntityClass
of Oro\Bundle\ApiBundle\Util\ValueNormalizerUtil. Use the tryConvertToEntityClass method
when an entity class might not exist.[f]disable_babel (true by default) to with_babel (false by default).Oro\Bundle\AttachmentBundle\Entity\File::$file property type to ?\SplFileInfo
to allow Oro\Bundle\AttachmentBundle\Model\ExternalFile. Methods setFile and getFile are changed correspondingly.[p]Oro\Bundle\AttachmentBundle\Manager\FileManager::getFileFromFileEntity return type to ?\SplFileInfo
to comply with Oro\Bundle\AttachmentBundle\Entity\File::$file property type.[f]Oro\Bundle\AttachmentBundle\ImportExport\FileImportStrategyHelper::getFieldLabel visibility to public,
so it can be used for getting human-readable field names during import.[f]Oro\Bundle\AttachmentBundle\ImportExport\EventListener\FileStrategyEventListener constructor, so it expects
Oro\Bundle\AttachmentBundle\ImportExport\FileManipulator $fileManipulator
instead of $fileManager, also the $authorizationChecker argument is removed.The oro.cache.abstract abstract service is removed, use oro.data.cache instead, with the cache.pool tag
and the namespace in a tag attribute.[f]
Before:
services:
oro_catalog.layout.data_provider.category.cache:
parent: oro.cache.abstract
public: false
calls:
- [ setNamespace, [ 'oro_catalog_category' ] ]
After:
services:
oro_catalog.layout.data_provider.category.cache:
parent: oro.data.cache
public: false
tags:
- { name: 'cache.pool', namespace: 'oro_catalog_category' }
iconHideText option for action-launcher and dropdown-select-choice-launcher views was removed, use the launcherMode option instead.
The launcherMode option can have three different values:
icon-text - shows datagrid actions with icons and text labels;icon-only - shows datagrid actions as icons;text-only- shows datagrid actions as text labels;Oro\Bundle\DigitalAssetBundle\ImportExport\EventListener\DigitalAssetAwareFileStrategyEventListener constructor,
so it expects Oro\Bundle\AttachmentBundle\ImportExport\FileImportStrategyHelper $fileImportStrategyHelper
instead of $doctrineHelper.Oro\Bundle\EntityExtendBundle\Form\Guesser\ExtendFieldTypeGuesser constructor, so it expects
Oro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormTypeProvider $extendFieldFormTypeProvider and
Oro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormOptionsProviderInterface $extendFieldFormOptionsProvider
instead of $enumConfigProvider.Oro\Bundle\EntityExtendBundle\Form\Guesser\ExtendFieldTypeGuesser so it gets the form type from
Oro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormTypeProvider and the form options from
Oro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormOptionsProvider now.cascade Doctrine option of the \Oro\Bundle\OrganizationBundle\Entity\Ownership\BusinessUnitAwareTrait::$owner
association: it is not cascade-persisted anymore.Oro\Bundle\PlatformBundle\Provider\PackageProvider class based services now provide the packages info in pure arrays instead of the array of the Composer\Package\PackageInterface interface based objects. The returned array structure is as follows: ['package_name' => ['pretty_version' => '1.0.0', 'license' => ['MIT']]]..reminderTemplates namespace. Twig placeholder oro_reminder_reminder_templates no longer in use.search_engine_dsn parameter is used instead of search_engine_name, search_engine_host, search_engine_port, search_engine_index_prefix, search_engine_username, search_engine_password, search_engine_ssl_verification, search_engine_ssl_cert, search_engine_ssl_cert_password, search_engine_ssl_key, search_engine_ssl_key_password.system_entity_nameoro/platform package. The bundle came from outer package oro/redis-config and it was rebuilt to utilize Symfony redis configuration components instead of once from 3rd party package snc/redis-bundle.oroui/js/app/components/viewport-component has been changed options from viewport: {maxScreenType: 'tablet'} or viewport: {minScreenType: 'tablet'} to viewport: 'tablet'As a result, you need to update your html:
view.twig
{% block _main_menu_container_widget %}
{% set attr = layout_attr_defaults(attr, {
'~class': ' main-menu-outer',
'data-page-component-module': 'oroui/js/app/components/viewport-component',
'data-page-component-options': {
- viewport: {
- maxScreenType: 'tablet',
- },
component: 'oroui/js/app/components/view-component',
view: 'orocommercemenu/js/app/widgets/menu-traveling-widget'
},
{% block _main_menu_container_widget %}
{% set attr = layout_attr_defaults(attr, {
'~class': ' main-menu-outer',
'data-page-component-module': 'oroui/js/app/components/viewport-component',
'data-page-component-options': {
+ viewport: 'tablet',
component: 'oroui/js/app/components/view-component',
view: 'orocommercemenu/js/app/widgets/menu-traveling-widget'
},
oroui/js/viewport-manager has been update isApplicable method. From now on, the method accepts, as arguments, a string or an array of strings of media types.viewportManager.isApplicable('tablet')viewportManager.isApplicable('tablet', 'tablet-small')viewportManager.isApplicable(['tablet', 'tablet-small'])getBreakpoints(context): returns object with all registered breakpoints from css property --breakpoints. It is possible to pass the context of the document as an argument.getMediaType(mediaType): returns MediaQueryList by mediaType argument.getViewportgetScreenTypegetAllowScreenTypesThe widgets collapse-widget, collapse-group-widget, rows-collapse-widget were removed, use the bootstrap-collapse instead.
As a result, you need to update your html:
view.twig
- {% set collapseView = {
- storageKey: 'unique storage key',
- uid: 'unique storage key id',
- animationSpeed: 0,
- closeClass: 'overflows',
- forcedState: false,
- checkOverflow: false,
- open: false,
- keepState: false
- } %}
- <div class="collapse-block" data-page-component-collapse="{{ collapseView|json_encode }}">
- <div class="control-label" data-collapse-container>
- Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit
- </div>
- <a href="#" class="control-label toggle-more" data-collapse-trigger>{{ 'Show more'|trans }}</a>
- <a href="#" class="control-label toggle-less" data-collapse-trigger>{{ 'Show less'|trans }}</a>
- </div>
+ {% set collapseId = 'collapse-'|uniqid %}
+ <div class="collapse-block">
+ <div id="{{ collapseId }}" class="collapse-overflow collapse no-transition"
+ data-collapsed-text="{{ 'Show more'|trans }}"
+ data-expanded-text="{{ 'Show less'|trans }}"
+ data-check-overflow="true"
+ data-toggle="false"
+ data-state-id="{{ 'unique storage key id' }}"
+ >Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...</div>
+ <a href="#"
+ role="button"
+ class="collapse-toggle"
+ data-toggle="collapse"
+ data-target="{{ '#' ~ collapseId }}"
+ aria-expanded="false"
+ aria-controls="{{ collapseId }}"><span data-text>{{ 'Show more'|trans }}</span></a>
+ </div>
\Oro\Bundle\NavigationBundle\Provider\BuilderChainProvider: menu items are sorted as a single list instead of separate - sorted and unsorted parts.topic class now; see more in the Message Queue Topics topic.[f]pre_conditions and post_actions options of the workflow process definition configuration were renamed to preconditions and actions respectively.Oro\Bundle\CronBundle\Command\CronCommandInterface has been removed.
Use Oro\Bundle\CronBundle\Command\CronCommandScheduleDefinitionInterface
and Oro\Bundle\CronBundle\Command\CronCommandActivationInterface instead.[f]options / skip_acl_check datagrid option was removed. Use the source / skip_acl_apply option instead.[f]source / acl_resource datagrid option was removed. Use the acl_resource option instead.[f]EntityFieldsUtil was removed, use EntityStructureDataProvider instead.renderWysiwygContentPreview TWIG macro from EntityConfigBundle, use renderWysiwygContentPreview or
renderCollapsibleWysiwygContentPreview from UIBundle instead.search.title_field has been removedday-value-helper was removed, use date-value-helper instead.Oro\Bundle\FormBundle\Model\UpdateHandler has been removed. Use Oro\Bundle\FormBundle\Model\UpdateHandlerFacade instead.[f]\Oro\Bundle\ImportExportBundle\Event\NormalizeEntityEvent::setResultField, use
\Oro\Bundle\ImportExportBundle\Event\NormalizeEntityEvent::setResultFieldValue instead.[f]Oro\Bundle\InstallerBundle\EventListener\AssetsInstallCommandListener, use JS packages from NPMtitle_fields field from search.yml field has been removed[f]oroui/js/css-variables-manager has been removed.oroui/js/app/modules/css-variable-module has been removed.oroui/js/app/views/swipeable-view, use oroui/js/app/modules/swipeable-module instead.oroui/js/app/views/input-widget/checkbox was removed; use pure CSS checkbox customization instead.tooltips translation domain was removed. All translation from this domain were moved to the messages domain.modalHandler method for error helper was removed, use showError method instead.tools.loadModuleAndReplace() from 'oroui/js/tools' module, use loadModules.fromObjectProp from 'oroui/js/app/services/load-modules' instead.vertical_container layout block type has been removed, as redundant. Use conventional container layout block type instead, with additions custom CSS class that implements required alignment.Oro\Bundle\LayoutBundle\Layout\LayoutContextHolder, use Oro\Component\Layout\LayoutContextStack instead.[f]Oro\Bundle\NavigationBundle\Builder\MenuUpdateBuilder, added \Oro\Bundle\NavigationBundle\Menu\MenuUpdateBuilder instead.[f]\Oro\Bundle\NavigationBundle\Entity\MenuUpdateInterface::getExtras, \Oro\Bundle\NavigationBundle\Entity\MenuUpdate::getExtras, its purpose is moved to \Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\ExtrasPropagator.\Oro\Bundle\NavigationBundle\Manager\MenuUpdateManager::moveMenuItem, \Oro\Bundle\NavigationBundle\Manager\MenuUpdateManager::moveMenuItems. Use corresponding methods from \Oro\Bundle\NavigationBundle\Manager\MenuUpdateMoveManager instead.\Oro\Bundle\NavigationBundle\Manager\MenuUpdateManager::showMenuItem, \Oro\Bundle\NavigationBundle\Manager\MenuUpdateManager::hideMenuItems. Use corresponding methods from \Oro\Bundle\NavigationBundle\Manager\MenuUpdateDisplayManager instead.\Oro\Bundle\NavigationBundle\Utils\MenuUpdateUtils::updateMenuItem, use \Oro\Bundle\NavigationBundle\MenuUpdate\Applier\MenuUpdateApplier instead.event tag attribute for customize_form_data action API processor services is mandatory.
This was made to prevent potential logical errors.pre_flush_data, post_flush_data and post_save_data events were added to the customize_form_data action.
The pre_flush_data and post_flush_data events are dispatched together with the flush() method of
the entity manager in the same database transaction.
The post_save_data event is dispatched after the database transaction is committed.
API processors for these events can be used to customize database update logic.Oro\Bundle\AssetBundle\VersionStrategy\BuildVersionStrategy was added. It uses the public/build/build_version.txt application file's content as an assets version.oro_attachment.webp_strategy configuration node to the bundle config to control whether to convert images to WebP format.Oro\Bundle\AttachmentBundle\Manager\WebpAwareImageResizeManager that additionally converts image to WebP format if needed.Oro\Bundle\AttachmentBundle\Provider\FilterRuntimeConfigProviderInterface and Oro\Bundle\AttachmentBundle\Provider\FilterRuntimeConfigDefaultProvider
to provide LiipImagine filter runtime configuration for using in Oro\Bundle\AttachmentBundle\Provider\ResizedImageProvider.Oro\Bundle\AttachmentBundle\Provider\WebpAwareFilterRuntimeConfigProvider to provide LiipImagine filter runtime configuration
for WebP format.Oro\Bundle\AttachmentBundle\Imagine\Provider\ImagineUrlProviderInterface and Oro\Bundle\AttachmentBundle\Imagine\Provider\ImagineUrlProvider
to generate URL for static images.Oro\Bundle\AttachmentBundle\Imagine\Provider\WebpAwareImagineUrlProvider to generate URLs for static images in WebP format.Oro\Bundle\AttachmentBundle\Provider\WebpAwareFileNameProvider to generate filename taking into account current WebP strategy.Oro\Bundle\AttachmentBundle\Provider\PictureSourcesProviderInterface and Oro\Bundle\AttachmentBundle\Provider\PictureSourcesProvider
to provider image sources to be used in tag.\Oro\Bundle\EntityBundle\ORM\DoctrineHelper::getManager to get manager by name.order behavior according to the documentationoro_importexport.strategy.configurable_import_strategy_helper with performance improvements to replace oro_importexport.strategy.import.helper in strategries.\Oro\Bundle\ImportExportBundle\Event\StrategyValidationEvent to handle validation errors formatting cases.\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableImportStrategyHelper to improve import performance.\Oro\Bundle\ImportExportBundle\Writer\CumulativeWriter to improve import performance.\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy::isEntityFieldFallbackValue to support \Oro\Bundle\EntityBundle\Entity\EntityFieldFallbackValue import.\Oro\Bundle\ImportExportBundle\Strategy\Import\ImportStrategyHelper::getEntityPropertiesByClassName to support \Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableImportStrategyHelper import.\Oro\Bundle\ImportExportBundle\Strategy\Import\ImportStrategyHelper::verifyClass to support \Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableImportStrategyHelper import.\Oro\Bundle\LocaleBundle\EventListener\StrategyValidationEventListener to format LocalizedFallbackValue error keys.message_queue connection.message_queue entity manager.\Oro\Bundle\MessageQueueBundle\Platform\{OptionalListenerDriver,OptionalListenerDriverFactory,OptionalListenerExtension} to bypass optional listeners from CLI to MQ.\Oro\Component\MessageQueue\Consumption\Extension\LimitGarbageCollectionExtension to limit consumer by GC runs.\Oro\Component\MessageQueue\Consumption\Extension\LimitObjectExtension to limit consumer by objects in runtime.Oro\Component\MessageQueue\Topic\TopicInterface to declare topic name, description, message default priority
and message body structure for the MQ topics.oro_message_queue.topic tag for declaring MQ topic in a service container.Oro\Component\MessageQueue\Topic\TopicRegistry that contains MQ topics declared as services with tag oro_message_queue.topic.Oro\Component\MessageQueue\Client\MessageBodyResolverInterface and Oro\Component\MessageQueue\Client\MessageBodyResolver
to validate the topic message body structure.Oro\Component\MessageQueue\Client\ConsumptionExtension\MessageBodyResolverExtension MQ extension
that resolves message body before it is passed to MQ processor.$this->getOptionalListenerManager()->enableListener('oro_workflow.listener.event_trigger_collector'); to enable listeners in tests.[@beforeResetClient](https://github.com/beforeResetClient), use it instead of [@after](https://github.com/after) for full tests isolation.config.xml files were changed to point Oro\Bundle\AssetBundle\VersionStrategy\BuildVersionStrategy assets version strategy to be used.batch to message_queueOro\Bundle\AttachmentBundle\Provider\FileUrlProviderInterface::getResizedImageUrl(),
Oro\Bundle\AttachmentBundle\Provider\FileUrlProviderInterface::getFilteredImageUrl(),
Oro\Bundle\AttachmentBundle\Provider\ResizedImagePathProviderInterface::getPathForResizedImage(),
Oro\Bundle\AttachmentBundle\Provider\ResizedImagePathProviderInterface::getPathForFilteredImage():
added $format argument to specify the resized image format.Oro\Bundle\AttachmentBundle\Provider\FileNameProviderInterface:
added getFilteredImageName(), getResizedImageName() that should be used for getting names
for filtered and resized images correspondingly.Oro\Bundle\AttachmentBundle\Provider\ResizedImageProvider::getFilteredImage(),
Oro\Bundle\AttachmentBundle\Provider\ResizedImageProvider::getResizedImage(),
Oro\Bundle\AttachmentBundle\Manager\ImageResizeManager::resize(),
Oro\Bundle\AttachmentBundle\Manager\ImageResizeManager::applyFilter():
added $format argument to specify the resized image format.Oro\Component\Config\Loader\FolderContentCumulativeLoader::getDirectoryContents()
to ensure that result is not affected by an operating system.enabled to renderable[f]Oro\Bundle\EmbeddedFormBundle\Controller\EmbeddedFormController::defaultDataAction
(oro_embedded_form_default_data route)
action the request method was changed to GET.Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository.oroform/js/validator/url is excluded from JS-build for blank theme, due to it is too heavy and not in use on the front. It can be included again in custom theme if needed.entity_import_from_csv to improve import performance.oro_importexport.strategy.add and all strategies oro_importexport.strategy.import.helper implementation to oro_importexport.strategy.configurable_import_strategy_helper\Oro\Bundle\ImportExportBundle\Serializer\Normalizer\ScalarFieldDenormalizer to handle advanced boolean fields cases - yes/no, true/false, 1/0.\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy::process to process validation errors gracefully.\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy::updateRelations to avoid massive collection changes.\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy::processValidationErrors to improve validation errors processing.\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy::getObjectValue to support edge cases, like User#roles.Oro\Bundle\InstallerBundle\Composer\ScriptHandler::setAssetsVersion was changed to store time base hash value into public/build/build_version.txt application file.\Oro\Bundle\LocaleBundle\ImportExport\Strategy\LocalizedFallbackValueAwareStrategy for performance reasons, error keys logic moved to \Oro\Bundle\LocaleBundle\EventListener\StrategyValidationEventListener.batch to message_queue\Oro\Component\MessageQueue\Transport\MessageInterface::getBody(), \Oro\Component\MessageQueue\Transport\MessageInterface::setBody()
signature - $body argument is mixed now, i.e. can be of any type returned by json_decode().Oro\Component\MessageQueue\Transport\MessageProducerInterface -
to Oro\Component\MessageQueue\Transport\Dbal\DbalMessageProducer.Oro\Component\MessageQueue\Transport\MessageConsumerInterface -
to Oro\Component\MessageQueue\Transport\Dbal\DbalMessageConsumer.Oro\Component\MessageQueue\Client\MessageProducer using Oro\Component\MessageQueue\Client\MessageBodyResolverInterface.oro_search.fulltext_index_manager to use doctrine.dbal.search_connectionoro_search.event_listener.orm.fulltext_index_listener to use doctrine.dbal.search_connectionnewBrowserTabIsOpened and newBrowserTabIsOpenedAndISwitchToIt are moved from Oro\Bundle\TestFrameworkBundle\Tests\Behat\Context\OroMainContext to dedicated context Oro\Bundle\TestFrameworkBundle\Tests\Behat\Context\BrowserTabContext.Mixins and SCSS Variables related to direction.scss were removed. For implementing Right To Left UI design have a look in Right to Left UI Support.inputs files are imported into one root.scss, that is used as entry point for building styles.
As result, all SCSS variables available from global scope, no need to import them manually into local style from a bundle.
All inputs are imported in following order **/settings/**, **/variables/** and rest of styles, that allows to modify variable's value before it is used. That is aimed to simplify customization.orovalidation/js/validator/url is excluded from JS-build for blank theme, due to it is too heavy and not in use on the front. It can be included again in custom theme if needed.[@oroinc](https://github.com/oroinc)/webpack-config-builder package which is migrated to Webpack 5. See Webpack migration guide.assets_version and assets_version_strategy container parameters were removed from all application distributions.framework.assets.version and framework.assets.version keyed parameters were removed from config.xml file in all application distributions.batch connection, use message_queue connection instead.Oro\Bundle\ConfigBundle\DependencyInjection\Compiler\ListenerExcludeConfigConnectionPass
was removed. It is unneeded since the doctrine.exclude_listener_connections DIC parameter is no longer in use.Oro\Bundle\CronBundle\Async\Topics, use getName() of corresponding topic class from Oro\Bundle\CronBundle\Async\Topic namespace instead.[f]Oro\Bundle\DataAuditBundle\Async\Topics, use getName() of corresponding topic class from Oro\Bundle\DataAuditBundle\Async\Topic namespace instead.[f]oro_entity.abstract_entity_manager was removed.Oro\Bundle\EntityBundle\Provider\EntityFieldProvider::getFields() was removed,
use Oro\Bundle\EntityBundle\Provider\EntityFieldProvider::getEntityFields() instead.[f]Oro\Bundle\EntityBundle\Helper\FieldHelper::getFields() was removed,
use Oro\Bundle\EntityBundle\Helper\FieldHelper::getEntityFields() instead.[f]oro_entity.repository.factory was removed.Oro\Bundle\EntityBundle\DependencyInjection\Compiler\EntityRepositoryCompilerPass was removed.oro_entity_merge.accessor.delegate was removed. Use oro_entity_merge.accessor instead.[f]oro_entity_merge.strategy.delegate was removed. Use oro_entity_merge.strategy instead.[f]Oro\Bundle\EmailBundle\Async\Topics, use getName() of corresponding topic class from Oro\Bundle\EmailBundle\Async\Topic namespace instead.[f]Oro\Bundle\NotificationBundle\Async\Topics, use getName() of corresponding topic class from Oro\Bundle\NotificationBundle\Async\Topic namespace instead.[f]Oro\Bundle\ImapBundle\Async\Topics, use getName() of corresponding topic class from Oro\Bundle\ImapBundle\Async\Topic namespace instead.[f]Removed Oro\Bundle\MessageQueueBundle\Async\Topics, use getName() of corresponding topic class from Oro\Bundle\MessageQueueBundle\Async\Topic namespace instead.[f]
Removed Oro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\AddTopicDescriptionPass, declare topic
via Oro\Component\MessageQueue\Topic\TopicInterface as a service with tag oro_message_queue.topic instead.
Oro\Component\MessageQueue\Job\Topics, use getName() of corresponding topic class from Oro\Component\MessageQueue\Job\Topic namespace instead.[f]doctrine.exclude_listener_connections parameter is no longer in use.Oro\Bundle\TranslationBundle\Async\Topics, use getName() of corresponding topic class from Oro\Bundle\TranslationBundle\Async\Topic namespace instead.[f]Removed Oro\Bundle\SearchBundle\Async\Topics, use getName() of corresponding topic class from Oro\Bundle\SearchBundle\Async\Topic namespace instead.[f]
The DIC compiler pass Oro\Bundle\SearchBundle\DependencyInjection\Compiler\ListenerExcludeSearchConnectionPass
was removed. It is unneeded since the doctrine.exclude_listener_connections DIC parameter is no longer in use.
Remove reset style for ordered and unordered list in Resources/public/blank/scss/reset.scss
The oro_ui_content_provider_manager global variable was removed from Twig.
Use the oro_get_content Twig function instead.
A separate styles build for third-party libraries with RTL support was removed for back-office themes. Now, RTL styles are build the same way as for Layout Themes. See Right to Left UI Support
isIE11 and isEDGE methods are removed from oroui/js/tools module
orodatagrid/js/cell-links/builder to provide behavior row as link. In customizations, it is not recommended to use selectors like :first-child, :nth-child(n) etc. Because it can affect this functionality. If necessary, wrap the cell content in a container.Oro\Bundle\EmailBundle\Mailer\Mailer to send Symfony\Component\Mime\Email message.Oro\Bundle\EmailBundle\Sender\EmailModelSender to send Oro\Bundle\EmailBundle\Form\Model\Email model.Oro\Bundle\EmailBundle\Mailer\Transport\Transport decorator that dispatches Oro\Bundle\EmailBundle\Event\BeforeMessageEvent
and adds extra logging for mailer transports;Oro\Bundle\EmailBundle\Mailer\Transport\LazyTransports decorator that defers transports instantiation until
method send() is called.Oro\Bundle\EmailBundle\Event\BeforeMessageEvent event that is dispatched by Oro\Bundle\EmailBundle\Mailer\Transport\Transport
to allow altering email message and envelope.Oro\Bundle\EmailBundle\Mailer\Envelope\EmailOriginAwareEnvelope that adds ability to specify Oro\Bundle\EmailBundle\Entity\EmailOrigin
in the email message envelope.Oro\Bundle\EmailBundle\Mailer\Transport\SystemConfigTransportFactory for oro://system-config mailer transport.Oro\Bundle\EmailBundle\Mailer\Transport\SystemConfigTransportRealDsnProvider for resolving real DSN that lies behind
oro://system-config DSN.Oro\Bundle\EmailBundle\Mailer\Checker\ConnectionCheckers that allows to check if the mailer transport connection
specified in the DSN is valid.Oro\Bundle\EmailBundle\EmbeddedImages\EmbeddedImagesExtractor, Oro\Bundle\EmailBundle\EmbeddedImages\EmbeddedImagesInEmailModelHandler,
Oro\Bundle\EmailBundle\EmbeddedImages\EmbeddedImagesInSymfonyEmailHandler for extracting and handling embedded images in
Oro\Bundle\EmailBundle\Form\Model\Email and Symfony\Component\Mime\Email models.Oro\Bundle\ImapBundle\Mailer\Transport\UserEmailOriginTransportFactory for oro://user-email-origin mailer transport.Oro\Bundle\ImapBundle\Mailer\Transport\UserEmailOriginTransport to send email messages using SMTP settings
taken from Oro\Bundle\ImapBundle\Entity\UserEmailOriginOro\Bundle\ImapBundle\Validator\Constraints\SmtpConnectionConfiguration and Oro\Bundle\ImapBundle\Validator\SmtpConnectionConfigurationValidator
for validating SMTP settings taken from Oro\Bundle\ImapBundle\Entity\UserEmailOrigin.Oro\Bundle\ImapBundle\EventListener\SetUserEmailOriginTransportListener for adding X-Transport and
X-User-Email-Origin-Id headers to email message required to use oro://user-email-origin mailer transport.Oro\Bundle\LoggerBundle\Monolog\ErrorLogNotificationHandlerWrapper monolog handler wrapper to prevent error log
notification from being sent when there are no recipients configured.Oro\Bundle\NotificationBundle\Async\SendEmailNotificationProcessor for processing MQ messages for sending
email notification messages in a message queue.Oro\Bundle\NotificationBundle\Async\Topics::SEND_NOTIFICATION_EMAIL_TEMPLATE MQ topic and
Oro\Bundle\NotificationBundle\Async\SendEmailNotificationTemplateProcessor processor for processing MQ messages
for sending templated email notification messages in a message queue.Oro\Bundle\NotificationBundle\Mailer\MassNotificationsMailer for sending mass notification email messages.Oro\Component\MessageQueue\Client\ConsumptionExtension\MessageProcessorRouterExtension for message routing
instead of Oro\Component\MessageQueue\Client\DelegateMessageProcessor.Oro\Component\MessageQueue\Client\NoopMessageProcessor for messages which are not claimed by any message
processor.Oro\Component\MessageQueue\Client\Router\MessageRouter and Oro\Component\MessageQueue\Client\Router\Envelope
for handling messages routing into queues in Oro\Component\MessageQueue\Client\MessageProducer.Oro\Component\MessageQueue\Client\MessageProcessorRegistry service locator.Oro\Component\MessageQueue\Consumption::getMessageProcessorName(),
Oro\Component\MessageQueue\Consumption::setMessageProcessorName().Oro\Component\MessageQueue\Log\ConsumerState::getMessageProcessorName(),
Oro\Component\MessageQueue\Log\ConsumerState::setMessageProcessorName().Oro\Component\MessageQueue\Client\Meta\TopicDescriptionProvider.\Oro\Component\MessageQueue\Log\MessageProcessorClassProvider::getMessageProcessorClassByName() for getting
message processor class name by processor name.client.noop_status used for messages not claimed by any message processor.mailer_dsn parameter is used instead of mailer_transport, mailer_host, mailer_port,
mailer_encryption, mailer_user, mailer_password.processor-service of Oro\Component\MessageQueue\Consumption\ConsumeMessagesCommand is optional now.installed container parameter was removed from all application distributions. You can get the installation state by calling the isInstalled method of the Oro\Bundle\DistributionBundle\Handler\ApplicationState service.Oro\Bundle\EmailBundle\Async\TemplateEmailMessageSender.Oro\Bundle\EmailBundle\Event\SendEmailTransport, use X-Transport email message header for configuring
mailer transport. See Oro\Bundle\ImapBundle\EventListener\SetUserEmailOriginTransportListener.Oro\Bundle\EmailBundle\Mailer\DirectMailer, use Oro\Bundle\EmailBundle\Mailer\Mailer instead.[f]Oro\Bundle\EmailBundle\Mailer\Processor, use Oro\Bundle\EmailBundle\Sender\EmailModelSender instead.[f]Oro\Bundle\EmailBundle\Util\MailerWrapper.Oro\Bundle\EmailBundle\Model\DTO\EmailAddressDTO, use \Oro\Bundle\EmailBundle\Model\Recipient instead.[f]Oro\Bundle\ImapBundle\EventListener\SendEmailTransportListener in favor
of Oro\Bundle\ImapBundle\EventListener\SetUserEmailOriginTransportListener.[f]Oro\Bundle\LoggerBundle\Mailer\NoRecipientPlugin in favor of Oro\Bundle\LoggerBundle\Monolog\ErrorLogNotificationHandlerWrapper.[f]Oro\Bundle\LoggerBundle\Mailer\MessageFactory in favor of Oro\Bundle\LoggerBundle\Monolog\EmailFactory\ErrorLogNotificationEmailFactory.[f]Oro\Bundle\NotificationBundle\Async\SendEmailMessageProcessor. Use Oro\Bundle\NotificationBundle\Async\SendEmailNotificationProcessor
and Oro\Bundle\NotificationBundle\Async\SendEmailNotificationTemplateProcessor instead.[f]Oro\Bundle\NotificationBundle\Async\SendMassEmailMessageProcessor in favor of Oro\Bundle\NotificationBundle\Async\SendEmailNotificationProcessor.[f]Oro\Bundle\NotificationBundle\Mailer\MassEmailDirectMailer. Use Oro\Bundle\NotificationBundle\Mailer\MassNotificationsMailer instead.[f]\Oro\Bundle\NotificationBundle\Entity\SpoolItem entity, \Oro\Bundle\NotificationBundle\Entity\Repository\SpoolItemRepository.Oro\Bundle\NotificationBundle\Provider\Mailer\DbSpool.Oro\Component\MessageQueue\Router, Oro\Component\MessageQueue\Router\RouteRecipientListProcessor,
Oro\Component\MessageQueue\Router\Recipient.Oro\Component\MessageQueue\Client\Config::getRouterMessageProcessorName(),
Oro\Component\MessageQueue\Client\Config::getRouterQueueName().Oro\Component\MessageQueue\Client\ContainerAwareMessageProcessorRegistry, use instead
Oro\Component\MessageQueue\Client\MessageProcessorRegistry service locator.[f]Oro\Component\MessageQueue\Client\DelegateMessageProcessor, the extension
Oro\Component\MessageQueue\Client\ConsumptionExtension\MessageProcessorRouterExtension is responsible for routing to
message processor now.Oro\Component\MessageQueue\Consumption::getMessageProcessor() and
Oro\Component\MessageQueue\Consumption::setMessageProcessor(), use instead
Oro\Component\MessageQueue\Consumption::getMessageProcessorName(),
Oro\Component\MessageQueue\Consumption::setMessageProcessorName().[f]Oro\Component\MessageQueue\Log\ConsumerState::getMessageProcessor() and
Oro\Component\MessageQueue\Log\ConsumerState::setMessageProcessor(), use instead
Oro\Component\MessageQueue\Log\ConsumerState::getMessageProcessorName(),
Oro\Component\MessageQueue\Log\ConsumerState::setMessageProcessorName() .[f]Oro\Component\MessageQueue\Client\Meta\TopicMeta::getDescription(), use
Oro\Component\MessageQueue\Client\Meta\TopicDescriptionProvider::getTopicDescription() instead.[f]\Oro\Component\MessageQueue\Log\MessageProcessorClassProvider::getMessageProcessorClass(), use
\Oro\Component\MessageQueue\Log\MessageProcessorClassProvider::getMessageProcessorClassByName() instead.[f]client.router_processor, client.router_destination configuration options.Oro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\BuildRouteRegistryPassOro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\ProcessorLocatorPass and
oro_message_queue.processor_locator, use instead
Oro\Component\MessageQueue\Client\ContainerAwareMessageProcessorRegistry.processorName attribute from oro_message_queue.client.message_processor tag, use service id instead.processorName in Oro\Component\MessageQueue\Client\TopicSubscriberInterface::getSubscribedTopics(),
use service id instead.Oro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\AddTopicMetaPass, use
Oro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\AddTopicDescriptionPass for specifying topic
descriptions. Oro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\BuildTopicMetaRegistryPass is used to
collect topic metadata into Oro\Component\MessageQueue\Client\Meta\TopicMetaRegistry now.Third party dependencies such as Font Awesome and Bootstrap where forked.
As a result, you need to update your scss and configuration files:
assets.yml
# ...
inputs:
- - '~bootstrap/scss/nav'
+ - '~[@oroinc](https://github.com/oroinc)/bootstrap/scss/nav'
*.scss
- [@import](https://github.com/import) "~bootstrap/scss/variables";
+ [@import](https://github.com/import) "~[@oroinc](https://github.com/oroinc)/bootstrap/scss/variables";
jsmodules.yml
# ...
- bootstrap-alert$: bootstrap/js/dist/alert
+ bootstrap-alert$: '[@oroinc](https://github.com/oroinc)/bootstrap/js/dist/alert'
force option was added to the oro:entity-extend:update-config CLI command to avoid accidental execution of it.oro_locale.repository.localization was removed.getOrganizations() and getEmails() methods to Oro\Bundle\EmailBundle\Entity\Provider\EmailOwnerProviderInterface.inherit_data form option for the nestedObject data type. It allows to configure
nested objects even if an entity does not have a setter method for it.is_xml_http_request option to the Layout context which lets you know if the current request is an ajax request.onLoadingCssClass and disableControls to the layout_subtree_update block configuration.generate_uuid action. The action generates UUID and puts the value to the specified attribute.Oro\Bundle\TranslationBundle\Migration\DeleteTranslationsByDomainAndKeyPrefixQuery that can be used to remove unused translations by domain and key prefix.Oro\Bundle\WorkflowBundle\Migration\RemoveWorkflowAwareEntitiesQuery that can be used to remove instances of entity created from the specified workflow.Oro\Bundle\WorkflowBundle\Model\WorkflowManager::transitUnconditionally(). The method transits a workflow item without checking for preconditions and conditions.oro_attachment.manager.media_cache_manager_registry was renamed to oro_attachment.media_cache_manager_registry.[f]oro_attachment.provider.attachment_file_name_provider was renamed to oro_attachment.provider.file_name.[f]oro_entity.virtual_field_provider.chain was renamed to oro_entity.virtual_field_provider.[f]oro_entity.virtual_relation_provider.chain was renamed to oro_entity.virtual_relation_provider.[f]bdesk_photo plugin, use the standard image plugin and the toolbar button instead.Oro\Bundle\NotificationBundle\Entity\Event and
Oro\Bundle\NotificationBundle\DependencyInjection\Compiler\RegisterNotificationEventsCompilerPass classes were deleted.
To migrate custom notification events, delete all the usages of Event and RegisterNotificationEventsCompilerPass classes
and register events with the YAML configuration according to the documentation.
priority attribute for oro_platform.console.global_options_provider DIC tag
was changed to correspond Symfony recommendations.[f]
If you have services with this tag, change the sign of the priority value for them.
E.g. { name: oro_platform.console.global_options_provider, priority: 100 } should be changed to
{ name: oro_platform.console.global_options_provider, priority: -100 }Oro\Bundle\QueryDesignerBundle\QueryDesigner\AbstractQueryConverter was refactored to decrease its complexity.
The state of all query converters was moved to "context" classes.
The base context class is Oro\Bundle\QueryDesignerBundle\QueryDesigner\QueryConverterContext.
If you have own query converters, update them according to new architecture.Oro\Bundle\QueryDesignerBundle\QueryDesigner\FilterProcessor was renamed to Oro\Bundle\SegmentBundle\Query\FilterProcessor.[f]oro_query_designer.query_designer.filter_processor was renamed to oro_segment.query.filter_processor.[f]priority attribute for oro.security.filter.acl_privilege DIC tag
was changed to correspond Symfony recommendations.[f]
If you have services with this tag, change the sign of the priority value for them.
E.g. { name: oro.security.filter.acl_privilege, priority: 100 } should be changed to
{ name: oro.security.filter.acl_privilege, priority: -100 }oro_sso.enable_google_sso was renamed to oro_google_integration.enable_sso.oro_sso.domains was renamed to oro_google_integration.sso_domains.oro_sso.oauth_provider was renamed to oro_sso.oauth_user_provider.[f]/api/authstatuses REST API resource was changed to /api/userauthstatuses.Oro\Bundle\UserBundle\Provider\RolePrivilegeCategoryProvider class:[p]
getPermissionCategories was renamed to getCategoriesgetTabList was renamed to getTabIdsgetAllCategories, getTabbedCategories, getCategory,
addProvider, getProviders, getProviderByName, hasProviderjquery-ui library are now declared separately, and each of them has to be imported directly, if necessary (jquery-ui/widget, jquery-ui/widgets/sortable etc.)public/layout-build/{theme} to public/build/{theme} folder.public/build to public/build/admin folder.css/oro/oro.css to css/oro.css.css/tinymce/* to to tinymce/*.All the JavaScript dev-dependencies, including webpack, karma, and eslint, are now managed on the application level. As a result, there is no need to install node modules in the vendor/oro/platform/build folder anymore. Now the application has only one node_modules folder - in the root directory. This allows application developers to take full control of the dev-dependencies in the project.
The webpack-config-builder module was moved to a separate package and now is published at npmjs.com as oro-webpack-config-builder package.
The package provides an integration of OroPlatform based applications with the Webpack.
The public/bundles/npmassets folder was deleted. This folder contained the full copy of the node_modules folder,
which is unnecessary with the webpack build. Now you have to reference node modules directly by their names.
To migrate the scss code and configuration, replace the npmassets/ and bundles/nmpassets prefixes with ~ for all the node modules paths:
assets.yml
# ...
inputs:
- - 'bundles/npmassets/slick-carousel/slick/slick.scss'
+ - '~slick-carousel/slick/slick.scss'
*.scss
- [@import](https://github.com/import) "npmassets/bootstrap/scss/variables";
+ [@import](https://github.com/import) "~bootstrap/scss/variables";
- [@import](https://github.com/import) "bundles/npmassets/bootstrap/scss/variables";
+ [@import](https://github.com/import) "~bootstrap/scss/variables";
To migrate the javascript code and configuration, drop npmassets/ and bundles/nmpassets prefixes from the node module path.
jsmodules.yml
# ...
- slick$: npmassets/slick-carousel/slick/slick
+ slick$: slick-carousel/slick/slick
*.js
# ...
- import 'npmassets/focus-visible/dist/focus-visible';
+ import 'focus-visible/dist/focus-visible';
# ...
- require('bundles/npmassets/Base64/base64');
+ require('Base64/base64');
To make an NPM library assets publicly available (e.g. some plugins of a library are have to be loaded dynamically in runtime) you can define in your module that an utilized library requires context:
require.context(
'!file-loader?name=[path][name].[ext]]&outputPath=../_static/&context=tinymce!tinymce/plugins',
true,
/.*/
);
This way Webpack will copy tinymce/plugins folder into public directory public/build/_static/_/node_modules/tinymce/plugins.
Pay attention for the leading exclamation point, it says that all other loaders (e.g. css-loader) should be ignored for this context.
If you nevertheless need to process all included css files by Webpack -- leading ! has to be removed.
The "oomphinc/composer-installers-extender" composer package was removed. As a result, composer components are not copied automatically to the public/bundles/components directory.
To copy files that are not handled by webpack automatically to the public folder, you can use approach with require.context described above.
The "resolve-url-loader" NPM dependency was removed. Now you should always specify the valid relative or absolute path in SCSS files explicitly. The absolute path must start with ~:
# ...
# The relative path works the same. You only might need to fix typos,
# as the resolve-url-loader ignored them because of the magic global search feature.
background-image: url(../../img/glyphicons-halflings.png);
# ...
# The path without `~` is a relative path
$icomoon-font-path: "fonts" !default;
# ...
# An absolute path should be prefixed with `~`
- $icomoon-font-path: "fonts" !default;
+ $icomoon-font-path: "~bundles/orocms/fonts/grapsejs/fonts" !default;
twig/extensions is abandoned by its maintainers and has been removed from Oro dependencies.Oro\Bundle\ApiBundle\ApiDoc\RemoveSingleItemRestRouteOptionsResolver and the service
oro_api.rest.routing_options_resolver.remove_single_item_routes were removed.
Exclude the get action in Resources/config/oro/api.yml instead.origin option was removed from entity and field configuration.ORIGIN_CUSTOM and ORIGIN_SYSTEM constants were removed from Oro\Bundle\EntityExtendBundle\EntityConfig\ExtendScope.skip-origin argument was removed from the oro:entity-extend:update-config CLI command.selectrow was removed, as well as Oro\Bundle\FilterBundle\Filter\SelectRowFilter
and Oro\Bundle\FilterBundle\Form\Type\Filter\SelectRowFilterType classes.many-to-many was removed, as well as Oro\Bundle\FilterBundle\Filter\ManyToManyFilter
and Oro\Bundle\FilterBundle\Form\Type\Filter\ManyToManyFilterType classes.unique_job_slug MQ message parameter was removed for oro.importexport.pre_import topic.orosync/js/content/grid-builder component from the layout updates.collectionField TWIG macros was removed. Use the form_row_collection TWIG function instead.
Before: UI.collectionField(form.emails, 'oro.user.emails.label'|trans).
After: form_row_collection(form.emails).
To change "add" button label use the add_label form option.cssVariablesManager.getVariables() method as unused, and deleted dependency on the jhildenbiddle/css-vars-ponyfill library.Oro\Bundle\UserBundle\Provider\PrivilegeCategoryProviderInterface was removed.
Use Resources/config/oro/acl_categories.yml files to configure ACL categories.user_reset_password_as_admin has been removed. Use force_reset_password instead.oro_activity.activity_entity_delete_handler was removed.
Use decoration of oro_activity.activity_entity_delete_handler_extension service to instead.Oro\Bundle\ActivityBundle\Entity\Manager\ActivityEntityDeleteHandlerInterface was removed.
Use Oro\Bundle\ActivityBundle\Handler\ActivityEntityDeleteHandlerExtensionInterface instead.[p]relations was removed from Resources/config/oro/api.yml. The action get_relation_config that
was responsible to process this section was removed as well.
This section was not used to build API that conforms JSON:API specification that is the main API type.
In case if you need a special configuration for "plain" REST API, you can define it in
Resources/config/oro/api_plain.yml configuration files or create a processor for the get_config action.delete_handler configuration option was removed.
The Oro\Bundle\EntityBundle\Handler\EntityDeleteHandlerRegistry class is used to get the deletion handler instead.Oro\Bundle\ApiBundle\Request\ApiActions was renamed to Oro\Bundle\ApiBundle\Request\ApiAction.[f]NORMALIZE_RESULT_GROUP was removed from
Oro\Bundle\ApiBundle\Processor\NormalizeResultActionProcessor
Use NORMALIZE_RESULT constant from Oro\Bundle\ApiBundle\Request\ApiActionGroup instead.[f]Oro\Bundle\ApiBundle\Config namespace to Oro\Bundle\ApiBundle\Config\Extension:[f]
Oro\Bundle\ApiBundle\Config namespace to Oro\Bundle\ApiBundle\Config\Extra:[f]
Oro\Bundle\ApiBundle\Config namespace to Oro\Bundle\ApiBundle\Config\Loader:[f]
Oro\Bundle\ApiBundle\Metadata namespace to Oro\Bundle\ApiBundle\Metadata\Extra:[f]
Oro\Bundle\ApiBundle\Processor\Config\GetConfig
and Oro\Bundle\ApiBundle\Processor\Config\Shared namespaces were moved
to Oro\Bundle\ApiBundle\Processor\GetConfig namespace.[f]ConfigProcessor was moved from Oro\Bundle\ApiBundle\Processor\Config namespace
to Oro\Bundle\ApiBundle\Processor\GetConfig namespace.[f]ConfigContext was moved from Oro\Bundle\ApiBundle\Processor\Config namespace
to Oro\Bundle\ApiBundle\Processor\GetConfig namespace.[f]oro_api.validate_included_forms processor was changed from -70 to -68.oro_api.validate_form processor was changed from -90 to -70.oro_api.post_validate_included_forms processor was changed from -96 to -78.oro_api.post_validate_form processor was changed from -97 to -80.priority attribute for oro_config.configuration_search_provider DIC tag
was changed to correspond Symfony recommendations.
If you have services with this tag, change the sign of the priority value for them.[f]
E.g. { name: oro_config.configuration_search_provider, priority: 100 } should be changed to
{ name: oro_config.configuration_search_provider, priority: -100 }priority attribute for oro_datagrid.extension.action.provider and
oro_datagrid.extension.mass_action.iterable_result_factory DIC tags was changed to correspond Symfony recommendations.
If you have services with these tags, change the sign of the priority value for them.[f]
E.g. { name: oro_datagrid.extension.action.provider, priority: 100 } should be changed to
{ name: oro_datagrid.extension.action.provider, priority: -100 }JS dependencies management has been moved from Asset Packagist to
Composer + NPM solution. So the corresponding Asset Packagist entry in the repositories section of composer.json
must be removed.
If there are bower or npm dependencies (packages with names starting with bower-asset/ or npm-asset/) specified in your composer.json, then do the following:
npm-asset/: remove the npm-asset/ prefix, move the dependency to the extra.npm section
of composer.json;bower-asset/: remove the bower-asset/ prefix, find the corresponding or alternative
npm packages instead of bower packages, and add them to the extra.npm section of composer.json.If you have your own package.json with npm dependencies, then move them to the extra.npm section of composer.json.
If you need a custom script to be executed as well, then you can add your custom script to the scripts section of composer.json.
kernel.listener.nav_history_response was renamed to oro_navigation.event_listener.navigation_history.kernel.listener.hashnav_response was renamed to oro_navigation.event_listener.hash_navigation.SCOPE_KEY in Oro\Bundle\OrganizationBundle\Provider\ScopeOrganizationCriteriaProvider
was replaced with ORGANIZATION.[f]getCriteriaByContext() was removed from Oro\Bundle\ScopeBundle\Manager\ScopeCriteriaProviderInterface.getCriteriaForCurrentScope() in Oro\Bundle\ScopeBundle\Manager\ScopeCriteriaProviderInterface
was replaced with getCriteriaValue().[f]Oro\Bundle\ScopeBundle\Manager\AbstractScopeCriteriaProvider was removed.
Use direct implementation of Oro\Bundle\ScopeBundle\Manager\ScopeCriteriaProviderInterface in your providers.Oro\Bundle\SecurityBundle\Authentication\Token\OrganizationContextTokenInterface
was renamed to Oro\Bundle\SecurityBundle\Authentication\Token\OrganizationAwareTokenInterface.[f]
Also methods getOrganizationContext and setOrganizationContext were renamed to
getOrganization and setOrganization.[f]Oro\Bundle\SecurityBundle\Exception\ForbiddenException was removed.
Use Symfony\Component\Security\Core\Exception\AccessDeniedException instead.[f]Oro\Bundle\SoapBundle\Handler\DeleteHandlerInterface was replaced with
Oro\Bundle\EntityBundle\Handler\EntityDeleteHandlerInterface
and Oro\Bundle\EntityBundle\Handler\EntityDeleteHandlerExtensionInterface.[p]priority attribute for oro_translation.extension.translation_context_resolver and
oro_translation.extension.translation_strategy DIC tags was changed to correspond Symfony recommendations.[f]
If you have services with these tags, change the sign of the priority value for them.
E.g. { name: oro_translation.extension.translation_context_resolver, priority: 100 } should be changed to
{ name: oro_translation.extension.translation_context_resolver, priority: -100 }SCOPE_KEY in Oro\Bundle\UserBundle\Provider\ScopeUserCriteriaProvider
was replaced with USER.[f]priority attribute for oro.workflow.configuration.handler and
oro.workflow.definition_builder.extension DIC tags was changed to correspond Symfony recommendations.[f]
If you have services with these tags, change the sign of the priority value for them.
E.g. { name: oro.workflow.configuration.handler, priority: 100 } should be changed to
{ name: oro.workflow.configuration.handler, priority: -100 }*.class parameters for all entities were removed from the dependency injection container.
The entity class names should be used directly, e.g. 'Oro\Bundle\EmailBundle\Entity\Email'
instead of '%oro_email.email.entity.class%' (in service definitions, datagrid config files, placeholders, etc.), and
\Oro\Bundle\EmailBundle\Entity\Email::class instead of $container->getParameter('oro_email.email.entity.class')
(in PHP code).*.class parameters for service definitions were removed from the dependency injection container.getActivityClass() method was removed from Oro\Bundle\ActivityListBundle\Model\ActivityListProviderInterface.
Use the class attribute of the oro_activity_list.provider DIC tag instead.getAclClass() method was removed from Oro\Bundle\ActivityListBundle\Model\ActivityListProviderInterface.
Use the acl_class attribute of the oro_activity_list.provider DIC tag instead.getName() method was removed from Oro\Bundle\DataGridBundle\Extension\Board\Processor\BoardProcessorInterface.
Use the alias attribute of the oro_datagrid.board_processor DIC tag instead.oro_datagrid.extension.orm_sorter.class was removed.
If you use %oro_datagrid.extension.orm_sorter.class%::DIRECTION_ASC
or %oro_datagrid.extension.orm_sorter.class%::DIRECTION_DESC in Resources/config/oro/datagrids.yml,
replace them to ASC and DESC strings.[f]Oro\Bundle\DataGridBundle\Datagrid\Builder::DATASOURCE_PATH was removed.
Use Oro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::DATASOURCE_PATH instead.[f]Oro\Bundle\DataGridBundle\Datagrid\Builder::DATASOURCE_TYPE_PATH was removed.
Use Oro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::DATASOURCE_TYPE_PATH
and Oro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::getDatasourceType() instead.[p]Oro\Bundle\DataGridBundle\Datagrid\Builder::DATASOURCE_ACL_PATH was removed.
Use Oro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::ACL_RESOURCE_PATH
and Oro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::getAclResource() instead.[p]Oro\Bundle\DataGridBundle\Datagrid\Builder::BASE_DATAGRID_CLASS_PATH was removed.
Use Oro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::BASE_DATAGRID_CLASS_PATH instead.[f]Oro\Bundle\DataGridBundle\Datagrid\Builder::DATASOURCE_SKIP_ACL_CHECK was removed.
Use Oro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::DATASOURCE_SKIP_ACL_APPLY_PATH
and Oro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::isDatasourceSkipAclApply() instead.[p]Oro\Bundle\DataGridBundle\Datagrid\Builder::DATASOURCE_SKIP_COUNT_WALKER_PATH was removed.
Use Oro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::DATASOURCE_SKIP_COUNT_WALKER_PATH instead.[f]Oro\Bundle\DataGridBundle\Tools\GridConfigurationHelper
and service oro_datagrid.grid_configuration.helper were removed.getType() method was removed from Oro\Bundle\EntityConfigBundle\Attribute\Type\AttributeTypeInterface.
Use the type attribute of the oro_entity_config.attribute_type DIC tag instead.Oro\Bundle\EntityConfigBundle\Event\PersistConfigEvent was removed.
It was replaced with Oro\Bundle\EntityConfigBundle\Event\PreFlushConfigEvent.[f]Oro\Bundle\EntityConfigBundle\Event\FlushConfigEvent was removed.
It was replaced with Oro\Bundle\EntityConfigBundle\Event\PostFlushConfigEvent.[f]Oro\Component\Math\BigDecimal::withScale() was removed. Use toScale() method instead.[f]Oro\Bundle\MigrationBundle\Migration\Extension\DataStorageExtension::put() was removed. Use set() method instead.[f]MAIN_FIXTURES_PATH and DEMO_FIXTURES_PATH were removed from Oro\Bundle\MigrationBundle\Command\LoadDataFixturesCommand.
Use oro_migration.locator.fixture_path_locator service instead.Oro\Bundle\QueryDesignerBundle\Grid\Extension\OrmDatasourceExtension::NAME_PATH was removed.getName() method was removed from Oro\Bundle\ReminderBundle\Model\SendProcessorInterface.
Use the method attribute of the oro_reminder.send_processor DIC tag instead.Oro\Bundle\SoapBundle\Request\Parameters\Filter\HttpEntityNameParameterFilter class was removed. Use Oro\Bundle\SoapBundle\Request\Parameters\Filter\EntityClassParameterFilter instead.[f]Oro\Bundle\SecurityBundle\Owner\Metadata\OwnershipMetadataInterface::getGlobalOwnerFieldName() was removed. Use getOrganizationFieldName() method instead.[f]Oro\Bundle\TagBundle\Grid\AbstractTagsExtension::GRID_NAME_PATH was removed.is_translated_group for Symfony\Component\Form\Extension\Core\Type\ChoiceType was removed.
Use translatable_groups option instead.is_translated_option for Symfony\Component\Form\Extension\Core\Type\ChoiceType was removed.
Use translatable_options option instead.getName() method was removed from Oro\Bundle\UIBundle\ContentProvider\ContentProviderInterface.
Use the alias attribute of the oro_ui.content_provider DIC tag instead.isEnabled() and setEnabled() methods were removed from Oro\Bundle\UIBundle\ContentProvider\ContentProviderInterface.Oro\Bundle\ApiBundle\Request\ValueTransformer (service ID is oro_api.value_transformer) was added
to help transformation of complex computed values to concrete data-type for API responses.CSSVariable parser oroui/js/css-variables-manager has been add. Source module css-variables-manager
Github link https://github.com/jhildenbiddle/css-vars-ponyfill
403 Forbidden was fixed. Now this status code is returned if there are
no permissions to use an API resource. Before the fix 404 Not Found status code was returned in both cases,
when an entity did not exist and when there were no permissions to operate with it.oro_api.entity_serializer.acl_filter was renamed to oro_api.entity_serializer.field_filter.normalizeObject of Oro\Bundle\ApiBundle\Normalizer\ObjectNormalizer
was replaced with normalizeObjects.Oro\Bundle\CacheBundle\Loader\ConfigurationLoader and Oro\Component\Config\Dumper\CumulativeConfigMetadataDumper has been replaced with the approach based on Oro\Component\Config\Cache\PhpConfigProvider.Oro\Component\ChainProcessor\ProcessorFactoryInterface was replaced with
Oro\Component\ChainProcessor\ProcessorRegistryInterface.Oro\Component\ChainProcessor\ChainProcessorFactory was removed.
Use the decoration to create a chain of processor registries instead.load() and registerResources() of class Oro\Component\Config\Loader\CumulativeConfigLoader
were changed to not accept Symfony\Component\DependencyInjection\ContainerBuilder as resources container.
Use Oro\Component\Config\Loader\ContainerBuilderAdapter to adapt
Symfony\Component\DependencyInjection\ContainerBuilder to Oro\Component\Config\ResourcesContainerInterface.The Oro\Bundle\EmailBundle\Provider\EmailRenderer was reimplemented to support computed variables.
The following changes were made:
Twig_EnvironmentrenderWithDefaultFilters was renamed to renderTemplateOro\Bundle\EntityBundle\Twig\Sandbox\TemplateRendererConfigProviderOro\Bundle\EntityBundle\Twig\Sandbox\TemplateRendererOro\Bundle\EntityBundle\Twig\Sandbox\EntityFormatExtensionThe interface Oro\Bundle\EmailBundle\Processor\VariableProcessorInterface was moved to
Oro\Bundle\EntityBundle\Twig\Sandbox\VariableProcessorInterface.
The method process was changed from process($variable, array $definition, array $data = [])
to process(string $variable, array $processorArguments, TemplateData $data): void.
This allows processors to add computed values.
The interface Oro\Bundle\EmailBundle\Provider\SystemVariablesProviderInterface was moved to
Oro\Bundle\EntityBundle\Twig\Sandbox\SystemVariablesProviderInterface.
The method getVariableDefinitions was changed from getVariableDefinitions() to getVariableDefinitions(): array.
The method getVariableValues was changed from getVariableValues() to getVariableValues(): array.
The interface Oro\Bundle\EmailBundle\Provider\EntityVariablesProviderInterface was moved to
Oro\Bundle\EntityBundle\Twig\Sandbox\EntityVariablesProviderInterface.
The method getVariableDefinitions was changed from getVariableDefinitions($entityClass = null)
to getVariableDefinitions(): array.
The method getVariableGetters was changed from getVariableGetters($entityClass = null)
to getVariableGetters(): array.
By performance reasons new method getVariableProcessors(string $entityClass): array was added.
If method getVariableDefinitions of your provider returns info about processors, move it to getVariableProcessors.
Due to the updated version of symfony/swiftmailer-bundle parameter mailer_transport: mail is not supported anymore. Using old transport will cause such an exception -
Unable to replace alias “swiftmailer.mailer.default.transport.real” with actual definition “mail”. You have requested a non-existent service “mail”. Please
use mailer_transport: sendmail instead or another available swiftmailer transport type.
In Oro\Bundle\EmailBundle\Controller\EmailController::checkSmtpConnectionAction
(oro_email_check_smtp_connection route)
action the request method was changed to POST.
In Oro\Bundle\EmailBundle\Controller\EmailController::purgeEmailsAttachmentsAction
(oro_email_purge_emails_attachments route)
action the request method was changed to POST.
In Oro\Bundle\EmailBundle\Controller\EmailController::linkAction
(oro_email_attachment_link route)
action the request method was changed to POST.
In Oro\Bundle\EmailBundle\Controller\EmailController::userEmailsSyncAction
(oro_email_user_sync_emails route)
action the request method was changed to POST.
In Oro\Bundle\EmailBundle\Controller\EmailController::toggleSeenAction
(oro_email_toggle_seen route)
action the request method was changed to POST.
In Oro\Bundle\EmailBundle\Controller\EmailController::markSeenAction
(oro_email_mark_seen route)
action the request method was changed to POST.
In Oro\Bundle\EmailBundle\Controller\EmailController::markAllEmailsAsSeenAction
(oro_email_mark_all_as_seen route)
action the request method was changed to POST.
Oro\Bundle\EmbeddedFormBundle\Controller\EmbeddedFormController::deleteAction
(oro_embedded_form_delete route)
action the request method was changed to DELETE.Oro\Bundle\EmbeddedFormBundle\Controller\EmbeddedFormController::defaultDataAction
(oro_embedded_form_default_data route)
action the request method was changed to POST.Oro\Bundle\EntityBundle\Controller\EntitiesController::deleteAction
(oro_entity_delete route)
action the request method was changed to DELETE.Oro\Bundle\EntityConfigBundle\Controller\AttributeController::removeAction
(oro_attribute_remove route)
action the request method was changed to DELETE.Oro\Bundle\EntityConfigBundle\Controller\AttributeController::unremoveAction
(oro_attribute_unremove route)
action the request method was changed to POST.Oro\Bundle\EntityConfigBundle\Controller\AttributeFamilyController::deleteAction
(oro_attribute_family_delete route)
action the request method was changed to DELETE.Oro\Bundle\EntityExtendBundle\Controller\ConfigEntityGridController::removeAction
(oro_entityextend_entity_remove route)
action the request method was changed to DELETE.Oro\Bundle\EntityExtendBundle\Controller\ConfigEntityGridController::unremoveAction
(oro_entityextend_field_unremove route)
action the request method was changed to POST.Oro\Component\EntitySerializer\Filter\EntityAwareFilterInterface was renamed to
Oro\Component\EntitySerializer\FieldFilterInterface and the following changes was made in it:
FILTER_ALL, FILTER_VALUE and FILTER_NOTHING were removedcheckField was changed from checkField(object|array $entity, string $entityClass, string $field): int
to checkField(object $entity, string $entityClass, string $field): ?boolOro\Component\EntitySerializer\Filter\EntityAwareFilterChain and the service
oro_security.serializer.filter_chain were removed.
Use decoration of oro_security.entity_serializer.field_filter and/or oro_api.entity_serializer.field_filter
services instead.setFieldsFilter of Oro\Component\EntitySerializer\EntitySerializer was renamed to setFieldFilter.transform of Oro\Component\EntitySerializer\DataTransformerInterface was changed
from transform($class, $property, $value, array $config, array $context)
to transform($value, array $config, array $context).Oro\Component\EntitySerializer\EntityDataTransformer was renamed to Oro\Component\EntitySerializer\DataTransformer
and $baseDataTransformer property was removed from it.to-one associations; now both
single item and collection post serialize handlers are executed for all types of associations.Oro\Bundle\ImportExportBundle\Controller\ImportExportController::importValidateAction
(oro_importexport_import_validate route)
action the request method was changed to POST.Oro\Bundle\ImportExportBundle\Controller\ImportExportController::importProcessAction
(oro_importexport_import_process route)
action the request method was changed to POST.Oro\Bundle\ImportExportBundle\Controller\ImportExportController::instantExportAction
(oro_importexport_export_instant route)
action the request method was changed to POST.--email has become required for oro:import:file command.oro.importexport.send_import_error_notificationoro.importexport.import_http_preparingoro.importexport.import_http_validation_preparingoro.importexport.pre_cli_import, should be used oro.importexport.pre_import instead.oro.importexport.cli_import , should be used oro.importexport.import instead.Oro\Bundle\IntegrationBundle\Controller\IntegrationController::scheduleAction
(oro_integration_schedule route)
action the request method was changed to POST.Oro\Bundle\MessageQueueBundle\Controller\Api\Rest\JobController::interruptRootJobAction
(/api/rest/{version}/message-queue/job/interrupt/{id} path)
action the request method was changed to POST.Oro\Bundle\SecurityBundle\Filter\SerializerFieldFilter was renamed to
Oro\Bundle\SecurityBundle\Filter\EntitySerializerFieldFilter.oro_security.serializer.acl_filter was renamed to oro_security.entity_serializer.field_filter.getFormatterName, getSupportedTypes and isDefaultFormatter were removed from Oro\Bundle\UIBundle\Formatter\FormatterInterface.
Use data_type attribute of oro_formatter tag to specify the default formatter for the data type.oro_user.api.create.save_entity was renamed to oro_user.api.create.save_user.Oro\Bundle\WorkflowBundle\Controller\Api\Rest\ProcessController::activateAction
(/api/rest/{version}/process/activate/{processDefinition} path)
action the request method was changed to POST.Oro\Bundle\WorkflowBundle\Controller\Api\Rest\ProcessController::deactivateAction
(/api/rest/{version}/process/deactivate/{processDefinition} path)
action the request method was changed to POST.Oro\Bundle\WorkflowBundle\Controller\Api\Rest\WorkflowController::startAction
(/api/rest/{version}/workflow/start/{workflowName}/{transitionName} path)
action the request method was changed to POST.Oro\Bundle\WorkflowBundle\Controller\Api\Rest\WorkflowController::transitAction
(/api/rest/{version}/workflow/transit/{workflowName}/{transitionName} path)
action the request method was changed to POST.Oro\Bundle\WorkflowBundle\Controller\Api\Rest\WorkflowController::activateAction
(/api/rest/{version}/workflow/activate/{workflowName}/{transitionName} path)
action the request method was changed to POST.Oro\Bundle\WorkflowBundle\Controller\Api\Rest\WorkflowController::deactivateAction
(/api/rest/{version}/workflow/deactivate/{workflowName}/{transitionName} path)
action the request method was changed to POST.route_exists action (class Oro\Bundle\ActionBundle\Condition\RouteExists) was removed.$usePropertyPathByDefault was removed from getResultFieldName method of Oro\Bundle\ApiBundle\Processor\CustomizeLoadedData\CustomizeLoadedDataContext.Resources/config/oro/charts.yml instead.getConfigs() and getChartConfigs() have been removed from Oro\Bundle\ChartBundle\Model\ConfigProvider. Use getChartNames() and getChartConfig($chartName) methods instead.oro_config.configuration_provider has been removed.dashboards, widgets and widgets_configuration sections have been removed from DashboardBundle configuration. Use Resources/config/oro/dashboards.yml instead.getConfigs(), getConfig($key) and hasConfig($key) have been removed from Oro\Bundle\DashboardBundle\Model\ConfigProvider.ServiceLinkRegistry and all relates classes was removed.
To define a bag of lazy loaded services use Symfony Service Locator.
The list of removed classes:
Oro\Component\DependencyInjection\ServiceLinkRegistryOro\Component\DependencyInjection\ServiceLinkRegistryAwareInterfaceOro\Component\DependencyInjection\ServiceLinkRegistryAwareTraitOro\Component\DependencyInjection\Compiler\TaggedServiceLinkRegistryCompilerPassOro\Component\DependencyInjection\Exception\UnknownAliasExceptionembedded_form_custom_layout has been removed. Use layout updates instead.exclusions, entity_aliases, entity_alias_exclusions, virtual_fields, virtual_relations and entity_name_formats sections have been removed from EntityBundle configuration. Use Resources/config/oro/entity.yml instead.datasource attribute for oro_filter.extension.orm_filter.filter tag has been removed as it is redundant.resources, vendors and routes sections via HelpBundle configuration has been removed. Use Resources/config/oro/help.yml instead.DefaultTransportFactory and related configuration option oro_message_queue.transport.defaut was removed. Check config/config.yml in your application.menu_config, navigation_elements and titles sections via NavigationBundle configuration has been removed. Use Resources/config/oro/navigation.yml instead.Oro\Bundle\NavigationBundle\Config\MenuConfiguration has been removed. Use Oro\Bundle\NavigationBundle\Configuration\ConfigurationProvider instead.themes section has been removed from LayoutBundle configuration. Use Resources/views/layouts/{folder}/theme.yml instead.name_format section has been removed from LocaleBundle configuration. Use Resources/config/oro/name_format.yml instead.address_format section has been removed from LocaleBundle configuration. Use Resources/config/oro/address_format.yml instead.locale_data section has been removed from LocaleBundle configuration. Use Resources/config/oro/locale_data.yml instead.oro_query_designer.query_designer.manager.link service has been removed. Use oro_query_designer.query_designer.manager service instead.datasource attribute for oro_search.extension.search_filter.filter tag has been removed as it is redundant.entities_config section has been removed from SearchBundle configuration. Use Resources/config/oro/search.yml instead.Oro\Bundle\SearchBundle\Event\BeforeMapObjectEvent has been removed.oro_search.entities_config has been removed. Use oro_search.provider.search_mapping service instead of it.Oro\Bundle\SearchBundle\Query\Query:
Oro\Bundle\SearchBundle\EventListener\IndexationListenerTrait was removed.Oro\Bundle\SearchBundle\Engine\Orm\DBALPersisterDriverTrait was removed.security:configurable-permission:load has been removed.resource_granted has been removed. Use is_granted from Symfony instead.sidebar_widgets section has been removed from SidebarBundle configuration. Use Resources/public/sidebar_widgets/{folder}/widget.yml instead.Oro\Bundle\SidebarBundle\Model\WidgetDefinitionRegistry has been renamed to Oro\Bundle\SidebarBundle\Configuration\WidgetDefinitionProvider.oro_sidebar.widget_definition.registry has been renamed to oro_sidebar.widget_definition_provider.placeholders and placeholder_items sections have been removed from UIBundle configuration. Use Resources/config/oro/placeholders.yml instead.show_pin_button_on_start_page has been removed from UIBundle configuration.jquery.mCustomScrollbar has been removed. Use styled-scroll-baroro.importexport.pre_http_import is deprecated in favor of oro.importexport.pre_import.oro.importexport.http_import is deprecated in favor of oro.importexport.import.oro:platform:upgrade20:db-configs and oro:platform:upgrade20 were removed because they are no longer used in version 3.x. Related logic was also removed. Use oro:platform:update instead.oro_installer.namespace_migration and the logic that used it were removed.oro:workflow:definitions:upgrade20 was removed because it was used for 2.x version update only.custom_fields as a possible value for exclusion_policy option of entities section of Resources/config/oro/api.yml. This value can be used if it is required to exclude all custom fields (fields with is_extend = true and owner = Custom in extend scope in entity configuration) that are not configured explicitly.= (eq), != (neq), * (exists), !* (neq_or_null), ~ (contains) and !~ (not_contains).rest_api_prefix and rest_api_pattern configuration options and oro_api.rest.prefix and oro_api.rest.pattern DIC parameters to be able to reconfigure REST API base path.disposeLayout on DOM element in layoutAssetBundle replaces the deprecated AsseticBundle to build assets using Webpack.
It currently supports only styles assets. JS assets are still managed by OroRequireJsBundle.upload_file_mime_types section and upload_image_mime_types in the config.yml file:oro_attachment:
upload_file_mime_types:
- application/msword
- application/vnd.ms-excel
- application/pdf
- application/zip
- image/gif
- image/jpeg
- image/png
upload_image_mime_types:
- image/gif
- image/jpeg
- image/png
oro.cache.abstract.without_memory_cache that is the same as oro.cache.abstract but without using additional in-memory caching, it can be used to avoid unnecessary memory usage and performance penalties if in-memory caching is not needed, e.g. you implemented some more efficient in-memory caching strategy around your cache service.Oro\Bundle\SecurityBundle\Test\Functional\RolePermissionExtension trait that can be used in functional tests where you need to change permissions for security roles.addBeforeActionPromise static method of BaseController in JS which enables to postpone route action if the required async process is in progress./api/addresses REST API resource:
created was renamed to createdAtupdated was renamed to updatedAtResources/config/oro/assets.yml files for the management-console was changed to follow the same standard as the configuration files for the OroCommerce storefront.
Use the inputs node instead of the group names.- assets:
css:
- 'my_custom_asset_group':
+ inputs:
- 'bundles/app/css/scss/first.scss'
- 'bundles/app/css/scss/second.scss'
- 'another_asset_group':
- 'bundles/app/css/scss/third.scss'
depends_on configuration option of the entities.fields section of Resources/config/oro/api.yml. Now, only entity property names (or paths that contain entity property names) can be used in it. In addition, exception handling of invalid values for this option was improved to return more useful exception messages.customize_loaded_data action are executed only for primary and included entities. Use identifier_only: true tag attribute if your processor should be executed for relationships.finish_submit event for customize_form_data action was renamed to post_validate and new pre_validate event was added../Resources/config/oro/currency_data.yml. Now app gets this data from the Intl component by IntlNumberFormatter.
If you want to override some symbols, you can decorate Oro\Bundle\LocaleBundle\Formatter\NumberFormatter::formatCurrency() method.oro_notification.event_listener.email_notification_service to oro_notification.grid_helper.private: oro_notification.entity_spool, oro_notification.form.subscriber.additional_emails, oro_notification.doctrine.event.listener, oro_notification.model.notification_settings, oro_notification.email_handler, oro_notification.mailer.spool_db, oro_notification.mailer.transport.eventdispatcher, oro_notification.mailer.transport, swiftmailer.mailer.db_spool_mailer, oro_notification.email_notification_entity_provider, oro_notification.form.subscriber.contact_information_emails, oro_notification.provider.email_address_with_context_preferred_language_provider.oro_require_js.js_engine configuration option was removed. Use oro_asset.nodejs_path instead.Oro\Bundle\SecurityBundle\ORM\Walker\AclHelper::apply method logic was changed to support Access rules.oro_security.encoder.mcrypt service was changed to oro_security.encoder.default./api/taxonomies REST API resource:
created was renamed to createdAtupdated was renamed to updatedAtlayout triggers initLayout event on DOM element instead layoutInit on mediatororo_audit.collect_audit_fields was removed. Use decoration of oro_dataaudit.converter.change_set_to_audit_fields service instead.oro_dataaudit.listener.entity_listener for the service oro_dataaudit.listener.send_changed_entities_to_message_queue was removed.oro.entity_config.field.after_remove event. Use oro.entity_config.post_flush event and ConfigManager::getFieldConfigChangeSet('extend', $className, $fieldName) method to check if a field was removed. If the change set has is_deleted attribute and its value is changed from false to true than a field was removed.excluded_fields deprecated configuration attribute for an entity. Use exclude attribute for a field instead.result_name deprecated configuration attribute for a field. Use property_path attribute instead.orderBy deprecated configuration attribute. Use order_by attribute instead.function (array &$item) : void of post serialization handler that can be specified in post_serialize configuration attribute. Use function (array $item, array $context) : array instead.ORO_PHP_PATH is no longer supported for specifying path to PHP executable.oro_notification.event_entity.class, oro_notification.emailnotification.entity.class, oro_notification.massnotification.entity.class, oro_notification.entity_spool.class, oro_notification.manager.class, oro_notification.email_handler.class, oro_notification.doctrine_listener.class, oro_notification.event_listener.mass_notification.class, oro_notification.form.type.email_notification.class, oro_notification.form.type.recipient_list.class, oro_notification.form.handler.email_notification.class, oro_notification.form.type.email_notification_entity_choice.class, oro_notification.email_notification.manager.api.class, oro_notification.mailer.transport.spool_db.class, oro_notification.mailer.transport.spool_entity.class, oro_notification.event_listener.email_notification_service.class, oro_notification.email_notification_entity_provider.class, oro_notification.mass_notification_sender.class.oro_query_designer.virtual_field_provider for the service oro_entity.virtual_field_provider.chain was removed.oro_security.acl_helper.process_select.after event, create Access Rule instead.Oro\Bundle\SecurityBundle\ORM\Walker\AclWalker, Oro\Bundle\SecurityBundle\ORM\Walker\Condition\AclConditionInterface, Oro\Bundle\SecurityBundle\ORM\Walker\Condition\AclCondition, Oro\Bundle\SecurityBundle\ORM\Walker\Condition\JoinAclCondition, Oro\Bundle\SecurityBundle\ORM\Walker\Condition\JoinAssociationCondition, Oro\Bundle\SecurityBundle\ORM\Walker\Condition\AclConditionStorage, Oro\Bundle\SecurityBundle\ORM\Walker\Condition\SubRequestAclConditionStorage and Oro\Bundle\SecurityBundle\ORM\Walker\AclConditionalFactorBuilder classes because now ACL restrictions applies with Access Rules by Oro\Bundle\SecurityBundle\ORM\Walker\AccessRuleWalker.Oro\Bundle\SecurityBundle\ORM\Walker\AclHelper::applyAclToCriteria method. Please use apply method with Doctrine Query or Query builder instead.Oro\Component\Testing\Validator\AbstractConstraintValidatorTest was removed. Use Symfony\Component\Validator\Test\ConstraintValidatorTestCase instead.loadBeforeAction and addToReuse static methods of BaseController in JS. Global Views and Components can now be defined in the HTML over data attributes, the same way as an ordinary Page Component.direction option for fields in the actions section to be able to specify if the request data and the the response data can contain a field. Possible values are input-only, output-only or bidirectional. The bidirectional is the default value.* (exists), !* (neq_or_null), ~ (contains), !~ (not_contains), ^ (starts_with), !^ (not_starts_with), $ (ends_with), !$ (not_ends_with). For details see how_to.md.case_insensitive and value_transformer options for ComparisonFilter. See how_to.md for more details.The oro_api.get_config.add_owner_validator service was renamed to oro_organization.api.config.add_owner_validator
The oro_api.request_type_provider DIC tag was renamed to oro.api.request_type_provider
The oro_api.routing_options_resolver DIC tag was renamed to oro.api.routing_options_resolver
The oro_api.api_doc_annotation_handler DIC tag was renamed to oro.api.api_doc_annotation_handler
The HTTP method depended routes and controllers were replaced with the more general ones. The following is the full list of changes:
| Removed Route | Removed Controller | New Route | New Controller |
|---|---|---|---|
| oro_rest_api_get | OroApiBundle:RestApi:get | oro_rest_api_item | OroApiBundle:RestApi:item |
| oro_rest_api_delete | OroApiBundle:RestApi:delete | oro_rest_api_item | OroApiBundle:RestApi:item |
| oro_rest_api_patch | OroApiBundle:RestApi:patch | oro_rest_api_item | OroApiBundle:RestApi:item |
| oro_rest_api_post | OroApiBundle:RestApi:post | oro_rest_api_list | OroApiBundle:RestApi:list |
| oro_rest_api_cget | OroApiBundle:RestApi:cget | oro_rest_api_list | OroApiBundle:RestApi:list |
| oro_rest_api_cdelete | OroApiBundle:RestApi:cdelete | oro_rest_api_list | OroApiBundle:RestApi:list |
| oro_rest_api_get_subresource | OroApiBundle:RestApiSubresource:get | oro_rest_api_subresource | OroApiBundle:RestApi:subresource |
| oro_rest_api_get_relationship | OroApiBundle:RestApiRelationship:get | oro_rest_api_relationship | OroApiBundle:RestApi:relationship |
| oro_rest_api_patch_relationship | OroApiBundle:RestApiRelationship:patch | oro_rest_api_relationship | OroApiBundle:RestApi:relationship |
| oro_rest_api_post_relationship | OroApiBundle:RestApiRelationship:post | oro_rest_api_relationship | OroApiBundle:RestApi:relationship |
| oro_rest_api_delete_relationship | OroApiBundle:RestApiRelationship:delete | oro_rest_api_relationship | OroApiBundle:RestApi:relationship |
oro_tag_filter was renamed to oro_html_strip_tags. See documentation.oro_rest_api_get_user_profile route was removed; use the oro_rest_api_user_profile route instead.Oro\Bundle\UserBundle\Api\Routing\UserProfileRestRouteOptionsResolver and the Oro\Bundle\UserBundle\Api\ApiDoc\UserProfileRestRouteOptionsResolver route option resolvers were removed in favor of routing.yml._format placeholder.Oro\Bundle\ApiBundle\Processor\CustomizeLoadedDataContext classOro\Bundle\ApiBundle\Model\EntityDescriptor classgetDefaultTimeout and setDefaultTimeout methods from the Oro\Bundle\EntityConfigBundle\Tools\CommandExecutor classOro\Bundle\ImportExportBundle\EventListener\ExportJoinListener class and the corresponding oro_importexport.event_listener.export_join_listener service%oro_importexport.file.split_csv_file.size_of_batch% parameter was removed; use %oro_importexport.import.size_of_batch% instead.getDefaultTimeout and setDefaultTimeout methods from the Oro\Bundle\InstallerBundle\CommandExecutor classoro_html_tag_trim; use oro_html_escape instead. See documentation.oro_html_purify; use oro_html_strip_tags instead. See documentation.oro_workflow.cache.provider.workflow_definition cache provider. Doctrine result cache is used instead.oro_config.configuration_search_provider tag.Oro\Bundle\ConfigBundle\Provider\SearchProviderInterface interface.oro_entity.structure.options event (see documentation)Oro\Bundle\EntityBundle\Provider\EntityStructureDataProviderprovider to retrieve data of entities structure (see documentation)EntityModel[?] (see documentation)EntityStructureDataProvider[?] (see documentation)FieldChoiceView[?] Backbone view, as replacement for jQuery widget oroentity.fieldChoice.Oro\Bundle\EntityExtendBundle\Tools\ExtendHelper::convertName method was renamed to convertEnumNameToCode, visibility of this method was changed from public to private and it will throw an exception when the iconv function fails on converting the input string, instead of hashing the input string.Oro\Bundle\PlatformBundle\DependencyInjection\Compiler\ConsoleGlobalOptionsCompilerPassoro_platform.console.global_options_provider tag to be able to register the console command global options provider for GlobalOptionsProviderRegistry[?] and it will be used in GlobalOptionsListener[?]. This providers must implement GlobalOptionsProviderInterface[?].FunctionChoiceView[?] Backbone view, as replacement for jQuery widget oroquerydesigner.functionChoice.SegmentChoiceView[?] Backbone view, as replacement for jQuery widget orosegment.segmentChoice.Registry[?] (see documentation)The build_query group was removed from update and delete actions. From now the updating/deleting entity is loaded by Oro\Bundle\ApiBundle\Processor\Shared\LoadEntity processor instead of Oro\Bundle\ApiBundle\Processor\Shared\LoadEntityByOrmQuery processor.
The priorities of some groups for the update action were changed. All changes are in the following table:
| Group | Old Priority | New Priority |
|---|---|---|
| load_data | -50 | -40 |
| transform_data | -60 | -50 |
| save_data | -70 | -60 |
| normalize_data | -80 | -70 |
| finalize | -90 | -80 |
| normalize_result | -100 | -90 |
The priorities of some groups for the delete action were changed. All changes are in the following table:
| Group | Old Priority | New Priority |
|---|---|---|
| load_data | -50 | -40 |
| delete_data | -60 | -50 |
| finalize | -70 | -60 |
| normalize_result | -80 | -70 |
Handling of percent data type in POST and PATCH requests was fixed. Before the fix, the percent value in GET and POST/PATCH requests was inconsistent; in POST/PATCH requests it was divided by 100, but GET request returned it as is. In this fix, the division by 100 was removed.
For string filters the default value of the allow_array option was changed from true to false. This was done to allow filter data if a string field contains a comma.
count_hints will have value of hints unless otherwise specified.
If other words from nowdatagrids:
grid-name:
...
source:
...
hints:
- SOME_QUERY_HINT
equivalent
datagrids:
grid-name:
...
source:
...
hints:
- SOME_QUERY_HINT
count_hints:
- SOME_QUERY_HINT
SegmentComponent js-component to use EntityStructureDataProvider.Oro\Bundle\SidebarBundle\Model\WidgetDefinitionRegistry class, the return type in the getWidgetDefinitions and getWidgetDefinitionsByPlacement methods were changed from ArrayCollection to array.loadModules method of the 'oroui/js/tools' js-module now returns a promise object.
How can I help you explore Laravel packages today?