The upgrade instructions are available at Oro documentation website.
The current file describes significant changes in the code that may affect the upgrade of your customizations.
- Added the ability to run post-install and post-update composer scripts defined in the composer.json of a dependency. Script that should be run during post-install must be put into section
extra.oro-post-install-cmd
, during post-update - into sectionextra.oro-post-update-cmd
. - Added new event
oro_distribution.route_collection.all
dispatched when routes are loaded from all route loaders. Implemented via\Oro\Bundle\DistributionBundle\Routing\DelegatingLoader
decorating therouting.loader
service. - Added
\Oro\Bundle\DistributionBundle\EventListener\RoutePrioritizingListener
as a general solution to alter route priorities. - Added
oro_distribution.event_listener.route_prioritizing.web_debug_toolbar
to increase the priorities of web debug toolbar routes (_wdt, _profiler*, _preview_error). - Added the ability to override controller template attribute with
_template_override
request attribute. Useful for overriding the template of a forwarded request. Implemented in\Oro\Bundle\DistributionBundle\EventListener\ControllerTemplateListener
.
- Added the ability to use nested constraints (e.g.
When
) in\Oro\Bundle\FormBundle\Validator\ConstraintFactory
that creates constraints from an array definition (e.g. fetched fromsystem_configuration.yml
).
- Added theme configuration feature that provides theme developers a way to make a storefront theme configurable by a store owner.
- Added new
\Oro\Bundle\ThemeBundle\Entity\ThemeConfiguration
entity that contains theme configuration options. - Added new
oro:theme:configuration:validate
command that validates theme configuration. - Added
\Oro\Bundle\ThemeBundle\Fallback\Provider\ThemeConfigurationFallbackProvider
fallback provider which fetches data from theme configuration.
- Added new twig function
oro_is_string
that finds whether the given variable type is a string. - Added new twig
html_controls_after
variable forform_row
widget that renders passed html content. - Removed jquery-numeric
- Added new twig function
oro_theme_configuration_value
that returns theme configuration option value. - Added theme configuration definition for configuration section into
\Oro\Bundle\LayoutBundle\Layout\Extension\ThemeConfiguration
.
- Added new
\Oro\Bundle\AttachmentBundle\Form\Type\ContentFileType
form type that saves content from the uploaded file but does not save file in the system.
- Added new
\Oro\Bundle\SecurityBundle\DoctrineExtension\Dbal\Types\CryptedTextType
doctrine type that stores text data in crypted format. - Decomposed
\Oro\Bundle\SecurityBundle\Request\SessionHttpKernelDecorator
into\Oro\Bundle\SecurityBundle\Request\SessionStorageOptionsManipulator
. - Added
oro_security.session.storage.options
container parameters that holds original session storage options.
- Added new
crypted_text
doctrine type as a data type toapi_doc_data_types
andopen_api
sections of ORO API configuration. - Added an "Add filter" button to each resource for API sandbox.
- Added a new meta
validate
flag to create and update operations, making API requests with transaction rollback instead of commit. - Added a new
rollback_validated_request
event forcustomize_form_data
action.
- added ability to define operation logic as a service instead of having it in YAML
- Added
OperationServiceInterface
andOperationServiceAbstract
for operation services - added new tag
oro_operation_service
to gather operation services in a separate service locator - updated OperationAssembler and Operation to work with services
- Moved acl_resource check to the announce event listener instead of constantly adding it to pre-conditions
- Moved operation feature availability check to the announce event listener instead of constantly adding it to pre-conditions
Operation 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
andexecute
events are triggered before and after operation logic execution
For 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 tagoro_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
foraction_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
andexecute
events are triggered before and after operation logic execution
For all event types 2 events are triggered. oro_action_group.<event_name>
and oro_action_group.<operation_name>.<event_name>
- added
conditional_steps_to
to allow to transit workflow to different steps with single transition based on condition per-step conditional_steps_to
are shown in workflow UI- Improved workflow config importing, allowed to reference files in bundles with
@BundleName/path/to/configs/workflow.yml
syntax
- added ability to define transition logic as a transition service instead of having it in YAML transition_definition
- Added
TransitionServiceInterface
andTransitionServiceAbstract
for transition services - added new tag
oro_workflow.transition_service
to gather transition services in a separate service locator - updated
TransitionAssembler
, Transition and Workflow configuration to work with transition services - implemented
ContinueToShippingAddress
for b2b checkout workflow as a transition service example - added evaluateExpression to ActionExecutor service to cover whole transition needs: run an action, action group, evaluate condition expression
- Improved QuoteAcceptable condition to support default as a property path
Added workflow events
pre_announce
,announce
. These events are triggered during checking pre-conditionspre_guard
,guard
. These events are triggered during checking conditions
Next 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>
- Moved
acl_resource
check to pre_announce event listener instead of constantly adding it to pre-conditions - Moved
is_granted_workflow_transition
check for steps to pre_announce event listener - Moved
resolve_destination_page
from actions to oro_workflow.transition listener for all workflows to support usage of this option with transition_service - ResolveDestinationPage was updated to support destination as variable in workflows
aclResource
andaclMessages
were added to Transition model
- Added
--watch
and--watch-interval
options tooro: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.
- removed dependency on WorkflowItem/ActionData in listeners which limited those listeners to a place from which event is triggered (workflow definition or action group)
- extracted extendable condition errors processing to a separate service to not depend on the translator and request stack directly
- added ability to trigger checkout events directly using event dispatcher without a need to use extendable action|condition
- introduced determined set of data available in listeners, access to current execution context was limited in order to remove untraceable dependencies on the inner workflow implementations and improve listeners re-usability
- Added
import_condition
(Expression Language syntax same to on used in DI) option for workflow import - Added import filters that may be registered via
WorkflowConfigurationImportsProcessor::addImportFilter
and should implement theImportFilterInterface
- Changed a field value of the
type
field on a string instead of the removed\Oro\Bundle\ThemeBundle\Entity\Enum\ThemeConfigurationType
enum for\Oro\Bundle\ThemeBundle\Entity\ThemeConfiguration
entity.
- Changed
\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
:- added
getOne
method - changed return value for
get
method from?FilterValue
toFilterValue[]
- changed return value for
getGroup
method fromarray [filter key => FilterValue, ...]
toarray [filter key => [FilterValue, ...], ...]
- changed return value for
getAll
method fromarray [filter key => FilterValue, ...]
toarray [filter key => [FilterValue, ...], ...]
- added
- Outdated format of API filters like
filter[id]>=1
is not supported from now, usefilter[field][operator]=value
syntax instead, e.g.filter[id][gte]=1
.
- 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
- Added
conditional_steps_to
to allow to transit workflow to different steps with single transition based on condition per-step conditional_steps_to
are shown in workflow UI- Improved workflow config importing, allowed to reference files in bundles with
@BundleName/path/to/configs/workflow.yml
syntax - Disallowed to transit workflow in pre-conditions or pre-actions.
- Added ability to define transition logic as a transition service instead of having it in YAML transition_definition
- Added TransitionServiceInterface and TransitionServiceAbstract for transition services
- Added new tag oro_workflow.transition_service to gather transition services in a separate service locator
- Updated TransitionAssembler, Transition and Workflow configuration to work with transition services
- Implemented ContinueToShippingAddress for b2b checkout workflow as a transition service example
- Added evaluateExpression to ActionExecutor service to cover whole transition needs: run an action, action group, evaluate condition expression
- Improved QuoteAcceptable condition to support default as a property path
Added workflow events
- pre_announce, announce. These event are triggered during checking pre-conditions
- pre_guard, guard. These event are triggered during checking pre-conditions
Next 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>
- Moved
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 inacl_resource
, such checks must be moved to pre-conditions. - Moved
is_granted_workflow_transition
check for steps topre_announce
event listener - Moved
resolve_destination_page
from actions tooro_workflow.transition
listener for all workflows to support usage of this option with transition_service ResolveDestinationPage
was updated to support destination as variable in workflowsaclResource
andaclMessages
were added to Transition model
- Added
--watch
and--watch-interval
options tooro: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.
- ExtendableCondition does not work directly with context, accepting only the data needed for event listeners.
- ExtendableConditionEvent
getContext
replaced bygetData
. It's no longer possible to work directly with the workflow/action execution context. - ExtendableAction does not work directly with context, accepting only the data needed for event listeners.
- ExtendableActionEvent
getContext
replaced bygetData
. It's no longer possible to work directly with the workflow/action execution context. - Introduced determined set of data available in listeners, access to current execution context was limited in order to remove untraceable dependencies on the inner workflow implementations and improve listeners re-usability
- Removed dependency on WorkflowItem/ActionData in listeners which limited those listeners to a place from which event is triggered (workflow definition or action group)
- Extracted extendable condition errors processing to a separate service to not depend on the translator and request stack directly
- Added ability to trigger checkout events directly using event dispatcher without a need to use extendable action|condition
- Added
import_condition
(Expression Language syntax same to on used in DI) option for workflow import - Added import filters that may be registered via
WorkflowConfigurationImportsProcessor::addImportFilter
and should implement theImportFilterInterface
- Changed
\Oro\Bundle\EntityBundle\Provider\EntityNameProvider
to make it work with enum fields.
- Fixed
\Oro\Bundle\EmailBundle\Sync\NotificationAlertManager
fails to update an existing alert if user is null.
- Changed
\Oro\Bundle\UserBundle\Controller\ResetController::sendEmailAction
so it redirects to the_return_route
route request attribute in case of error. - Changed
\Oro\Bundle\UserBundle\Controller\ResetController::sendEmailAction
so it redirects to the_target_route
request attribute in case of success. - Changed
@OroUser/Reset
templates to enable the ability to override form action path, return path and target path. - Changed
@OroUser/Security/login.html.twig
template to enable the ability to override form action path, return path and target path.
- Updated sanitize logic, it takes into account a new
crypted_text
doctrine type now.
- Disabled key normalization for
data
attributes of thebutton_options
section for operations. Now, using the dash symbol for data attribute naming is possible.
Updating the ORO Enum implementation is caused by:
- Read-only permissions for web server user on entity extend files in the system cache.
- Updates to entities from the UI do not require cache updates in the entity management.
- Need to avoid code generation.
- Reduce the number of requests in cases where the object uses join queries with a large number of lists.
- After completion, it will be possible to remove MultiHostBundle on schema update.
Before:
- The main storage place for ORO Enums are tables created for each enum. The table name begins with
oro_enum_
.
Example:
oro_enum_auth_status
oro_enum_inventory_status
- The connection between a specific enum and a table is created using a relation column. To get the value of the enum, you need to make a join in the query.
- The entity configuration stores the relationship between the enum and the target table and the configuration of the enum itself.
- There is a difference in configuration for the enum and for the product attribute of the enum.
- All extend enums are inherited from the base one
Oro\Bundle\EntityExtendBundle\Entity\AbstractEnumValue
.
After:
-
All ORO enums are stored in a table
oro_enum_option
. -
The connection between the target table that uses the enum and the enum itself is built without a relation. Enum values used by entities are stored in the field
serialized_data
. -
Updated enums are inherited not from the
Oro\Bundle\EntityExtendBundle\Entity\AbstractEnumValue
but fromOro\Bundle\EntityExtendBundle\Entity\EnumOptionInterface
[f]
{
"inventory_status": "prod_inventory_status.in_stock",
"multi_enum": ["prod_multi_enum.test_option_1", "prod_multi_enum.test_option_3"]
}
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 |
Before:
$queries->addPostQuery(
new OutdatedInsertEnumValuesQuery(
$this->extendExtension,
'cu_auth_status',
[new OutdatedEnumDataValue(CustomerUserAuthStatus::STATUS_EXPIRED, 'Expired', 3)]
)
);
namespace Oro\Bundle\CalendarBundle\Migrations\Schema\v1_0;
class OroCalendarBundle implements Migration, ExtendExtensionAwareInterface
{
use ExtendExtensionAwareTrait;
public function up(Schema $schema, QueryBag $queries)
{
$table = $schema->getTable('oro_calendar_event_attendee');
$this->extendExtension->addEnumField(
$schema,
$table,
'status',
'ce_attendee_status',
false,
false,
[
'extend' => ['owner' => ExtendScope::OWNER_CUSTOM]
]
);
}
After:
$queries->addPostQuery(
new OutdatedInsertEnumValuesQuery(
$this->outdatedExtendExtension, // Outdated extend extension must be used for old enums
'cu_auth_status',
[new OutdatedEnumDataValue(CustomerUserAuthStatus::STATUS_EXPIRED, 'Expired', 3)]
)
);
namespace Oro\Bundle\CalendarBundle\Migrations\Schema\v1_0;
class OroCalendarBundle implements Migration, OutdatedExtendExtensionAwareInterface
{
use OutdatedExtendExtensionAwareTrait;
public function up(Schema $schema, QueryBag $queries)
{
$table = $schema->getTable('oro_calendar_event_attendee');
$this->outdatedExtendExtension->addOutdatedEnumField(
$schema,
$table,
'status',
'ce_attendee_status',
false,
false,
[
'extend' => ['owner' => ExtendScope::OWNER_CUSTOM]
]
);
}
Before:
$queries->addPostQuery(new OutdatedInsertEnumValuesQuery($this->outdatedExtendExtension, 'cu_auth_status', [
new OutdatedEnumDataValue(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';
}
}
Before:
- join Enum options via "relation"
->leftJoin('attendee.status', 'attendee_status')
After:
->leftJoin(
EnumOption::class,
'attendee_status',
Expr\Join::WITH,
"JSON_EXTRACT(attendee.serialized_data, 'status') = attendee_status"
)
- Query by enum fields
$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")
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)
);
Before:
if ($user->getAuthStatus()->getId() !== UserManager::STATUS_ACTIVE) {}
if (!$originalValue instanceof AbstractEnumValue) {}
After:
if ($user->getAuthStatus()->getIntenalId() !== UserManager::STATUS_ACTIVE) {}
if (!$originalValue instanceof EnumOptionInterface) {}
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
Datagrids changes:[p]
Before:
- join enum options
join:
left:
- { join: ra.status, alias: status }
After:
join:
left:
# - { join: ra.status, alias: status } # removed
- Example of datagrid columns and joins update
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
Data fixture changes:[p]
- load enum options
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'
- Enum fields do not change in the search index, the only thing you need to remember is that in the search, the internal id of the enum is used as a key, and the value remains unchanged.
- The format of import and export has not changed, but you need to remember that the internalId of the enum option is used as an identifier.
Before:
quote_creating_definition:
preconditions:
'@and':
- '@neq': [$status.id, 'lost']
- '@neq': [$status.id, 'won']
- '@type': [$customer.target, 'Oro\Bundle\CustomerBundle\Entity\Customer']
After:
quote_creating_definition:
preconditions:
'@and':
- '@neq': [$status.internalId, 'lost']
- '@neq': [$status.internalId, 'won']
- '@type': [$customer.target, 'Oro\Bundle\CustomerBundle\Entity\Customer']
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
...
- Removed activity_support configuration option from dictionary entity config scope. Consider replacing it with collapsed_associations configuration option of QueryDesignerBundle when it is used for your entity.
- 6.0.0
- 5.1.0
- 5.0.0
- 4.2.10
- 4.2.4
- 4.2.2
- 4.2.0
- 4.1.0
- 4.0.0
- 3.1.4
- 3.1.3
- 3.1.2
- 3.1.0
- 3.0.0
- 2.6.0
- 2.5.0
- 2.2.0
- 2.1.0
Based on symfony security changes, the approach to user authentication was updated. The main differences in the new approach will be described below.
- You should use
SecurityExtension::addAuthenticatorFactory()
instead ofSecurityExtension::addSecurityListenerFactory()
.[f]
Before:
$extension->addSecurityListenerFactory(new OrganizationFormLoginFactory());
After:
$extension->addAuthenticatorFactory(new OrganizationFormLoginFactory());
- Authenticators have replaced the previous implementation of authentication using providers and listeners.
Before:
Oro\Bundle\SecurityBundle\Http\Firewal\OrganizationBasicAuthenticationListener
Oro\Bundle\SecurityBundle\Authentication\Provider\UsernamePasswordOrganizationAuthenticationProvider
After:
Oro\Bundle\SecurityBundle\Authentication\Authenticator\UsernamePasswordOrganizationAuthenticator
- You should use
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 }
- Changed implementation of
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
}
- In twig templates, to check whether the user is authorized, you need to use the function
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 %}
- Added new
feature_firewall_authenticators
option toapi_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
- String value(s) contains only space symbols is not allowed for string API filters. For example the following filters
are not valid:
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 useallow_empty
filter option inResources/config/oro/api.yml
, e.g.:
api:
entities:
Acme\Bundle\AcmeBundle\Entity\SomeEntity:
filters:
code:
options:
allow_empty: true
- Added the ability to specify
\Symfony\Component\Validator\Constraints\GroupSequence
in validation groups of API config via nested arrays.
- Added the chain of constraint converters to
\Oro\Bundle\FormBundle\Form\Extension\JsValidation\ConstraintConverter
with basic implementation in\Oro\Bundle\FormBundle\Form\Extension\JsValidation\GenericConstraintConverter
. - Added
\Oro\Bundle\FormBundle\Form\Extension\JsValidation\RangeConstraintConverter
forRange
constraint with the ability to handleminPropertyPath
andmaxPropertyPath
. - Added
\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.
- Added
\Oro\Bundle\PlatformBundle\Validator\Constraints\ValidEmbeddable
that allows to applyValid
constraint with explicit validation groups specified inembeddedGroups
option.
- Added the email template inheritance feature that provides an ability to extend an email template from parent one.
- Added
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. - Added
\Oro\Bundle\EmailBundle\Provider\RenderedEmailTemplateProvider
as an entry point to get a rendered email template by criteria. - Added
\Oro\Bundle\EmailBundle\Sender\EmailTemplateSender
as an entry point to render email template and send it to recipients. - Added
\Oro\Bundle\EmailBundle\Factory\EmailModelFromEmailTemplateFactory
as an entry point to render an email template and create an email model ready to be sent. - Added
\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. - Added
\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.
- Added method
getEntityTreeNodeByPropertyPath
to JSEntityStructureDataProvider
(see documentation) - Added magic property
entityTree
toEntityStructureDataProvider
(see documentation) that allows walk through entity fields tree - Added JS
EntityTreeNode
that is used inEntityStructureDataProvider
- Added JS
ExpressionEditorComponent
(see documentation that used instead regularViewComponent
in formtype options of rule editor. It's designed to prepare instance ofEntityStructureDataProvider
and create instance ofExpressionEditorView
expression-editor-component.js - Added
\Oro\Bundle\FormBundle\Validator\Constraints\UniqueEntity
validation constraint and validator.
- Added
renderCollapsibleWysiwygContentPreview
andrenderWysiwygContentPreview
TWIG macros to UIBundle for rendering WYSIWYG content in backoffice.
- Added supporting of the
readonly
attribute in\Oro\Bundle\CurrencyBundle\Form\Type\PriceType
.
- Removed support of
{@feature}
placeholder in API documentation. It was done because API documentation should not depend on the application configuration changes made by users.
- Decomposed
\Oro\Bundle\EmailBundle\Provider\EmailRenderer
, made it as an entry point to render an email template.- Added
\Oro\Bundle\EmailBundle\Event\EmailTemplateRenderBeforeEvent
and\Oro\Bundle\EmailBundle\Event\EmailTemplateRenderAfterEvent
- Added
- Decomposed
\Oro\Bundle\EmailBundle\Form\Type\EmailType
into\Oro\Bundle\EmailBundle\Form\EventListener\EmailTemplateRenderingSubscriber
to move the email template rendering responsibility to the form subscriber. - Changed
\Oro\Bundle\EmailBundle\Migrations\Data\ORM\AbstractEmailFixture
to make it ensure that an email template name is equal to its file name.
- Refactored JS
EntityStructureDataProvider
[?] (see documentation)- method
getPropertyPathByPath
renamed togetRelativePropertyPathByPath
- method
getPathByPropertyPath
renamed togetPathByRelativePropertyPath
- method
getPathByPropertyPathSafely
renamed togetPathByRelativePropertyPathSafely
- method
- Decomposed
\Oro\Bundle\EntityBundle\Twig\Sandbox\TemplateRenderer
into separate processors and factories. Moved the TWIG sandbox configuration out of its responsibility.
- Refactored
ExpressionEditorView
[?] (see documentation) - Refactored
ExpressionEditorUtil
[?] (see documentation)- made it descendant of
BaseClass
- changed options format
- made it descendant of
- Updated
\Oro\Bundle\LocaleBundle\Provider\CurrentLocalizationProvider::setCurrentLocalization
to make it additionally switch localization, language, locale in\Locale
,\Gedmo\Translatable\TranslatableListener
and Symfony translator.
- JS
*-filter-initialized
modules, defined overinit_module
option in filter configuration, now expected to export a sync callback function
- All datagrids used in storefront application were moved from
<BundleName>/Resources/config/oro/datagrids.yml
to layouts folder of thedefault
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.
- Added
\Oro\Bundle\SearchBundle\Event\BeforeIndexEntitiesEvent
that is dispatched in\Oro\Bundle\SearchBundle\EventListener\IndexListener
in postFlush method after changing or updating indexing entities.
- Added postponed delete entities logic to
\Oro\Bundle\DataGridBundle\Extension\MassAction\DeleteMassActionHandler
.
- Removed
$offset-*
scss variables - Added
spacing
scss function.$offset-x\$offset-y
=>spacing('base')
$offset-x-m\$offset-y-m
=>spacing('sm')
$offset-x-s\$offset-y-s
=>spacing('xs')
- Removed
\Oro\Bundle\EmailBundle\Manager\EmailTemplateManager
, use instead\Oro\Bundle\EmailBundle\Sender\EmailTemplateSender
.[f] - Removed
\Oro\Bundle\EmailBundle\Tools\EmailTemplateSerializer
, use instead\Oro\Bundle\EmailBundle\Sender\EmailTemplateSender
.[f] - Removed
\Oro\Bundle\EmailBundle\Provider\LocalizedTemplateProvider
use instead\Oro\Bundle\EmailBundle\Provider\EmailTemplateProvider
and\Oro\Bundle\EmailBundle\Provider\TranslatedEmailTemplateProvider
.[f] - Removed
\Oro\Bundle\EmailBundle\Provider\\Oro\Bundle\EmailBundle\Provider\EmailTemplateContentProvider
, use instead\Oro\Bundle\EmailBundle\Provider\RenderedEmailTemplateProvider
.[f]
- Removed
\Oro\Bundle\NotificationBundle\Manager\EmailNotificationSender
, use instead\Oro\Bundle\NotificationBundle\Manager\EmailNotificationManager
.[f] - Removed unused
\Oro\Bundle\NotificationBundle\Model\EmailTemplate
, use instead\Oro\Bundle\EmailBundle\Model\EmailTemplate
.[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]
- Add
ExtendEntityInterface
implementation for extendable entity. - Add the usage of
ExtendEntityTrait
for extendable entity. - Remove the extended entity as a layer, moving the base extend classes to the main 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 setAuthStatus(AbstractEnumValue $enum)
* @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 setAuthStatus(AbstractEnumValue $enum)
* @method AbstractEnumValue getAuthStatus()
*/
class User extends AbstractUser implements
EmailOwnerInterface,
EmailHolderInterface,
FullNameInterface,
AdvancedApiUserInterface,
ExtendEntityInterface
{
use ExtendEntityTrait; // The implementation of the ExtendEntityInterface
}
Accessing Extended Properties and Methods[f]
- To access the properties and methods of all entities, you must use the PropertyAccess factory methods.
- Method PropertyAccess::createPropertyAccessor() - used to create base symfony property accessor with custom reflection extractor.
- Method PropertyAccess::createPropertyAccessorWithDotSyntax() - should be used instead of Oro\Component\PropertyAccess\PropertyAccessor.
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' // or '@oro_entity_extend.accessor.property_accessor_with_dot_array_syntax' instead of Oro PropertyAccessor
- For extended entities, we should use the helper method to check if extended property or method exists.
- Oro\Bundle\EntityExtendBundle\EntityPropertyInfo helper methods must be used instead of property_exists() or method_exists() native methods for extended entities.[f]
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')) {
}
Reflection Usage With Extended Entities[f]
- For extended entities, use Oro\Bundle\EntityExtendBundle\EntityReflectionClass instead of \ReflectionClass;
- For extended properties, use Oro\Bundle\EntityExtendBundle\Doctrine\Persistence\Reflection\ReflectionVirtualProperty
- For extended methods, use Oro\Bundle\EntityExtendBundle\Doctrine\Persistence\Reflection\VirtualReflectionMethod
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;
}
- Added
Oro\Bundle\AttachmentBundle\Provider\OriginalFileNameProvider
filename provider that uses a sanitized original filename for files ifattachment_original_filenames
feature is enabled. - Added
Oro\Bundle\AttachmentBundle\Entity\File::$externalUrl
property to store external file URL. - Added
Oro\Bundle\AttachmentBundle\Provider\ExternalUrlProvider
(oro_attachment.provider.external_url_provider
) that returnsOro\Bundle\AttachmentBundle\Entity\File::$externalUrl
for a file, a resized or a filtered image URL. - Added
oro_attachment.provider.external_url_provider
to the decorators chain of the file url providersOro\Bundle\AttachmentBundle\Provider\FileUrlProviderInterface
(oro_attachment.provider.file_url
). - Added
Oro\Bundle\AttachmentBundle\Model\ExternalFile
model as a descendant of\SplFileInfo
that represents an externally stored file. - Added
Oro\Bundle\AttachmentBundle\Tools\ExternalFileFactory
that createsOro\Bundle\AttachmentBundle\Model\ExternalFile
from a URL orOro\Bundle\AttachmentBundle\Entity\File
entity. - Added
isExternalFile
form option toOro\Bundle\AttachmentBundle\Form\Type\FileType
that enables the external file URL input instead of the upload input. - Added
Oro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormTypeProvider
that provides form type and common form options for extend fields. - Added
Oro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormOptionsProvider
(oro_entity_extend.provider.extend_field_form_options
) that collects extend field form options from the underlying providers ofOro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormOptionsProviderInterface
interface. - Added service container tag
oro_entity_extend.form_options_provider
for extend field form options providers to be used inoro_entity_extend.provider.extend_field_form_options
. - Added
Oro\Bundle\AttachmentBundle\Provider\ExtendFieldFileFormOptionsProvider
that provides form options forfile
,image
,multiFile
,multiImage
types of extend fields. - Added
Oro\Bundle\FormBundle\Validator\Constraints\RegExpSyntax
validation constraint for checking regular expression syntax. - Added
Oro\Bundle\AttachmentBundle\ImportExport\FileManipulator
that uploads a file or clones it from the existing one during import.
- Added
Oro\Bundle\DigitalAssetBundle\Provider\ExtendFieldFileDamFormOptionsProvider
that managesdam_widget_enabled
form option based onuse_dam
,is_stored_externally
entity field config values forfile
,image
,multiFile
,multiImage
types of extend fields.
- Added
markAsSkipped
andisFieldSkipped
method to\Oro\Bundle\ImportExportBundle\Event\DenormalizeEntityEvent
to mark certain field as skipped during denormalization process to avoid possible type conflicts.
- Added entity name provider for
Locale
entity - Added
oro:localization:localized-fallback-values:cleanup-unused
command that finds and deletes orphanedOro\Bundle\LocaleBundle\Entity\LocalizedFallbackValue
entities that could appear due to disabledorphanRemoval
option. - Added
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. - Added
\Oro\Bundle\LocaleBundle\Cache\Normalizer\LocalizedFallbackValueCollectionNormalizer
and\Oro\Bundle\LocaleBundle\Cache\Normalizer\LocalizedFallbackValueNormalizer
for using when caching complex structures
- For better data consistency and more valid testing scenarios, data fixtures are now validated during ORM demo data load, and Behat fixtures load.
- Search query aggregations now can have parameters added via fourth parameter of the
addAggregate
method - Added possibility to set maximum number of results for the count search aggregation
- Added
behat_test
environment to run tests that depend on mocks in a separate environment. - Marked all the tests that depend on behat_test environment with the
@behat-test-env
tag. - Replaced message queue Behat isolators with the JobStatusSubscriber that checks the jobs table and does not depend on application changes
- Added the
--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 maintenance mode isolators to toggle the maintenance mode when the database is backed up and restored so the message consumer does not produce errors during these operations.
- Updated some behat tests and contexts to work with the new isolators.
-
Added
renderCollapsibleWysiwygContentPreview
andrenderWysiwygContentPreview
TWIG macros to UIBundle for rendering WYSIWYG content in backoffice. -
Added
oroui/js/app/modules/swipeable-module
instead ofswipeableView
to dispatch Custom Swipe Events to a document. The provided Swipe Events are:- The
swipestart
event is fired when one or more touch points are placed on the touch surface; - The
swipemove
event is fired when one or more touch points are moved along the touch surface with the detail option that includes thex
andy
coordinates of the pointer; - The
swipeend
event fires when one or more touch points are removed from the touch surface with the detail option that includes thex
andy
coordinates anddirection
of the pointer; - The
swipeleft
andswiperight
events are fired when one or more touch points are moved along the touch surface with the detail option that includes thex
andy
coordinates of the pointer. It is fired only if the elapsed time between the start and end events is less than or equal tomaxAllowedTime
;
- The
- Added
\Oro\Component\Layout\Extension\Theme\Model\ThemeManager::getThemesHierarchy
to easily get the theme hierarchy for the specified theme. - Added the ability to specify response status code via layout context option
response_status_code
.
- Added
\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.
- Added
\Oro\Bundle\NavigationBundle\Entity\MenuUpdateInterface::isSynthetic
to distinguish menu updates applied to the system menu items even if they do not exist anymore. - Added "synthetic" field to
\Oro\Bundle\NavigationBundle\Entity\MenuUpdate
. - Added
\Oro\Bundle\NavigationBundle\Event\MenuUpdatesApplyAfterEvent
that is dispatched in\Oro\Bundle\NavigationBundle\Menu\MenuUpdateBuilder
after all menu updates are applied. - Added
menu
form option as required for\Oro\Bundle\NavigationBundle\Form\Type\MenuUpdateType
. - Added
\Oro\Bundle\NavigationBundle\Manager\MenuUpdateDisplayManager
,\Oro\Bundle\NavigationBundle\Manager\MenuUpdateMoveManager
. - Added
\Oro\Bundle\NavigationBundle\Menu\DividerBuilder
that adds "divider" class to menu items. - Added
\Oro\Bundle\NavigationBundle\Menu\HideEmptyItemsBuilder
that recursively hides menu items that do not have any children. - Added
\Oro\Bundle\NavigationBundle\Menu\LostItemsBuilder
that removes menu items added by non-custom menu updates when target system menu item does not exist anymore. - Added
\Oro\Bundle\NavigationBundle\Menu\OrphanItemsBuilder
that moves orphaned menu items to the menu root. - Added
\Oro\Bundle\NavigationBundle\MenuUpdate\Applier\MenuUpdateApplier
that applies a menu update to menu item. - Added
\Oro\Bundle\NavigationBundle\MenuUpdate\Factory\MenuUpdateFactory
. - Added
\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. - Added
\Oro\Bundle\NavigationBundle\Utils\MenuUpdateUtils::createRecursiveIterator
,\Oro\Bundle\NavigationBundle\Utils\MenuUpdateUtils::flattenMenuItem
for more convenient access to the menu item.
- Updated from
slick-carousel: 1.7.1
to fork@oroinc/slick-carousel: 1.7.1-oro1
with patched internalpostSlide
method - Updated path of styles from
~slick-carousel/slick/slick.scss
to~@oroinc/slick-carousel/slick/slick.scss
and path of js fromslick-carousel/slick/slick
to@oroinc/slick-carousel/slick/slick
- Moved all ORM relates mocks and test cases to
Testing
component. Old namespace for these classes wasOro\Component\TestUtils\ORM
. New namespace isOro\Component\Testing\Unit\ORM
.[f]
- The parameter
throwException
was removed from the methodconvertToEntityType
ofOro\Bundle\ApiBundle\Util\ValueNormalizerUtil
. Use thetryConvertToEntityType
method when an entity type might not exist.[f] - The parameter
throwException
was removed from the methodconvertToEntityClass
ofOro\Bundle\ApiBundle\Util\ValueNormalizerUtil
. Use thetryConvertToEntityClass
method when an entity class might not exist.[f]
- Changed configuration option
disable_babel
(true
by default) towith_babel
(false
by default).
- Changed
Oro\Bundle\AttachmentBundle\Entity\File::$file
property type to?\SplFileInfo
to allowOro\Bundle\AttachmentBundle\Model\ExternalFile
. MethodssetFile
andgetFile
are changed correspondingly.[p] - Changed
Oro\Bundle\AttachmentBundle\Manager\FileManager::getFileFromFileEntity
return type to?\SplFileInfo
to comply withOro\Bundle\AttachmentBundle\Entity\File::$file
property type.[f] - Changed
Oro\Bundle\AttachmentBundle\ImportExport\FileImportStrategyHelper::getFieldLabel
visibility to public, so it can be used for getting human-readable field names during import.[f] - Changed
Oro\Bundle\AttachmentBundle\ImportExport\EventListener\FileStrategyEventListener
constructor, so it expectsOro\Bundle\AttachmentBundle\ImportExport\FileManipulator $fileManipulator
instead of$fileManager
, also the$authorizationChecker
argument is removed.
-
The
oro.cache.abstract
abstract service is removed, useoro.data.cache
instead, with thecache.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' }
- The
iconHideText
option foraction-launcher
anddropdown-select-choice-launcher
views was removed, use thelauncherMode
option instead. ThelauncherMode
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;
- Changed
Oro\Bundle\DigitalAssetBundle\ImportExport\EventListener\DigitalAssetAwareFileStrategyEventListener
constructor, so it expectsOro\Bundle\AttachmentBundle\ImportExport\FileImportStrategyHelper $fileImportStrategyHelper
instead of$doctrineHelper
.
- Changed
Oro\Bundle\EntityExtendBundle\Form\Guesser\ExtendFieldTypeGuesser
constructor, so it expectsOro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormTypeProvider $extendFieldFormTypeProvider
andOro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormOptionsProviderInterface $extendFieldFormOptionsProvider
instead of$enumConfigProvider
. - Changed
Oro\Bundle\EntityExtendBundle\Form\Guesser\ExtendFieldTypeGuesser
so it gets the form type fromOro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormTypeProvider
and the form options fromOro\Bundle\EntityExtendBundle\Provider\ExtendFieldFormOptionsProvider
now.
- Changed the
cascade
Doctrine option of the\Oro\Bundle\OrganizationBundle\Entity\Ownership\BusinessUnitAwareTrait::$owner
association: it is not cascade-persisted anymore.
- As the 'composer/composer' package is no longer used, the
Oro\Bundle\PlatformBundle\Provider\PackageProvider
class based services now provide the packages info in pure arrays instead of the array of theComposer\Package\PackageInterface
interface based objects. The returned array structure is as follows:['package_name' => ['pretty_version' => '1.0.0', 'license' => ['MIT']]]
..
- Reminder template messages are added as JS template macros under
reminderTemplates
namespace. Twig placeholderoro_reminder_reminder_templates
no longer in use.
- Changed search engine configuration:
search_engine_dsn
parameter is used instead ofsearch_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
. - Entity title in the search index is no longer stored in the special field in the DB, now it is stored as a regular index text field called
system_entity_name
- Entity title is no longer returned in the search results by default, now it has to be manually added to the select section of the query
- All entities presented in the search index now have proper entity name providers
- Added the bundle itself to
oro/platform
package. The bundle came from outer packageoro/redis-config
and it was rebuilt to utilize Symfony redis configuration components instead of once from 3rd party packagesnc/redis-bundle
.
oroui/js/app/components/viewport-component
has been changed options fromviewport: {maxScreenType: 'tablet'}
orviewport: {minScreenType: 'tablet'}
toviewport: '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 updateisApplicable
method. From now on, the method accepts, as arguments, a string or an array of strings of media types.
- For example:
viewportManager.isApplicable('tablet')
viewportManager.isApplicable('tablet', 'tablet-small')
viewportManager.isApplicable(['tablet', 'tablet-small'])
- Added next public methods:
getBreakpoints(context)
: returns object with all registered breakpoints from css property--breakpoints
. It is possible to pass thecontext
of the document as an argument.getMediaType(mediaType)
: returnsMediaQueryList
bymediaType
argument.
- Removed next public methods:
getViewport
getScreenType
getAllowScreenTypes
The 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>
- Changed the sorting mechanism in
\Oro\Bundle\NavigationBundle\Provider\BuilderChainProvider
: menu items are sorted as a single list instead of separate - sorted and unsorted parts.
- Every custom MQ topic needs a
topic
class now; see more in the Message Queue Topics topic.[f]
- To unify the WorkflowBundle and ActionBundle syntax, the
pre_conditions
andpost_actions
options of the workflow process definition configuration were renamed topreconditions
andactions
respectively.
Oro\Bundle\CronBundle\Command\CronCommandInterface
has been removed. UseOro\Bundle\CronBundle\Command\CronCommandScheduleDefinitionInterface
andOro\Bundle\CronBundle\Command\CronCommandActivationInterface
instead.[f]
- The deprecated
options / skip_acl_check
datagrid option was removed. Use thesource / skip_acl_apply
option instead.[f] - The deprecated
source / acl_resource
datagrid option was removed. Use theacl_resource
option instead.[f]
- JS util
EntityFieldsUtil
was removed, useEntityStructureDataProvider
instead.
- Removed
renderWysiwygContentPreview
TWIG macro from EntityConfigBundle, userenderWysiwygContentPreview
orrenderCollapsibleWysiwygContentPreview
from UIBundle instead.
- Entity configuration option
search.title_field
has been removed
- The
day-value-helper
was removed, usedate-value-helper
instead.
Oro\Bundle\FormBundle\Model\UpdateHandler
has been removed. UseOro\Bundle\FormBundle\Model\UpdateHandlerFacade
instead.[f]
- Removed
\Oro\Bundle\ImportExportBundle\Event\NormalizeEntityEvent::setResultField
, use\Oro\Bundle\ImportExportBundle\Event\NormalizeEntityEvent::setResultFieldValue
instead.[f]
- Removed
Oro\Bundle\InstallerBundle\EventListener\AssetsInstallCommandListener
, use JS packages from NPM
title_fields
field fromsearch.yml
field has been removed[f]
- CSSVariable parser
oroui/js/css-variables-manager
has been removed. - CSSVariable module
oroui/js/app/modules/css-variable-module
has been removed. - Removed
oroui/js/app/views/swipeable-view
, useoroui/js/app/modules/swipeable-module
instead. oroui/js/app/views/input-widget/checkbox
was removed; use pure CSS checkbox customization instead.- The deprecated
tooltips
translation domain was removed. All translation from this domain were moved to themessages
domain. - The
modalHandler
method forerror
helper was removed, useshowError
method instead. - The deprecated method
tools.loadModuleAndReplace()
from'oroui/js/tools'
module, useloadModules.fromObjectProp
from'oroui/js/app/services/load-modules'
instead. vertical_container
layout block type has been removed, as redundant. Use conventionalcontainer
layout block type instead, with additions custom CSS class that implements required alignment.
- Removed
Oro\Bundle\LayoutBundle\Layout\LayoutContextHolder
, useOro\Component\Layout\LayoutContextStack
instead.[f]
- Removed
Oro\Bundle\NavigationBundle\Builder\MenuUpdateBuilder
, added\Oro\Bundle\NavigationBundle\Menu\MenuUpdateBuilder
instead.[f] - Removed
\Oro\Bundle\NavigationBundle\Entity\MenuUpdateInterface::getExtras
,\Oro\Bundle\NavigationBundle\Entity\MenuUpdate::getExtras
, its purpose is moved to\Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\ExtrasPropagator
. - Removed
\Oro\Bundle\NavigationBundle\Manager\MenuUpdateManager::moveMenuItem
,\Oro\Bundle\NavigationBundle\Manager\MenuUpdateManager::moveMenuItems
. Use corresponding methods from\Oro\Bundle\NavigationBundle\Manager\MenuUpdateMoveManager
instead. - Removed
\Oro\Bundle\NavigationBundle\Manager\MenuUpdateManager::showMenuItem
,\Oro\Bundle\NavigationBundle\Manager\MenuUpdateManager::hideMenuItems
. Use corresponding methods from\Oro\Bundle\NavigationBundle\Manager\MenuUpdateDisplayManager
instead. - Removed
\Oro\Bundle\NavigationBundle\Utils\MenuUpdateUtils::updateMenuItem
, use\Oro\Bundle\NavigationBundle\MenuUpdate\Applier\MenuUpdateApplier
instead.
- Added support for Right To Left UI design; see more in the Right to Left UI Support topic.
- From now the
event
tag attribute forcustomize_form_data
action API processor services is mandatory. This was made to prevent potential logical errors. pre_flush_data
,post_flush_data
andpost_save_data
events were added to thecustomize_form_data
action. Thepre_flush_data
andpost_flush_data
events are dispatched together with theflush()
method of the entity manager in the same database transaction. Thepost_save_data
event is dispatched after the database transaction is committed. API processors for these events can be used to customize database update logic.
- New assets versions strategy
Oro\Bundle\AssetBundle\VersionStrategy\BuildVersionStrategy
was added. It uses thepublic/build/build_version.txt
application file's content as an assets version.
- Added
oro_attachment.webp_strategy
configuration node to the bundle config to control whether to convert images to WebP format. - Added
Oro\Bundle\AttachmentBundle\Manager\WebpAwareImageResizeManager
that additionally converts image to WebP format if needed. - Added
Oro\Bundle\AttachmentBundle\Provider\FilterRuntimeConfigProviderInterface
andOro\Bundle\AttachmentBundle\Provider\FilterRuntimeConfigDefaultProvider
to provide LiipImagine filter runtime configuration for using inOro\Bundle\AttachmentBundle\Provider\ResizedImageProvider
. - Added
Oro\Bundle\AttachmentBundle\Provider\WebpAwareFilterRuntimeConfigProvider
to provide LiipImagine filter runtime configuration for WebP format. - Added
Oro\Bundle\AttachmentBundle\Imagine\Provider\ImagineUrlProviderInterface
andOro\Bundle\AttachmentBundle\Imagine\Provider\ImagineUrlProvider
to generate URL for static images. - Added
Oro\Bundle\AttachmentBundle\Imagine\Provider\WebpAwareImagineUrlProvider
to generate URLs for static images in WebP format. - Added
Oro\Bundle\AttachmentBundle\Provider\WebpAwareFileNameProvider
to generate filename taking into account current WebP strategy. - Added
Oro\Bundle\AttachmentBundle\Provider\PictureSourcesProviderInterface
andOro\Bundle\AttachmentBundle\Provider\PictureSourcesProvider
to provider image sources to be used in
- Added \Oro\Bundle\BatchBundle\Step\CumulativeStepExecutor and \Oro\Bundle\BatchBundle\Step\CumulativeItemStep with writer call for empty items.
- Added a unified way to disable columns, sorters, actions, and mass actions
- Added
\Oro\Bundle\EntityBundle\ORM\DoctrineHelper::getManager
to get manager by name.
- Added new filter configuration variable
order
behavior according to the documentation
- Added
oro_importexport.strategy.configurable_import_strategy_helper
with performance improvements to replaceoro_importexport.strategy.import.helper
in strategries. - Added
\Oro\Bundle\ImportExportBundle\Event\StrategyValidationEvent
to handle validation errors formatting cases. - Added
\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableImportStrategyHelper
to improve import performance. - Added
\Oro\Bundle\ImportExportBundle\Writer\CumulativeWriter
to improve import performance. - Added
\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy::isEntityFieldFallbackValue
to support\Oro\Bundle\EntityBundle\Entity\EntityFieldFallbackValue
import. - Added
\Oro\Bundle\ImportExportBundle\Strategy\Import\ImportStrategyHelper::getEntityPropertiesByClassName
to support\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableImportStrategyHelper
import. - Added
\Oro\Bundle\ImportExportBundle\Strategy\Import\ImportStrategyHelper::verifyClass
to support\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableImportStrategyHelper
import.
- Added
\Oro\Bundle\LocaleBundle\EventListener\StrategyValidationEventListener
to formatLocalizedFallbackValue
error keys.
- Added
message_queue
connection. - Added metadata cache for
message_queue
entity manager. - Added
\Oro\Bundle\MessageQueueBundle\Platform\{OptionalListenerDriver,OptionalListenerDriverFactory,OptionalListenerExtension}
to bypass optional listeners from CLI to MQ.
- Added
\Oro\Component\MessageQueue\Consumption\Extension\LimitGarbageCollectionExtension
to limit consumer by GC runs. - Added
\Oro\Component\MessageQueue\Consumption\Extension\LimitObjectExtension
to limit consumer by objects in runtime. - Added
Oro\Component\MessageQueue\Topic\TopicInterface
to declare topic name, description, message default priority and message body structure for the MQ topics. - Added
oro_message_queue.topic
tag for declaring MQ topic in a service container. - Added
Oro\Component\MessageQueue\Topic\TopicRegistry
that contains MQ topics declared as services with tagoro_message_queue.topic
. - Added
Oro\Component\MessageQueue\Client\MessageBodyResolverInterface
andOro\Component\MessageQueue\Client\MessageBodyResolver
to validate the topic message body structure. - Added
Oro\Component\MessageQueue\Client\ConsumptionExtension\MessageBodyResolverExtension
MQ extension that resolves message body before it is passed to MQ processor.
- Added \Oro\Bundle\PlatformBundle\DependencyInjection\Compiler\DoctrineTagMethodPass to handle unsupported method definitions for Doctrine events.
- Optional listeners (except search listeners) disabled in functional tests by default. Use
$this->getOptionalListenerManager()->enableListener('oro_workflow.listener.event_trigger_collector');
to enable listeners in tests. - Added additional hook for client cleanup -
@beforeResetClient
, use it instead of@after
for full tests isolation.
- All application distributions'
config.xml
files were changed to pointOro\Bundle\AssetBundle\VersionStrategy\BuildVersionStrategy
assets version strategy to be used.
- Changed connection from
batch
tomessage_queue
- Changed
Oro\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. - Changed
Oro\Bundle\AttachmentBundle\Provider\FileNameProviderInterface
: addedgetFilteredImageName()
,getResizedImageName()
that should be used for getting names for filtered and resized images correspondingly. - Changed
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.
- Added sorting by depth to
Oro\Component\Config\Loader\FolderContentCumulativeLoader::getDirectoryContents()
to ensure that result is not affected by an operating system.
- Changed filter configuration variable from
enabled
torenderable
[f]
- In
Oro\Bundle\EmbeddedFormBundle\Controller\EmbeddedFormController::defaultDataAction
(oro_embedded_form_default_data
route) action the request method was changed to GET.
- Parent class for repositories as a services was changed to
Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository
.
- validator
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.
- Changed step class and writer service for
entity_import_from_csv
to improve import performance. - Changed
oro_importexport.strategy.add
and all strategiesoro_importexport.strategy.import.helper
implementation tooro_importexport.strategy.configurable_import_strategy_helper
- Changed
\Oro\Bundle\ImportExportBundle\Serializer\Normalizer\ScalarFieldDenormalizer
to handle advanced boolean fields cases - yes/no, true/false, 1/0. - Changed
\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy::process
to process validation errors gracefully. - Changed
\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy::updateRelations
to avoid massive collection changes. - Changed
\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy::processValidationErrors
to improve validation errors processing. - Changed
\Oro\Bundle\ImportExportBundle\Strategy\Import\ConfigurableAddOrReplaceStrategy::getObjectValue
to support edge cases, like User#roles.
- The composer's assets version set script
Oro\Bundle\InstallerBundle\Composer\ScriptHandler::setAssetsVersion
was changed to store time base hash value intopublic/build/build_version.txt
application file.
- Changed
\Oro\Bundle\LocaleBundle\ImportExport\Strategy\LocalizedFallbackValueAwareStrategy
for performance reasons, error keys logic moved to\Oro\Bundle\LocaleBundle\EventListener\StrategyValidationEventListener
.
- Changed connection from
batch
tomessage_queue
- Changed
\Oro\Component\MessageQueue\Transport\MessageInterface::getBody()
,\Oro\Component\MessageQueue\Transport\MessageInterface::setBody()
signature -$body
argument ismixed
now, i.e. can be of any type returned byjson_decode()
. - Moved JSON encoding of message body from client message producer to transport level
Oro\Component\MessageQueue\Transport\MessageProducerInterface
- toOro\Component\MessageQueue\Transport\Dbal\DbalMessageProducer
. - Moved JSON decoding of message body to transport level
Oro\Component\MessageQueue\Transport\MessageConsumerInterface
- toOro\Component\MessageQueue\Transport\Dbal\DbalMessageConsumer
. - Added the validation of message body to
Oro\Component\MessageQueue\Client\MessageProducer
usingOro\Component\MessageQueue\Client\MessageBodyResolverInterface
.
- Changed \Oro\Bundle\PlatformBundle\DependencyInjection\Compiler\UpdateDoctrineEventHandlersPass to apply default connection (instead of all) for Doctrine events when it's empty in a tag.
oro_search.fulltext_index_manager
to usedoctrine.dbal.search_connection
oro_search.event_listener.orm.fulltext_index_listener
to usedoctrine.dbal.search_connection
- Public methods
newBrowserTabIsOpened
andnewBrowserTabIsOpenedAndISwitchToIt
are moved fromOro\Bundle\TestFrameworkBundle\Tests\Behat\Context\OroMainContext
to dedicated contextOro\Bundle\TestFrameworkBundle\Tests\Behat\Context\BrowserTabContext
.
Mixins
andSCSS Variables
related todirection.scss
were removed. For implementing Right To Left UI design have a look in Right to Left UI Support.- Style build process for back-office is the same as for layout's themes. All
inputs
files are imported into oneroot.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.
- validator
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.
- Platform now requires updated version of
@oroinc/webpack-config-builder
package which is migrated to Webpack 5. See Webpack migration guide.
assets_version
andassets_version_strategy
container parameters were removed from all application distributions.- Symfony's assets version strategy
framework.assets.version
andframework.assets.version
keyed parameters were removed fromconfig.xml
file in all application distributions.
- Removed
batch
connection, usemessage_queue
connection instead.
- The DIC compiler pass
Oro\Bundle\ConfigBundle\DependencyInjection\Compiler\ListenerExcludeConfigConnectionPass
was removed. It is unneeded since thedoctrine.exclude_listener_connections
DIC parameter is no longer in use.
- Removed
Oro\Bundle\CronBundle\Async\Topics
, use getName() of corresponding topic class fromOro\Bundle\CronBundle\Async\Topic
namespace instead.[f]
- Removed
Oro\Bundle\DataAuditBundle\Async\Topics
, use getName() of corresponding topic class fromOro\Bundle\DataAuditBundle\Async\Topic
namespace instead.[f]
- The service
oro_entity.abstract_entity_manager
was removed. Oro\Bundle\EntityBundle\Provider\EntityFieldProvider::getFields()
was removed, useOro\Bundle\EntityBundle\Provider\EntityFieldProvider::getEntityFields()
instead.[f]Oro\Bundle\EntityBundle\Helper\FieldHelper::getFields()
was removed, useOro\Bundle\EntityBundle\Helper\FieldHelper::getEntityFields()
instead.[f]- The service
oro_entity.repository.factory
was removed. - The DIC compiler pass
Oro\Bundle\EntityBundle\DependencyInjection\Compiler\EntityRepositoryCompilerPass
was removed.
- The service
oro_entity_merge.accessor.delegate
was removed. Useoro_entity_merge.accessor
instead.[f] - The service
oro_entity_merge.strategy.delegate
was removed. Useoro_entity_merge.strategy
instead.[f]
- Removed
Oro\Bundle\EmailBundle\Async\Topics
, use getName() of corresponding topic class fromOro\Bundle\EmailBundle\Async\Topic
namespace instead.[f]
- Removed
Oro\Bundle\NotificationBundle\Async\Topics
, use getName() of corresponding topic class fromOro\Bundle\NotificationBundle\Async\Topic
namespace instead.[f]
- Removed
Oro\Bundle\ImapBundle\Async\Topics
, use getName() of corresponding topic class fromOro\Bundle\ImapBundle\Async\Topic
namespace instead.[f]
-
Removed
Oro\Bundle\MessageQueueBundle\Async\Topics
, use getName() of corresponding topic class fromOro\Bundle\MessageQueueBundle\Async\Topic
namespace instead.[f] -
Removed
Oro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\AddTopicDescriptionPass
, declare topic viaOro\Component\MessageQueue\Topic\TopicInterface
as a service with tagoro_message_queue.topic
instead.
- Removed
Oro\Component\MessageQueue\Job\Topics
, use getName() of corresponding topic class fromOro\Component\MessageQueue\Job\Topic
namespace instead.[f]
doctrine.exclude_listener_connections
parameter is no longer in use.
- Removed
Oro\Bundle\TranslationBundle\Async\Topics
, use getName() of corresponding topic class fromOro\Bundle\TranslationBundle\Async\Topic
namespace instead.[f]
-
Removed
Oro\Bundle\SearchBundle\Async\Topics
, use getName() of corresponding topic class fromOro\Bundle\SearchBundle\Async\Topic
namespace instead.[f] -
The DIC compiler pass
Oro\Bundle\SearchBundle\DependencyInjection\Compiler\ListenerExcludeSearchConnectionPass
was removed. It is unneeded since thedoctrine.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 theoro_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
andisEDGE
methods are removed fromoroui/js/tools
module
- Added
getOrganizations()
andgetEmails()
methods toOro\Bundle\EmailBundle\Entity\Provider\EmailOwnerProviderInterface
.
- Added
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.
- Added
Oro\Bundle\EmailBundle\Mailer\Mailer
to sendSymfony\Component\Mime\Email
message. - Added
Oro\Bundle\EmailBundle\Sender\EmailModelSender
to sendOro\Bundle\EmailBundle\Form\Model\Email
model. - Added
Oro\Bundle\EmailBundle\Mailer\Transport\Transport
decorator that dispatchesOro\Bundle\EmailBundle\Event\BeforeMessageEvent
and adds extra logging for mailer transports; - Added
Oro\Bundle\EmailBundle\Mailer\Transport\LazyTransports
decorator that defers transports instantiation until methodsend()
is called. - Added
Oro\Bundle\EmailBundle\Event\BeforeMessageEvent
event that is dispatched byOro\Bundle\EmailBundle\Mailer\Transport\Transport
to allow altering email message and envelope. - Added
Oro\Bundle\EmailBundle\Mailer\Envelope\EmailOriginAwareEnvelope
that adds ability to specifyOro\Bundle\EmailBundle\Entity\EmailOrigin
in the email message envelope. - Added
Oro\Bundle\EmailBundle\Mailer\Transport\SystemConfigTransportFactory
fororo://system-config
mailer transport. - Added
Oro\Bundle\EmailBundle\Mailer\Transport\SystemConfigTransportRealDsnProvider
for resolving real DSN that lies behindoro://system-config
DSN. - Added
Oro\Bundle\EmailBundle\Mailer\Checker\ConnectionCheckers
that allows to check if the mailer transport connection specified in the DSN is valid. - Added
Oro\Bundle\EmailBundle\EmbeddedImages\EmbeddedImagesExtractor
,Oro\Bundle\EmailBundle\EmbeddedImages\EmbeddedImagesInEmailModelHandler
,Oro\Bundle\EmailBundle\EmbeddedImages\EmbeddedImagesInSymfonyEmailHandler
for extracting and handling embedded images inOro\Bundle\EmailBundle\Form\Model\Email
andSymfony\Component\Mime\Email
models.
- Added
Oro\Bundle\ImapBundle\Mailer\Transport\UserEmailOriginTransportFactory
fororo://user-email-origin
mailer transport. - Added
Oro\Bundle\ImapBundle\Mailer\Transport\UserEmailOriginTransport
to send email messages using SMTP settings taken fromOro\Bundle\ImapBundle\Entity\UserEmailOrigin
- Added
Oro\Bundle\ImapBundle\Validator\Constraints\SmtpConnectionConfiguration
andOro\Bundle\ImapBundle\Validator\SmtpConnectionConfigurationValidator
for validating SMTP settings taken fromOro\Bundle\ImapBundle\Entity\UserEmailOrigin
. - Added
Oro\Bundle\ImapBundle\EventListener\SetUserEmailOriginTransportListener
for addingX-Transport
andX-User-Email-Origin-Id
headers to email message required to useoro://user-email-origin
mailer transport.
- Provided way to create separate JS builds only with essential modules for landing pages, see article How to Create Extra JS Build for a Landing Page.
- Added configuration option for the list of enabled layout theme, see How to Enabled the Theme.
- Added
Oro\Bundle\LoggerBundle\Monolog\ErrorLogNotificationHandlerWrapper
monolog handler wrapper to prevent error log notification from being sent when there are no recipients configured.
- Added
Oro\Bundle\NotificationBundle\Async\SendEmailNotificationProcessor
for processing MQ messages for sending email notification messages in a message queue. - Added
Oro\Bundle\NotificationBundle\Async\Topics::SEND_NOTIFICATION_EMAIL_TEMPLATE
MQ topic andOro\Bundle\NotificationBundle\Async\SendEmailNotificationTemplateProcessor
processor for processing MQ messages for sending templated email notification messages in a message queue. - Added
Oro\Bundle\NotificationBundle\Mailer\MassNotificationsMailer
for sending mass notification email messages.
- Added
Oro\Component\MessageQueue\Client\ConsumptionExtension\MessageProcessorRouterExtension
for message routing instead ofOro\Component\MessageQueue\Client\DelegateMessageProcessor
. - Added
Oro\Component\MessageQueue\Client\NoopMessageProcessor
for messages which are not claimed by any message processor. - Added
Oro\Component\MessageQueue\Client\Router\MessageRouter
andOro\Component\MessageQueue\Client\Router\Envelope
for handling messages routing into queues inOro\Component\MessageQueue\Client\MessageProducer
. - Added
Oro\Component\MessageQueue\Client\MessageProcessorRegistry
service locator. - Added
Oro\Component\MessageQueue\Consumption::getMessageProcessorName()
,Oro\Component\MessageQueue\Consumption::setMessageProcessorName()
. - Added
Oro\Component\MessageQueue\Log\ConsumerState
::getMessageProcessorName(),Oro\Component\MessageQueue\Log\ConsumerState
::setMessageProcessorName(). - Added
Oro\Component\MessageQueue\Client\Meta\TopicDescriptionProvider
. - Added
\Oro\Component\MessageQueue\Log\MessageProcessorClassProvider::getMessageProcessorClassByName()
for getting message processor class name by processor name.
- Added
client.noop_status
used for messages not claimed by any message processor.
- Changed translation cache generation logic. Now all translation strings that contain HTML tags are sanitized by the HTMLPurifier before caching. To get the list of translation messages that were sanitized run oro:translation:rebuild-cache with --show-sanitization-errors option.
- EmailBundle uses Symfony Mailer instead of SwiftMailer from now on.
- Changed mailer configuration:
mailer_dsn
parameter is used instead ofmailer_transport
,mailer_host
,mailer_port
,mailer_encryption
,mailer_user
,mailer_password
.
- Argument
processor-service
ofOro\Component\MessageQueue\Consumption\ConsumeMessagesCommand
is optional now.
installed
container parameter was removed from all application distributions. You can get the installation state by calling theisInstalled
method of theOro\Bundle\DistributionBundle\Handler\ApplicationState
service.
- Removed
Oro\Bundle\EmailBundle\Async\TemplateEmailMessageSender
. - Removed
Oro\Bundle\EmailBundle\Event\SendEmailTransport
, useX-Transport
email message header for configuring mailer transport. SeeOro\Bundle\ImapBundle\EventListener\SetUserEmailOriginTransportListener
. - Removed
Oro\Bundle\EmailBundle\Mailer\DirectMailer
, useOro\Bundle\EmailBundle\Mailer\Mailer
instead.[f] - Removed
Oro\Bundle\EmailBundle\Mailer\Processor
, useOro\Bundle\EmailBundle\Sender\EmailModelSender
instead.[f] - Removed unused
Oro\Bundle\EmailBundle\Util\MailerWrapper
. - Removed
Oro\Bundle\EmailBundle\Model\DTO\EmailAddressDTO
, use\Oro\Bundle\EmailBundle\Model\Recipient
instead.[f]
- Removed
Oro\Bundle\ImapBundle\EventListener\SendEmailTransportListener
in favor ofOro\Bundle\ImapBundle\EventListener\SetUserEmailOriginTransportListener
.[f]
- Removed
Oro\Bundle\LoggerBundle\Mailer\NoRecipientPlugin
in favor ofOro\Bundle\LoggerBundle\Monolog\ErrorLogNotificationHandlerWrapper
.[f] - Removed
Oro\Bundle\LoggerBundle\Mailer\MessageFactory
in favor ofOro\Bundle\LoggerBundle\Monolog\EmailFactory\ErrorLogNotificationEmailFactory
.[f]
- Removed
Oro\Bundle\NotificationBundle\Async\SendEmailMessageProcessor
. UseOro\Bundle\NotificationBundle\Async\SendEmailNotificationProcessor
andOro\Bundle\NotificationBundle\Async\SendEmailNotificationTemplateProcessor
instead.[f] - Removed
Oro\Bundle\NotificationBundle\Async\SendMassEmailMessageProcessor
in favor ofOro\Bundle\NotificationBundle\Async\SendEmailNotificationProcessor
.[f] - Removed
Oro\Bundle\NotificationBundle\Mailer\MassEmailDirectMailer
. UseOro\Bundle\NotificationBundle\Mailer\MassNotificationsMailer
instead.[f] - Removed unused
\Oro\Bundle\NotificationBundle\Entity\SpoolItem
entity,\Oro\Bundle\NotificationBundle\Entity\Repository\SpoolItemRepository
. - Removed unused
Oro\Bundle\NotificationBundle\Provider\Mailer\DbSpool
.
- Removed unused
Oro\Component\MessageQueue\Router
,Oro\Component\MessageQueue\Router\RouteRecipientListProcessor
,Oro\Component\MessageQueue\Router\Recipient
. - Removed unused
Oro\Component\MessageQueue\Client\Config::getRouterMessageProcessorName()
,Oro\Component\MessageQueue\Client\Config::getRouterQueueName()
. - Removed
Oro\Component\MessageQueue\Client\ContainerAwareMessageProcessorRegistry
, use insteadOro\Component\MessageQueue\Client\MessageProcessorRegistry
service locator.[f] - Removed
Oro\Component\MessageQueue\Client\DelegateMessageProcessor
, the extensionOro\Component\MessageQueue\Client\ConsumptionExtension\MessageProcessorRouterExtension
is responsible for routing to message processor now. - Removed
Oro\Component\MessageQueue\Consumption::getMessageProcessor()
andOro\Component\MessageQueue\Consumption::setMessageProcessor()
, use insteadOro\Component\MessageQueue\Consumption::getMessageProcessorName()
,Oro\Component\MessageQueue\Consumption::setMessageProcessorName()
.[f] - Removed
Oro\Component\MessageQueue\Log\ConsumerState
::getMessageProcessor() andOro\Component\MessageQueue\Log\ConsumerState
::setMessageProcessor(), use insteadOro\Component\MessageQueue\Log\ConsumerState
::getMessageProcessorName(),Oro\Component\MessageQueue\Log\ConsumerState
::setMessageProcessorName() .[f] - Removed
Oro\Component\MessageQueue\Client\Meta\TopicMeta::getDescription()
, useOro\Component\MessageQueue\Client\Meta\TopicDescriptionProvider::getTopicDescription()
instead.[f] - Removed
\Oro\Component\MessageQueue\Log\MessageProcessorClassProvider::getMessageProcessorClass()
, use\Oro\Component\MessageQueue\Log\MessageProcessorClassProvider::getMessageProcessorClassByName()
instead.[f]
- Removed unused
client.router_processor
,client.router_destination
configuration options. - Removed
Oro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\BuildRouteRegistryPass
- Removed
Oro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\ProcessorLocatorPass
andoro_message_queue.processor_locator
, use insteadOro\Component\MessageQueue\Client\ContainerAwareMessageProcessorRegistry
. - Removed
processorName
attribute fromoro_message_queue.client.message_processor
tag, use service id instead. - Removed ability to specify
processorName
inOro\Component\MessageQueue\Client\TopicSubscriberInterface::getSubscribedTopics()
, use service id instead. - Removed
Oro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\AddTopicMetaPass
, useOro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\AddTopicDescriptionPass
for specifying topic descriptions.Oro\Bundle\MessageQueueBundle\DependencyInjection\Compiler\BuildTopicMetaRegistryPass
is used to collect topic metadata intoOro\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/bootstrap/scss/nav'
*.scss
- @import "~bootstrap/scss/variables"; + @import "~@oroinc/bootstrap/scss/variables";
jsmodules.yml
# ... - bootstrap-alert$: bootstrap/js/dist/alert + bootstrap-alert$: '@oroinc/bootstrap/js/dist/alert'
- The
force
option was added to theoro:entity-extend:update-config
CLI command to avoid accidental execution of it.
- The unused service
oro_locale.repository.localization
was removed.
- Implemented support of the
inherit_data
form option for thenestedObject
data type. It allows to configure nested objects even if an entity does not have a setter method for it.
- Added
is_xml_http_request
option to the Layout context which lets you know if the current request is an ajax request. - Added two new options
onLoadingCssClass
anddisableControls
to thelayout_subtree_update
block configuration.
- Added a possibility to filter messages before they are sent to the message queue. See Filtering Messages in the Message Producer.
- Added
generate_uuid
action. The action generates UUID and puts the value to the specified attribute.
- Added migration query
Oro\Bundle\TranslationBundle\Migration\DeleteTranslationsByDomainAndKeyPrefixQuery
that can be used to remove unused translations by domain and key prefix.
- Added migration query
Oro\Bundle\WorkflowBundle\Migration\RemoveWorkflowAwareEntitiesQuery
that can be used to remove instances of entity created from the specified workflow. - Added method
Oro\Bundle\WorkflowBundle\Model\WorkflowManager::transitUnconditionally()
. The method transits a workflow item without checking for preconditions and conditions.
- The service
oro_attachment.manager.media_cache_manager_registry
was renamed tooro_attachment.media_cache_manager_registry
.[f] - The service
oro_attachment.provider.attachment_file_name_provider
was renamed tooro_attachment.provider.file_name
.[f]
- The maximum number of items can be deleted at once during mass delete process was decreased to 100.
- The service
oro_entity.virtual_field_provider.chain
was renamed tooro_entity.virtual_field_provider
.[f] - The service
oro_entity.virtual_relation_provider.chain
was renamed tooro_entity.virtual_relation_provider
.[f]
- Upgraded TinyMCE library to version 5.6.0, see migration guide
- Removed the
bdesk_photo
plugin, use the standardimage
plugin and the toolbar button instead. - Major UX changes:
- the default skin of editor 5.6.0
- popups "add link" and "add image" are not oro-themed
- fullscreen mode is actual full screen, without the page container limit like previously
- changed UX for adding embedded image
- Minor UX changes:
- editor's width is 100% by default
- status bar is turned on by default (to allow to resize the editor vertically)
- the element path is mostly turned off by default. It is turned on only in places where the status bar was enabled before
- Removed the
-
Oro\Bundle\NotificationBundle\Entity\Event
andOro\Bundle\NotificationBundle\DependencyInjection\Compiler\RegisterNotificationEventsCompilerPass
classes were deleted.To migrate custom notification events, delete all the usages of
Event
andRegisterNotificationEventsCompilerPass
classes and register events with the YAML configuration according to the documentation.
- The handling of
priority
attribute fororo_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 }
- The class
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 isOro\Bundle\QueryDesignerBundle\QueryDesigner\QueryConverterContext
. If you have own query converters, update them according to new architecture. - The class
Oro\Bundle\QueryDesignerBundle\QueryDesigner\FilterProcessor
was renamed toOro\Bundle\SegmentBundle\Query\FilterProcessor
.[f] - The service
oro_query_designer.query_designer.filter_processor
was renamed tooro_segment.query.filter_processor
.[f]
- The handling of
priority
attribute fororo.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 }
- TRIGGER database privilege became required
- The configuration option
oro_sso.enable_google_sso
was renamed tooro_google_integration.enable_sso
. - The configuration option
oro_sso.domains
was renamed tooro_google_integration.sso_domains
. - The service
oro_sso.oauth_provider
was renamed tooro_sso.oauth_user_provider
.[f]
- The name for
/api/authstatuses
REST API resource was changed to/api/userauthstatuses
. - The following changes were done in the
Oro\Bundle\UserBundle\Provider\RolePrivilegeCategoryProvider
class:[p]- the method
getPermissionCategories
was renamed togetCategories
- the method
getTabList
was renamed togetTabIds
- the following methods were removed
getAllCategories
,getTabbedCategories
,getCategory
,addProvider
,getProviders
,getProviderByName
,hasProvider
- the method
- Modules of
jquery-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.) - Moved layout themes build artefacts from
public/layout-build/{theme}
topublic/build/{theme}
folder. - Moved admin theme build artefacts from
public/build
topublic/build/admin
folder. - Changed the output path for the admin theme from
css/oro/oro.css
tocss/oro.css
. - Changed the output path for tinymce CSS entry points from
css/tinymce/*
toto 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 asoro-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/
andbundles/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 "npmassets/bootstrap/scss/variables"; + @import "~bootstrap/scss/variables"; - @import "bundles/npmassets/bootstrap/scss/variables"; + @import "~bootstrap/scss/variables";
-
To migrate the javascript code and configuration, drop
npmassets/
andbundles/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 directorypublic/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 withrequire.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;
- Package
twig/extensions
is abandoned by its maintainers and has been removed from Oro dependencies.
- The class
Oro\Bundle\ApiBundle\ApiDoc\RemoveSingleItemRestRouteOptionsResolver
and the serviceoro_api.rest.routing_options_resolver.remove_single_item_routes
were removed. Exclude theget
action inResources/config/oro/api.yml
instead.
- The service "oro.file_cache.abstract" was removed because it is not used anywhere.
- The
origin
option was removed from entity and field configuration. - The
ORIGIN_CUSTOM
andORIGIN_SYSTEM
constants were removed fromOro\Bundle\EntityExtendBundle\EntityConfig\ExtendScope
. - The
skip-origin
argument was removed from theoro:entity-extend:update-config
CLI command.
- The outdated filter
selectrow
was removed, as well asOro\Bundle\FilterBundle\Filter\SelectRowFilter
andOro\Bundle\FilterBundle\Form\Type\Filter\SelectRowFilterType
classes. - The outdated filter
many-to-many
was removed, as well asOro\Bundle\FilterBundle\Filter\ManyToManyFilter
andOro\Bundle\FilterBundle\Form\Type\Filter\ManyToManyFilterType
classes.
- The
unique_job_slug
MQ message parameter was removed fororo.importexport.pre_import
topic.
- Removed long-unused the
orosync/js/content/grid-builder
component from the layout updates.
- The
collectionField
TWIG macros was removed. Use theform_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 theadd_label
form option. - Removed
cssVariablesManager.getVariables()
method as unused, and deleted dependency on the jhildenbiddle/css-vars-ponyfill library.
- The
Oro\Bundle\UserBundle\Provider\PrivilegeCategoryProviderInterface
was removed. UseResources/config/oro/acl_categories.yml
files to configure ACL categories. - Email template
user_reset_password_as_admin
has been removed. Useforce_reset_password
instead.
- Added MultiImage and MultiField field types to Entity Manager. Read more in documentation.
- The DIC tag
oro_activity.activity_entity_delete_handler
was removed. Use decoration oforo_activity.activity_entity_delete_handler_extension
service to instead. - The interface
Oro\Bundle\ActivityBundle\Entity\Manager\ActivityEntityDeleteHandlerInterface
was removed. UseOro\Bundle\ActivityBundle\Handler\ActivityEntityDeleteHandlerExtensionInterface
instead.[p]
- The section
relations
was removed fromResources/config/oro/api.yml
. The actionget_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 inResources/config/oro/api_plain.yml
configuration files or create a processor for theget_config
action. - The
delete_handler
configuration option was removed. TheOro\Bundle\EntityBundle\Handler\EntityDeleteHandlerRegistry
class is used to get the deletion handler instead. - The class
Oro\Bundle\ApiBundle\Request\ApiActions
was renamed toOro\Bundle\ApiBundle\Request\ApiAction
.[f] - The constant
NORMALIZE_RESULT_GROUP
was removed fromOro\Bundle\ApiBundle\Processor\NormalizeResultActionProcessor
UseNORMALIZE_RESULT
constant fromOro\Bundle\ApiBundle\Request\ApiActionGroup
instead.[f] - The following classes were moved from
Oro\Bundle\ApiBundle\Config
namespace toOro\Bundle\ApiBundle\Config\Extension
:[f]- ConfigExtensionInterface
- AbstractConfigExtension
- ConfigExtensionRegistry
- FeatureConfigurationExtension
- ActionsConfigExtension
- FiltersConfigExtension
- SortersConfigExtension
- SubresourcesConfigExtension
- The following classes were moved from
Oro\Bundle\ApiBundle\Config
namespace toOro\Bundle\ApiBundle\Config\Extra
:[f]- ConfigExtraInterface
- ConfigExtraSectionInterface
- ConfigExtraCollection
- CustomizeLoadedDataConfigExtra
- DataTransformersConfigExtra
- DescriptionsConfigExtra
- EntityDefinitionConfigExtra
- ExpandRelatedEntitiesConfigExtra
- FilterFieldsConfigExtra
- FilterIdentifierFieldsConfigExtra
- FiltersConfigExtra
- MaxRelatedEntitiesConfigExtra
- MetaPropertiesConfigExtra
- RootPathConfigExtra
- SortersConfigExtra
- The following classes were moved from
Oro\Bundle\ApiBundle\Config
namespace toOro\Bundle\ApiBundle\Config\Loader
:[f]- ConfigLoaderInterface
- AbstractConfigLoader
- ConfigLoaderFactory
- ConfigLoaderFactoryAwareInterface
- ActionsConfigLoader
- EntityDefinitionConfigLoader
- EntityDefinitionFieldConfigLoader
- FiltersConfigLoader
- SortersConfigLoader
- StatusCodesConfigLoader
- SubresourcesConfigLoader
- The following classes were moved from
Oro\Bundle\ApiBundle\Metadata
namespace toOro\Bundle\ApiBundle\Metadata\Extra
:[f]- MetadataExtraInterface
- MetadataExtraCollection
- ActionMetadataExtra
- HateoasMetadataExtra
- All processors from
Oro\Bundle\ApiBundle\Processor\Config\GetConfig
andOro\Bundle\ApiBundle\Processor\Config\Shared
namespaces were moved toOro\Bundle\ApiBundle\Processor\GetConfig
namespace.[f] - The class
ConfigProcessor
was moved fromOro\Bundle\ApiBundle\Processor\Config
namespace toOro\Bundle\ApiBundle\Processor\GetConfig
namespace.[f] - The class
ConfigContext
was moved fromOro\Bundle\ApiBundle\Processor\Config
namespace toOro\Bundle\ApiBundle\Processor\GetConfig
namespace.[f] - The priority of
oro_api.validate_included_forms
processor was changed from-70
to-68
. - The priority of
oro_api.validate_form
processor was changed from-90
to-70
. - The priority of
oro_api.post_validate_included_forms
processor was changed from-96
to-78
. - The priority of
oro_api.post_validate_form
processor was changed from-97
to-80
.
- The new feature, Hot Module Replacement (HMR or Hot Reload) enabled for SCSS. To enable HMR for custom CSS links, please follow the documentation.
- The handling of
priority
attribute fororo_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 }
- The handling of
priority
attribute fororo_datagrid.extension.action.provider
andoro_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 ofcomposer.json
must be removed.If there are bower or npm dependencies (packages with names starting with
bower-asset/
ornpm-asset/
) specified in yourcomposer.json
, then do the following:- for package names starting with
npm-asset/
: remove thenpm-asset/
prefix, move the dependency to theextra.npm
section ofcomposer.json
; - for package names starting with
bower-asset/
: remove thebower-asset/
prefix, find the corresponding or alternative npm packages instead of bower packages, and add them to theextra.npm
section ofcomposer.json
.
If you have your own
package.json
with npm dependencies, then move them to theextra.npm
section ofcomposer.json
. If you need a custom script to be executed as well, then you can add your custom script to thescripts
section ofcomposer.json
. - for package names starting with
- The service
kernel.listener.nav_history_response
was renamed tooro_navigation.event_listener.navigation_history
. - The service
kernel.listener.hashnav_response
was renamed tooro_navigation.event_listener.hash_navigation
.
- The constant
SCOPE_KEY
inOro\Bundle\OrganizationBundle\Provider\ScopeOrganizationCriteriaProvider
was replaced withORGANIZATION
.[f]
- The method
getCriteriaByContext()
was removed fromOro\Bundle\ScopeBundle\Manager\ScopeCriteriaProviderInterface
. - The method
getCriteriaForCurrentScope()
inOro\Bundle\ScopeBundle\Manager\ScopeCriteriaProviderInterface
was replaced withgetCriteriaValue()
.[f] - The class
Oro\Bundle\ScopeBundle\Manager\AbstractScopeCriteriaProvider
was removed. Use direct implementation ofOro\Bundle\ScopeBundle\Manager\ScopeCriteriaProviderInterface
in your providers.
- The interface
Oro\Bundle\SecurityBundle\Authentication\Token\OrganizationContextTokenInterface
was renamed toOro\Bundle\SecurityBundle\Authentication\Token\OrganizationAwareTokenInterface
.[f] Also methodsgetOrganizationContext
andsetOrganizationContext
were renamed togetOrganization
andsetOrganization
.[f] - The class
Oro\Bundle\SecurityBundle\Exception\ForbiddenException
was removed. UseSymfony\Component\Security\Core\Exception\AccessDeniedException
instead.[f]
- The interface
Oro\Bundle\SoapBundle\Handler\DeleteHandlerInterface
was replaced withOro\Bundle\EntityBundle\Handler\EntityDeleteHandlerInterface
andOro\Bundle\EntityBundle\Handler\EntityDeleteHandlerExtensionInterface
.[p]
- The handling of
priority
attribute fororo_translation.extension.translation_context_resolver
andoro_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 }
- The constant
SCOPE_KEY
inOro\Bundle\UserBundle\Provider\ScopeUserCriteriaProvider
was replaced withUSER
.[f]
- The handling of
priority
attribute fororo.workflow.configuration.handler
andoro.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).- All
*.class
parameters for service definitions were removed from the dependency injection container.
- The
getActivityClass()
method was removed fromOro\Bundle\ActivityListBundle\Model\ActivityListProviderInterface
. Use theclass
attribute of theoro_activity_list.provider
DIC tag instead. - The
getAclClass()
method was removed fromOro\Bundle\ActivityListBundle\Model\ActivityListProviderInterface
. Use theacl_class
attribute of theoro_activity_list.provider
DIC tag instead.
- The
getName()
method was removed fromOro\Bundle\DataGridBundle\Extension\Board\Processor\BoardProcessorInterface
. Use thealias
attribute of theoro_datagrid.board_processor
DIC tag instead. - The DIC parameter
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
inResources/config/oro/datagrids.yml
, replace them toASC
andDESC
strings.[f] - The deprecated constant
Oro\Bundle\DataGridBundle\Datagrid\Builder::DATASOURCE_PATH
was removed. UseOro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::DATASOURCE_PATH
instead.[f] - The deprecated constant
Oro\Bundle\DataGridBundle\Datagrid\Builder::DATASOURCE_TYPE_PATH
was removed. UseOro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::DATASOURCE_TYPE_PATH
andOro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::getDatasourceType()
instead.[p] - The deprecated constant
Oro\Bundle\DataGridBundle\Datagrid\Builder::DATASOURCE_ACL_PATH
was removed. UseOro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::ACL_RESOURCE_PATH
andOro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::getAclResource()
instead.[p] - The deprecated constant
Oro\Bundle\DataGridBundle\Datagrid\Builder::BASE_DATAGRID_CLASS_PATH
was removed. UseOro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::BASE_DATAGRID_CLASS_PATH
instead.[f] - The deprecated constant
Oro\Bundle\DataGridBundle\Datagrid\Builder::DATASOURCE_SKIP_ACL_CHECK
was removed. UseOro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::DATASOURCE_SKIP_ACL_APPLY_PATH
andOro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::isDatasourceSkipAclApply()
instead.[p] - The deprecated constant
Oro\Bundle\DataGridBundle\Datagrid\Builder::DATASOURCE_SKIP_COUNT_WALKER_PATH
was removed. UseOro\Bundle\DataGridBundle\Datagrid\Common\DatagridConfiguration::DATASOURCE_SKIP_COUNT_WALKER_PATH
instead.[f] - The deprecated class
Oro\Bundle\DataGridBundle\Tools\GridConfigurationHelper
and serviceoro_datagrid.grid_configuration.helper
were removed.
- The
getType()
method was removed fromOro\Bundle\EntityConfigBundle\Attribute\Type\AttributeTypeInterface
. Use thetype
attribute of theoro_entity_config.attribute_type
DIC tag instead. - The deprecated class
Oro\Bundle\EntityConfigBundle\Event\PersistConfigEvent
was removed. It was replaced withOro\Bundle\EntityConfigBundle\Event\PreFlushConfigEvent
.[f] - The deprecated class
Oro\Bundle\EntityConfigBundle\Event\FlushConfigEvent
was removed. It was replaced withOro\Bundle\EntityConfigBundle\Event\PostFlushConfigEvent
.[f]
- Removed HTML field type, all HTML fields were converted to Text fields.
- The deprecated method
Oro\Component\Math\BigDecimal::withScale()
was removed. UsetoScale()
method instead.[f]
- The deprecated method
Oro\Bundle\MigrationBundle\Migration\Extension\DataStorageExtension::put()
was removed. Useset()
method instead.[f] - The deprecated constants
MAIN_FIXTURES_PATH
andDEMO_FIXTURES_PATH
were removed fromOro\Bundle\MigrationBundle\Command\LoadDataFixturesCommand
. Useoro_migration.locator.fixture_path_locator
service instead.
- The deprecated constant
Oro\Bundle\QueryDesignerBundle\Grid\Extension\OrmDatasourceExtension::NAME_PATH
was removed.
- The
getName()
method was removed fromOro\Bundle\ReminderBundle\Model\SendProcessorInterface
. Use themethod
attribute of theoro_reminder.send_processor
DIC tag instead.
- The bundle was completely removed, see tips how to migrate to Webpack builder
- The deprecated
Oro\Bundle\SoapBundle\Request\Parameters\Filter\HttpEntityNameParameterFilter
class was removed. UseOro\Bundle\SoapBundle\Request\Parameters\Filter\EntityClassParameterFilter
instead.[f]
- The deprecated method
Oro\Bundle\SecurityBundle\Owner\Metadata\OwnershipMetadataInterface::getGlobalOwnerFieldName()
was removed. UsegetOrganizationFieldName()
method instead.[f]
- The deprecated constant
Oro\Bundle\TagBundle\Grid\AbstractTagsExtension::GRID_NAME_PATH
was removed.
- The deprecated option
is_translated_group
forSymfony\Component\Form\Extension\Core\Type\ChoiceType
was removed. Usetranslatable_groups
option instead. - The deprecated option
is_translated_option
forSymfony\Component\Form\Extension\Core\Type\ChoiceType
was removed. Usetranslatable_options
option instead.
- The
getName()
method was removed fromOro\Bundle\UIBundle\ContentProvider\ContentProviderInterface
. Use thealias
attribute of theoro_ui.content_provider
DIC tag instead. - Unneeded
isEnabled()
andsetEnabled()
methods were removed fromOro\Bundle\UIBundle\ContentProvider\ContentProviderInterface
.
- The class
Oro\Bundle\ApiBundle\Request\ValueTransformer
(service ID isoro_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-managerGithub link https://github.com/jhildenbiddle/css-vars-ponyfill
- The handling of HTTP response status code
403 Forbidden
was fixed. Now this status code is returned if there are no permissions to use an API resource. Before the fix404 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. - The service
oro_api.entity_serializer.acl_filter
was renamed tooro_api.entity_serializer.field_filter
. - The method
normalizeObject
ofOro\Bundle\ApiBundle\Normalizer\ObjectNormalizer
was replaced withnormalizeObjects
.
- The approach based on
Oro\Bundle\CacheBundle\Loader\ConfigurationLoader
andOro\Component\Config\Dumper\CumulativeConfigMetadataDumper
has been replaced with the approach based onOro\Component\Config\Cache\PhpConfigProvider
.
- The interface
Oro\Component\ChainProcessor\ProcessorFactoryInterface
was replaced withOro\Component\ChainProcessor\ProcessorRegistryInterface
. - The class
Oro\Component\ChainProcessor\ChainProcessorFactory
was removed. Use the decoration to create a chain of processor registries instead.
- The methods
load()
andregisterResources()
of classOro\Component\Config\Loader\CumulativeConfigLoader
were changed to not acceptSymfony\Component\DependencyInjection\ContainerBuilder
as resources container. UseOro\Component\Config\Loader\ContainerBuilderAdapter
to adaptSymfony\Component\DependencyInjection\ContainerBuilder
toOro\Component\Config\ResourcesContainerInterface
.
-
The
Oro\Bundle\EmailBundle\Provider\EmailRenderer
was reimplemented to support computed variables. The following changes were made:- remove extending of this class from
Twig_Environment
- method
renderWithDefaultFilters
was renamed torenderTemplate
- move loading of configuration to
Oro\Bundle\EntityBundle\Twig\Sandbox\TemplateRendererConfigProvider
- move rendering of template to
Oro\Bundle\EntityBundle\Twig\Sandbox\TemplateRenderer
- move formatting of entity related variables to
Oro\Bundle\EntityBundle\Twig\Sandbox\EntityFormatExtension
- remove extending of this class from
-
The interface
Oro\Bundle\EmailBundle\Processor\VariableProcessorInterface
was moved toOro\Bundle\EntityBundle\Twig\Sandbox\VariableProcessorInterface
. The methodprocess
was changed fromprocess($variable, array $definition, array $data = [])
toprocess(string $variable, array $processorArguments, TemplateData $data): void
. This allows processors to add computed values. -
The interface
Oro\Bundle\EmailBundle\Provider\SystemVariablesProviderInterface
was moved toOro\Bundle\EntityBundle\Twig\Sandbox\SystemVariablesProviderInterface
. The methodgetVariableDefinitions
was changed fromgetVariableDefinitions()
togetVariableDefinitions(): array
. The methodgetVariableValues
was changed fromgetVariableValues()
togetVariableValues(): array
. -
The interface
Oro\Bundle\EmailBundle\Provider\EntityVariablesProviderInterface
was moved toOro\Bundle\EntityBundle\Twig\Sandbox\EntityVariablesProviderInterface
. The methodgetVariableDefinitions
was changed fromgetVariableDefinitions($entityClass = null)
togetVariableDefinitions(): array
. The methodgetVariableGetters
was changed fromgetVariableGetters($entityClass = null)
togetVariableGetters(): array
. By performance reasons new methodgetVariableProcessors(string $entityClass): array
was added. If methodgetVariableDefinitions
of your provider returns info about processors, move it togetVariableProcessors
. -
Due to the updated version of
symfony/swiftmailer-bundle
parametermailer_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 usemailer_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.
- In
Oro\Bundle\EmbeddedFormBundle\Controller\EmbeddedFormController::deleteAction
(oro_embedded_form_delete
route) action the request method was changed to DELETE. - In
Oro\Bundle\EmbeddedFormBundle\Controller\EmbeddedFormController::defaultDataAction
(oro_embedded_form_default_data
route) action the request method was changed to POST.
- In
Oro\Bundle\EntityBundle\Controller\EntitiesController::deleteAction
(oro_entity_delete
route) action the request method was changed to DELETE.
- In
Oro\Bundle\EntityConfigBundle\Controller\AttributeController::removeAction
(oro_attribute_remove
route) action the request method was changed to DELETE. - In
Oro\Bundle\EntityConfigBundle\Controller\AttributeController::unremoveAction
(oro_attribute_unremove
route) action the request method was changed to POST. - In
Oro\Bundle\EntityConfigBundle\Controller\AttributeFamilyController::deleteAction
(oro_attribute_family_delete
route) action the request method was changed to DELETE.
- In
Oro\Bundle\EntityExtendBundle\Controller\ConfigEntityGridController::removeAction
(oro_entityextend_entity_remove
route) action the request method was changed to DELETE. - In
Oro\Bundle\EntityExtendBundle\Controller\ConfigEntityGridController::unremoveAction
(oro_entityextend_field_unremove
route) action the request method was changed to POST.
- The interface
Oro\Component\EntitySerializer\Filter\EntityAwareFilterInterface
was renamed toOro\Component\EntitySerializer\FieldFilterInterface
and the following changes was made in it:- the constants
FILTER_ALL
,FILTER_VALUE
andFILTER_NOTHING
were removed - the method
checkField
was changed fromcheckField(object|array $entity, string $entityClass, string $field): int
tocheckField(object $entity, string $entityClass, string $field): ?bool
- the constants
- The class
Oro\Component\EntitySerializer\Filter\EntityAwareFilterChain
and the serviceoro_security.serializer.filter_chain
were removed. Use decoration oforo_security.entity_serializer.field_filter
and/ororo_api.entity_serializer.field_filter
services instead. - The method
setFieldsFilter
ofOro\Component\EntitySerializer\EntitySerializer
was renamed tosetFieldFilter
. - The method
transform
ofOro\Component\EntitySerializer\DataTransformerInterface
was changed fromtransform($class, $property, $value, array $config, array $context)
totransform($value, array $config, array $context)
. - The class
Oro\Component\EntitySerializer\EntityDataTransformer
was renamed toOro\Component\EntitySerializer\DataTransformer
and$baseDataTransformer
property was removed from it. - The execution of post serialize collection handlers was added to
to-one
associations; now both single item and collection post serialize handlers are executed for all types of associations. - The execution of post serialize handlers was removed for associations in case only ID field is requested for them.
- In
Oro\Bundle\ImportExportBundle\Controller\ImportExportController::importValidateAction
(oro_importexport_import_validate
route) action the request method was changed to POST. - In
Oro\Bundle\ImportExportBundle\Controller\ImportExportController::importProcessAction
(oro_importexport_import_process
route) action the request method was changed to POST. - In
Oro\Bundle\ImportExportBundle\Controller\ImportExportController::instantExportAction
(oro_importexport_export_instant
route) action the request method was changed to POST. - Introduced concept of import/export owner. Applied approach with role-based owner-based permissions to the export and import functionality.
- Option
--email
has become required fororo:import:file
command. - Removed Message Queue Topics and related Processors. All messages with this topics will be rejected:
oro.importexport.send_import_error_notification
oro.importexport.import_http_preparing
oro.importexport.import_http_validation_preparing
oro.importexport.pre_cli_import
, should be usedoro.importexport.pre_import
instead.oro.importexport.cli_import
, should be usedoro.importexport.import
instead.
- In
Oro\Bundle\IntegrationBundle\Controller\IntegrationController::scheduleAction
(oro_integration_schedule
route) action the request method was changed to POST.
- In
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.
- The class
Oro\Bundle\SecurityBundle\Filter\SerializerFieldFilter
was renamed toOro\Bundle\SecurityBundle\Filter\EntitySerializerFieldFilter
. - The service
oro_security.serializer.acl_filter
was renamed tooro_security.entity_serializer.field_filter
.
- viewportManager has been updated. Add sync with CSS breakpoint variables
- The redundant methods
getFormatterName
,getSupportedTypes
andisDefaultFormatter
were removed fromOro\Bundle\UIBundle\Formatter\FormatterInterface
. Usedata_type
attribute oforo_formatter
tag to specify the default formatter for the data type.
- API processor
oro_user.api.create.save_entity
was renamed tooro_user.api.create.save_user
.
- In
Oro\Bundle\WorkflowBundle\Controller\Api\Rest\ProcessController::activateAction
(/api/rest/{version}/process/activate/{processDefinition}
path) action the request method was changed to POST. - In
Oro\Bundle\WorkflowBundle\Controller\Api\Rest\ProcessController::deactivateAction
(/api/rest/{version}/process/deactivate/{processDefinition}
path) action the request method was changed to POST. - In
Oro\Bundle\WorkflowBundle\Controller\Api\Rest\WorkflowController::startAction
(/api/rest/{version}/workflow/start/{workflowName}/{transitionName}
path) action the request method was changed to POST. - In
Oro\Bundle\WorkflowBundle\Controller\Api\Rest\WorkflowController::transitAction
(/api/rest/{version}/workflow/transit/{workflowName}/{transitionName}
path) action the request method was changed to POST. - In
Oro\Bundle\WorkflowBundle\Controller\Api\Rest\WorkflowController::activateAction
(/api/rest/{version}/workflow/activate/{workflowName}/{transitionName}
path) action the request method was changed to POST. - In
Oro\Bundle\WorkflowBundle\Controller\Api\Rest\WorkflowController::deactivateAction
(/api/rest/{version}/workflow/deactivate/{workflowName}/{transitionName}
path) action the request method was changed to POST.
- The deprecated
route_exists
action (classOro\Bundle\ActionBundle\Condition\RouteExists
) was removed.
- All filters and sorters were removed for all "relationships" resources that returns a collection, e.g. "GET /api/countries/{id}/relationships/regions". If you need filtered or sorted data, use sub-resources instead of relationships, e.g. "GET /api/countries/{id}/regions".
- The parameter
$usePropertyPathByDefault
was removed fromgetResultFieldName
method ofOro\Bundle\ApiBundle\Processor\CustomizeLoadedData\CustomizeLoadedDataContext
.
- The possibility to define charts via ChartBundle configuration has been removed. Use
Resources/config/oro/charts.yml
instead. - Methods
getConfigs()
andgetChartConfigs()
have been removed fromOro\Bundle\ChartBundle\Model\ConfigProvider
. UsegetChartNames()
andgetChartConfig($chartName)
methods instead.
- Not used tag
oro_config.configuration_provider
has been removed.
- The
dashboards
,widgets
andwidgets_configuration
sections have been removed from DashboardBundle configuration. UseResources/config/oro/dashboards.yml
instead. - Methods
getConfigs()
,getConfig($key)
andhasConfig($key)
have been removed fromOro\Bundle\DashboardBundle\Model\ConfigProvider
.
- The
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\ServiceLinkRegistry
Oro\Component\DependencyInjection\ServiceLinkRegistryAwareInterface
Oro\Component\DependencyInjection\ServiceLinkRegistryAwareTrait
Oro\Component\DependencyInjection\Compiler\TaggedServiceLinkRegistryCompilerPass
Oro\Component\DependencyInjection\Exception\UnknownAliasException
- Layout context parameter
embedded_form_custom_layout
has been removed. Use layout updates instead.
- The
exclusions
,entity_aliases
,entity_alias_exclusions
,virtual_fields
,virtual_relations
andentity_name_formats
sections have been removed from EntityBundle configuration. UseResources/config/oro/entity.yml
instead.
- The
datasource
attribute fororo_filter.extension.orm_filter.filter
tag has been removed as it is redundant.
- The possibility to define
resources
,vendors
androutes
sections via HelpBundle configuration has been removed. UseResources/config/oro/help.yml
instead.
- The
DefaultTransportFactory
and related configuration optionoro_message_queue.transport.defaut
was removed. Checkconfig/config.yml
in your application.
- The possibility to define
menu_config
,navigation_elements
andtitles
sections via NavigationBundle configuration has been removed. UseResources/config/oro/navigation.yml
instead. - The class
Oro\Bundle\NavigationBundle\Config\MenuConfiguration
has been removed. UseOro\Bundle\NavigationBundle\Configuration\ConfigurationProvider
instead.
- The
themes
section has been removed from LayoutBundle configuration. UseResources/views/layouts/{folder}/theme.yml
instead.
- The
name_format
section has been removed from LocaleBundle configuration. UseResources/config/oro/name_format.yml
instead. - The
address_format
section has been removed from LocaleBundle configuration. UseResources/config/oro/address_format.yml
instead. - The
locale_data
section has been removed from LocaleBundle configuration. UseResources/config/oro/locale_data.yml
instead.
- The
oro_query_designer.query_designer.manager.link
service has been removed. Useoro_query_designer.query_designer.manager
service instead.
- The
datasource
attribute fororo_search.extension.search_filter.filter
tag has been removed as it is redundant. - The
entities_config
section has been removed from SearchBundle configuration. UseResources/config/oro/search.yml
instead. - Not used event
Oro\Bundle\SearchBundle\Event\BeforeMapObjectEvent
has been removed. - Deprecated DIC parameter
oro_search.entities_config
has been removed. Useoro_search.provider.search_mapping
service instead of it. - The following deprecated methods were removed from
Oro\Bundle\SearchBundle\Query\Query
:- andWhere
- orWhere
- where
- getOptions
- setMaxResults
- getMaxResults
- setFirstResult
- getFirstResult
- setOrderBy
- getOrderBy
- getOrderType
- getOrderDirection
- The deprecated trait
Oro\Bundle\SearchBundle\EventListener\IndexationListenerTrait
was removed. - The deprecated trait
Oro\Bundle\SearchBundle\Engine\Orm\DBALPersisterDriverTrait
was removed.
- The command
security:configurable-permission:load
has been removed. - Twig function
resource_granted
has been removed. Useis_granted
from Symfony instead.
- The
sidebar_widgets
section has been removed from SidebarBundle configuration. UseResources/public/sidebar_widgets/{folder}/widget.yml
instead. - The class
Oro\Bundle\SidebarBundle\Model\WidgetDefinitionRegistry
has been renamed toOro\Bundle\SidebarBundle\Configuration\WidgetDefinitionProvider
. - The service
oro_sidebar.widget_definition.registry
has been renamed tooro_sidebar.widget_definition_provider
.
- The
placeholders
andplaceholder_items
sections have been removed from UIBundle configuration. UseResources/config/oro/placeholders.yml
instead. - Deprecated option
show_pin_button_on_start_page
has been removed from UIBundle configuration. - Plugin
jquery.mCustomScrollbar
has been removed. Use styled-scroll-bar
- Message Queue Topic
oro.importexport.pre_http_import
is deprecated in favor oforo.importexport.pre_import
. - Message Queue Topic
oro.importexport.http_import
is deprecated in favor oforo.importexport.import
.
- Commands
oro:platform:upgrade20:db-configs
andoro:platform:upgrade20
were removed because they are no longer used in version 3.x. Related logic was also removed. Useoro:platform:update
instead. - Service
oro_installer.namespace_migration
and the logic that used it were removed.
- Command
oro:workflow:definitions:upgrade20
was removed because it was used for 2.x version update only.
- Added
custom_fields
as a possible value forexclusion_policy
option ofentities
section ofResources/config/oro/api.yml
. This value can be used if it is required to exclude all custom fields (fields withis_extend
=true
andowner
=Custom
inextend
scope in entity configuration) that are not configured explicitly. - Enable filters for to-many associations. The following operators are implemented:
=
(eq
),!=
(neq
),*
(exists
),!*
(neq_or_null
),~
(contains
) and!~
(not_contains
). - Added documentation about filters.
- Added data flow diagrams for public actions. See Actions.
- Added
rest_api_prefix
andrest_api_pattern
configuration options andoro_api.rest.prefix
andoro_api.rest.pattern
DIC parameters to be able to reconfigure REST API base path. - Added trigger
disposeLayout
on DOM element inlayout
AssetBundle
replaces the deprecatedAsseticBundle
to build assets using Webpack. It currently supports only styles assets. JS assets are still managed by OroRequireJsBundle.
- Added possibility to set available mime types from configuration.
To add or remove available mime types, add changes to the
upload_file_mime_types
section andupload_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
- Added Datagrid Settings functionality for flexible managing of filters and grid columns
- Added
oro.cache.abstract.without_memory_cache
that is the same asoro.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.
- Added
Oro\Bundle\SecurityBundle\Test\Functional\RolePermissionExtension
trait that can be used in functional tests where you need to change permissions for security roles.
- Added the
addBeforeActionPromise
static method ofBaseController
in JS which enables to postpone route action if the required async process is in progress.
- Changes in
/api/addresses
REST API resource:- the attribute
created
was renamed tocreatedAt
- the attribute
updated
was renamed toupdatedAt
- the attribute
- Syntax of
Resources/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 theinputs
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'
- Fixed the
depends_on
configuration option of theentities.fields
section ofResources/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. - By default processors for
customize_loaded_data
action are executed only for primary and included entities. Useidentifier_only: true
tag attribute if your processor should be executed for relationships. finish_submit
event forcustomize_form_data
action was renamed topost_validate
and newpre_validate
event was added.
- Removed loading data about currency code and currency symbols from bundle's file
./Resources/config/oro/currency_data.yml
. Now app gets this data from the Intl component byIntlNumberFormatter
. If you want to override some symbols, you can decorateOro\Bundle\LocaleBundle\Formatter\NumberFormatter::formatCurrency()
method.
- In case when message processor specified in message not found this message will be rejected and exception will be thrown.
- Renamed the service
oro_notification.event_listener.email_notification_service
tooro_notification.grid_helper
. - Marked the following services as
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. Useoro_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 tooro_security.encoder.default
.
- Changes in
/api/taxonomies
REST API resource:- the attribute
created
was renamed tocreatedAt
- the attribute
updated
was renamed toupdatedAt
- the attribute
- Changed all UI of backoffice
- Updated version of bootstrap from 2.3.0 to 4.1.1
- All global JS Views and Components are defined in the HTML through data attributes.
- Change target and name of a layout event. Now
layout
triggersinitLayout
event on DOM element insteadlayoutInit
onmediator
- Bundle was removed, use AssetBundle instead
- The event
oro_audit.collect_audit_fields
was removed. Use decoration oforo_dataaudit.converter.change_set_to_audit_fields
service instead. - The alias
oro_dataaudit.listener.entity_listener
for the serviceoro_dataaudit.listener.send_changed_entities_to_message_queue
was removed.
- Removed all logic related with column manager. The logic of column manager was transformed and expanded in Datagrid Settings
- Removed
oro.entity_config.field.after_remove
event. Useoro.entity_config.post_flush
event andConfigManager::getFieldConfigChangeSet('extend', $className, $fieldName)
method to check if a field was removed. If the change set hasis_deleted
attribute and its value is changed fromfalse
totrue
than a field was removed.
- Removed
excluded_fields
deprecated configuration attribute for an entity. Useexclude
attribute for a field instead. - Removed
result_name
deprecated configuration attribute for a field. Useproperty_path
attribute instead. - Removed
orderBy
deprecated configuration attribute. Useorder_by
attribute instead. - Removed deprecated signature
function (array &$item) : void
of post serialization handler that can be specified inpost_serialize
configuration attribute. Usefunction (array $item, array $context) : array
instead.
- Environment variable
ORO_PHP_PATH
is no longer supported for specifying path to PHP executable.
- Removed the following DIC parameters:
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
.
- The unused alias
oro_query_designer.virtual_field_provider
for the serviceoro_entity.virtual_field_provider.chain
was removed.
- Removed
oro_security.acl_helper.process_select.after
event, create Access Rule instead. - Removed
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
andOro\Bundle\SecurityBundle\ORM\Walker\AclConditionalFactorBuilder
classes because now ACL restrictions applies with Access Rules byOro\Bundle\SecurityBundle\ORM\Walker\AccessRuleWalker
. - Removed
Oro\Bundle\SecurityBundle\ORM\Walker\AclHelper::applyAclToCriteria
method. Please useapply
method with Doctrine Query or Query builder instead.
- The class
Oro\Component\Testing\Validator\AbstractConstraintValidatorTest
was removed. UseSymfony\Component\Validator\Test\ConstraintValidatorTestCase
instead.
- Removed the
loadBeforeAction
andaddToReuse
static methods ofBaseController
in JS. Global Views and Components can now be defined in the HTML over data attributes, the same way as an ordinary Page Component.
- Added
direction
option for fields in theactions
section to be able to specify if the request data and the the response data can contain a field. Possible values areinput-only
,output-only
orbidirectional
. Thebidirectional
is the default value. - Added the following operators for ComparisonFilter:
*
(exists
),!*
(neq_or_null
),~
(contains
),!~
(not_contains
),^
(starts_with
),!^
(not_starts_with
),$
(ends_with
),!$
(not_ends_with
). For details see how_to.md. - Added the
case_insensitive
andvalue_transformer
options for ComparisonFilter. See how_to.md for more details. - Added a possibility to enable custom API. See how_to.md for more information.
-
The
oro_api.get_config.add_owner_validator
service was renamed tooro_organization.api.config.add_owner_validator
-
The
oro_api.request_type_provider
DIC tag was renamed tooro.api.request_type_provider
-
The
oro_api.routing_options_resolver
DIC tag was renamed tooro.api.routing_options_resolver
-
The
oro_api.api_doc_annotation_handler
DIC tag was renamed tooro.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
- Twig filter
oro_tag_filter
was renamed tooro_html_strip_tags
. See documentation.
- The
oro_rest_api_get_user_profile
route was removed; use theoro_rest_api_user_profile
route instead. - The
Oro\Bundle\UserBundle\Api\Routing\UserProfileRestRouteOptionsResolver
and theOro\Bundle\UserBundle\Api\ApiDoc\UserProfileRestRouteOptionsResolver
route option resolvers were removed in favor of routing.yml.
- Removed deprecated routes contain
_format
placeholder. - Removed the deprecated
Oro\Bundle\ApiBundle\Processor\CustomizeLoadedDataContext
class - Removed the deprecated
Oro\Bundle\ApiBundle\Model\EntityDescriptor
class
- Removed the deprecated
getDefaultTimeout
andsetDefaultTimeout
methods from theOro\Bundle\EntityConfigBundle\Tools\CommandExecutor
class
- Removed the
Oro\Bundle\ImportExportBundle\EventListener\ExportJoinListener
class and the correspondingoro_importexport.event_listener.export_join_listener
service - The
%oro_importexport.file.split_csv_file.size_of_batch%
parameter was removed; use%oro_importexport.import.size_of_batch%
instead.
- Removed the deprecated
getDefaultTimeout
andsetDefaultTimeout
methods from theOro\Bundle\InstallerBundle\CommandExecutor
class
- Removed twig filter
oro_html_tag_trim
; useoro_html_escape
instead. See documentation. - Removed twig filter
oro_html_purify
; useoro_html_strip_tags
instead. See documentation.
- Removed the
oro_workflow.cache.provider.workflow_definition
cache provider. Doctrine result cache is used instead.
- Added the configuration search provider functionality (see documentation)
- Service should be registered as a service with the
oro_config.configuration_search_provider
tag. - Class should implement
Oro\Bundle\ConfigBundle\Provider\SearchProviderInterface
interface.
- Service should be registered as a service with the
- Added the
oro_entity.structure.options
event (see documentation) - Added the
Oro\Bundle\EntityBundle\Provider\EntityStructureDataProvider
provider to retrieve data of entities structure (see documentation) - Added JS
EntityModel
[?] (see documentation) - Added JS
EntityStructureDataProvider
[?] (see documentation) - Added
FieldChoiceView
[?] Backbone view, as replacement for jQuery widgetoroentity.fieldChoice
.
- The
Oro\Bundle\EntityExtendBundle\Tools\ExtendHelper::convertName
method was renamed toconvertEnumNameToCode
, visibility of this method was changed frompublic
toprivate
and it will throw an exception when theiconv
function fails on converting the input string, instead of hashing the input string.
- Added a new DIC compiler pass
Oro\Bundle\PlatformBundle\DependencyInjection\Compiler\ConsoleGlobalOptionsCompilerPass
- Added the
oro_platform.console.global_options_provider
tag to be able to register the console command global options provider forGlobalOptionsProviderRegistry
[?] and it will be used inGlobalOptionsListener
[?]. This providers must implementGlobalOptionsProviderInterface
[?].
- Added
FunctionChoiceView
[?] Backbone view, as replacement for jQuery widgetoroquerydesigner.functionChoice
.
- Added
SegmentChoiceView
[?] Backbone view, as replacement for jQuery widgetorosegment.segmentChoice
.
- Added JS
Registry
[?] (see documentation)
-
The
build_query
group was removed fromupdate
anddelete
actions. From now the updating/deleting entity is loaded byOro\Bundle\ApiBundle\Processor\Shared\LoadEntity
processor instead ofOro\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 fromtrue
tofalse
. This was done to allow filter data if a string field contains a comma.
- Parameter
count_hints
will have value ofhints
unless otherwise specified. If other words from now
datagrids:
grid-name:
...
source:
...
hints:
- SOME_QUERY_HINT
equivalent
datagrids:
grid-name:
...
source:
...
hints:
- SOME_QUERY_HINT
count_hints:
- SOME_QUERY_HINT
- Refactored the
SegmentComponent
js-component to useEntityStructureDataProvider
.
- In the
Oro\Bundle\SidebarBundle\Model\WidgetDefinitionRegistry
class, the return type in thegetWidgetDefinitions
andgetWidgetDefinitionsByPlacement
methods were changed fromArrayCollection
toarray
.
- The
loadModules
method of the'oroui/js/tools'
js-module now returns a promise object.- the element path is mostly turned off by default. It is turned on only in places where the status bar was enabled before. (edited)
[f] - Fully covered with oro/upgrade-toolkit
[p] - Partially covered with oro/upgrade-toolkit