Upgrade Notes
10.6.0
- [Assets] Deprecated
Import from ServerandImport from URLAdmin UI options for adding assets. They will be removed in Pimcore 11. - [Naming] Deprecated master, blacklist and whitelist. Instead, use main, blocklist, allowlist. As an example,
webmastertoolswere renamed togoogle_search_console. - [Storage config] Deprecated setting write targets and storage directory in the .env file. Instead, use the symfony config
- [Session] The
getHandler,setHandler,useSession,getSessionId,getSessionName,invalidate,regenerateId,requestHasSessionId,getSessionIdFromRequest,get,getReadOnlyandwriteClosemethods ofPimcore\Tool\Sessionand classPreAuthenticatedAdminSessionFactoryare deprecated and get removed with Pimcore 11. Session Management will be handled by Symfony in Pimcore 11. - [AreabrickManagerInterface] The
enable,disable,isEnabledandgetStatemethods ofPimcore\Extension\Document\Areabrick\AreabrickManagerInterfaceare deprecated as maintaining state of extensions is deprecated. This impacts\Pimcore\Document\Editable\EditableHandler::isBrickEnabled()method which is also deprecated. - [Twig] Pimcore now requires the
twig/extra-bundlewhich eases the usage of Twig's "extra" extensions. - [UrlSlug] Deprecated
$indexproperty and its getter and setter methods as they were not being used. These will be removed in Pimcore 11. - [DataObject]: Since the
o_prefix will be removed in Pimcore 11, a new method has been added:DataObject\Service::getVersionDependentDatabaseColumnName(). This method will return the field/column name for the current version and provide a way to support both version for bundles. E.g. passingo_idin Pimcore 10 will returno_id, butidin Pimcore 11. - [Ecommerce] Elasticsearch 7 support has been deprecated, elasticsearch 8 supported was added.
- [CustomLayout] Passing
inttosetDefaultis deprecated and will be removed in Pimcore 11. Use typeboolinstead. Same forgetDefaultmethod, it will return typeboolonly in Pimcore 11. - [DataObjects] Traits
ColumnTypeandQueryColumnTypeare deprecated. These will be removed in Pimcore 11. - [ClassSavedInterface] Introduced additional interface implementing the
classSavedmethod. The interface will be used by field definitions inPimcore\Model\DataObject\ClassDefinition\Data\*. If your custom field definition implements theclassSavedmethod, please use theClassSavedInterfaceinterface. Make sure that you either provide a default value (e.g.$params = []) for$paramsor don't use a second parameter in the method signature at all. Note that using theclassSavedmethod without implementing the interface is deprecated and won't work in Pimcore 11. - [DataObject]: The usage of
getO_orsetO_methods is deprecated. The BC layer supporting these methods will be removed in Pimcore 11. - [Classification Store] Deleting the data from deleted groups and keys.
- [Commands] Calling
configureParallelizationonParallelizationtrait is deprecated and will be removed in Pimcore 11. Please callParallelization::configureCommandinstead. - [Console] Trait
ConsoleCommandPluginTraitis deprecated and will be removed in Pimcore 11. - [Events] Event
pimcore.element.note.postAddhas been deprecated. Usepimcore.note.postAddinstead. Note: The event type changed fromElementEventtoModelEvent. - [Document] Deprecated loading documents via fixed namespace only. It will be removed in Pimcore 11. Use
pimcore:type_definitionsinstead. - [Annotations] Using Annotations
@ResponseHeader&@ParamConverter,@Templateand rest from SensioFrameworkExtraBundle is deprecated and will not be supported on Pimcore 11. Use#[ResponseHeader],#[DataObjectParam]argument,#[Template]and other attributes instead. - [Asset] Deprecated VR Preview. For details please see #14111.
- [Authentication] The method
Pimcore\Tool\Authentication::authenticateHttpBasic()has been deprecated and will be removed in Pimcore 11. - [Authentication] The method
Pimcore\Tool\Authentication::authenticatePlaintext()has been deprecated and will be removed in Pimcore 11. - [Authentication] It is now possible to configure the password algorithm and its options that Pimcore uses for its backend users and your objects that contain a password field.
pimcore: security: password: algorithm: !php/const PASSWORD_BCRYPT options: cost: 13 - [Google] Classes
Google\CseandGoogle\Cse\Itemare deprecated and will be removed in Pimcore 11. - [Document] Deprecated the
HTML-Tagsfield under theSEO & Settingspanel of Document/Page,setMetaData()andgetMetaData() - [Document] The
HTML-Tags(document metadata) field under SEO & Settings panel is now only visible and editable by Admin users`. - [Thumbnails] Using Callable in Asset thumbnail transformations is deprecated and will not work in Pimcore 11.
- [Thumbnails] Deprecated the usage of
$thumbnail->getPath(false)by passing boolean parameters, use$thumbnail->getPath(["deferredAllowed" => false]);and pass an array instead. Added the possibility to get the frontend path by addingfrontend => trueinto the array, useful in console commands. - Marked
Pimcore\Model\User\AbstractUserandPimcore\Model\User\UserRoleclasses as abstract via php doc. It will be natively abstract in Pimcore 11. - [Bundles] Deprecated
getJsPaths,getCssPaths,getEditmodeJsPathsandgetEditmodeCssPathsin thePimcoreBundleInterface. These methods will be provided by the newPimcoreBundleAdminClassicInterface. - [Web2print] Deprecated
HeadlessChromeprocessor, it will be removed and replaced byChromiumprocessor (which doesn't require NodeJS to work) in Pimcore 11. - [Database] Deprecated
Pimcore\Db\Helper::insertOrUpdate()method, please usePimcore\Db\Helper::upsert()instead. - [Events] The
SEARCH_LIST_BEFORE_FILTER_PREPARE,SEARCH_LIST_BEFORE_LIST_LOAD,SEARCH_LIST_AFTER_LIST_LOAD,QUICKSEARCH_LIST_BEFORE_LIST_LOADandQUICKSEARCH_LIST_AFTER_LIST_LOADevents fromPimcore\Bundle\AdminBundle\Event\AdminEventsare deprecated and wont't work in Pimcore 11. Please usePimcore\Bundle\SimpleBackendSearchBundle\Event\AdminSearchEventsin Pimcore 11. - Deprecated
getJsPaths,getCssPaths,getEditmodeJsPathsandgetEditmodeCssPathsinAbstractPimcoreBundle. Please use thePimcoreBundleAdminClassicInterfaceand theBundleAdminClassicSupportTraitinstead. - [Events] Deprecated Admin Event classes (below), please use these classes from AdminBundle instead.
-
Pimcore\Event\AdminEvents -
Pimcore\Event\Admin\AdminStyleEvent -
Pimcore\Event\Admin\IndexActionSettingsEvent -
Pimcore\Event\Admin\Login\* -
Pimcore\Event\Model\AssetDeleteInfoEvent -
Pimcore\Event\Model\DocumentDeleteInfoEvent -
Pimcore\Event\Model\ObjectDeleteInfoEvent -
Pimcore\Event\Model\ElementDeleteInfoEventInterface
-
- [Extension Manager] Trait
StateHelperTraitis deprecated and will be removed in Pimcore 11. - [Configuration] Deprecated
hide_edit_image&disable_tree_previewconfigs, they will be moved topimcore_adminin Pimcore 11pimcore_admin: assets: hide_edit_image: false disable_tree_preview: true - [Link Editable] The "attributes" field in the "advanced" tab is deprecated. The field will be removed in Pimcore 11 due to security reasons.
- [Admin]
AdminController&AdminControllerInterfacehas been deprecated and will be removed in Pimcore 11. Please useUse Pimcore\Controller\UserAwareControllerinstead, with following method calls:- call
getPimcoreUser()instead ofgetAdminUser() - call
JsonHelperTrait::jsonResponse()instead ofadminjson() - [Security] Deprecated Security User classes in favor of Pimcore core classes:
-
Pimcore\Bundle\AdminBundle\Security\User=>Pimcore\Security\User -
Pimcore\Bundle\AdminBundle\Security\User\UserChecker=>Pimcore\Security\User\UserChecker -
Pimcore\Bundle\AdminBundle\Security\User\UserProvider=>Pimcore\Security\User\UserProvider -
Pimcore\Bundle\AdminBundle\Security\User\UserLoader=>Pimcore\Security\User\UserLoader -
Pimcore\Bundle\AdminBundle\Security\User\TokenStorageUserResolver=>Pimcore\Security\User\TokenStorageUserResolver
-
-
pimcore_admin.serializerservice has been deprecated and will be removed in Pimcore 11. Please usepimcore.serializerinstead.
- call
- [DataObjects] - Deprecated Button control for DataObjects layout definition. It will be removed in Pimcore 11. You can define your own custom layout component to replace this element like described here
10.5.21
- [Assets] The Asset
Import from Serverfeature is now only available for admins. It will be removed in Pimcore 11 - [Editable] Removed all
on*attributes from the$allowedAttributeslist due to security reasons. These attributes are not allowed anymore in the "attributes" field.
10.5.13
- [Web2Print] Print document twig expressions are now executed in a sandbox with restrictive security policies (just like Sending mails and Dataobject Text Layouts introduced in 10.5.9).
10.5.10
- [DataObject] Deprecated: Loading non-Concrete objects with the Concrete class will not be possible in Pimcore 11.
10.5.9
- [Twig] Sending mails and Dataobject Text Layouts, which allow rendering user controlled twig templates are now executed in a sandbox with restrictive security policies for tags, filters, functions.
Please use following configuration to allow more in template rendering:
pimcore: templating_engine: twig: sandbox_security_policy: tags: ['if'] filters: ['upper'] functions: ['include', 'path', 'range']
10.5.8
- [Nginx] Static pages nginx config has been updated to fix the issue for home static page generation. please adapt the following configuration:
map $args $static_page_root {
default /var/tmp/pages;
"~*(^|&)pimcore_editmode=true(&|$)" /var/nonexistent;
"~*(^|&)pimcore_preview=true(&|$)" /var/nonexistent;
"~*(^|&)pimcore_version=[^&]+(&|$)" /var/nonexistent;
}
map $uri $static_page_uri {
default $uri;
"/" /%home;
}
.....
location / {
error_page 404 /meta/404;
try_files $static_page_root$static_page_uri.html $uri /index.php$is_args$args;
}
10.5.0
-
[Class Definitions] Resolving classes or services will no longer catch exceptions in Pimcore 11. Remove invalid references from class definitions.
-
[Sessions] Changed default value for
symfony.session.cookie_securetoauto -
[Listings]
JsonListingclass is deprecated. Please useCallableFilterListingInterface,FilterListingTraitandCallableOrderListingInterface,OrderListingTraitinstead. For examples please see existing classes, e.g.Pimcore\Model\Document\DocType\Listing. -
[Security] It is recommended to use new Authenticator based system for authentication/authorization. To use new authenticator, add following symfony config in
security.yaml:security: enable_authenticator_manager: true[Authentication] PreAuthenticatedAdminSessionListenerhas been deprecated and will be removed in Pimcore 11. -
[Elements] Calling the methods
getByIdandgetByPathonAsset,Document,DataObjectwith second boolean parameter$forceandElement\Service::getElementByIdwith third boolean parameter$forceis deprecated and will throw exception in Pimcore 11. Instead pass the parameter as associative array with$forcevalue. e.g. BeforeAsset::getById($id, true); Document::getById($id, true); DataObject::getById($id, true); Asset::getByPath($path, true); Document::getByPath($path, true); DataObject::getByPath($path, true); Element\Service::getElementById::getElementById($type, $id, $true);After
Asset::getById($id, ['force' => true]); Document::getById($id, ['force' => true]); DataObject::getById($id, ['force' => true]); Asset::getByPath($path, ['force' => true]); Document::getByPath($path, ['force' => true]); DataObject::getByPath($path, ['force' => true]); Element\Service::getElementById($type, $id, ['force' => true]); -
[Navigation Builder] Calling the method
Pimcore\Navigation\Builder::getNavigation()using extra arguments is deprecated and will be removed in Pimcore 11. Instead of using the extra arguments, it is recommended to call the method using the params array. eg: Currently, thegetNavigation()method can be called by passing the config paramsactiveDocument,navigationRootDocument,htmlMenuIdPrefix,pageCallback,cache,maxDepth,cacheLifetimeandmarkActiveTrailas the arguments i.egetNavigation($activeDocument, $navigationRootDocument, $htmlMenuIdPrefix, $pageCallback, $cache, $maxDepth, $cacheLifetime, $markActiveTrail). According to the new implementation you should call the method likegetNavigation($params)where$paramsshould be an associative array with the keysactive,root,htmlMenuPrefix,pageCallback,cache,maxDepth,cacheLifetimeandmarkActiveTrail. -
[Runtime Cache] The trait
\Pimcore\Cache\RuntimeCacheTraithas been deprecated because of its ambiguous naming and usage of persisted cache along with the runtime object cache. It is recommended to use\Pimcore\Cache\RuntimeCacheinstead of this trait. For persisted cache, please use\Pimcore\Cacheinstead. -
[Sitemap] Pimcore is now also supporting Presta/Sitemap
^3.2(which supports Symfony 6 and uses max level of PHPStan). Please note, if the routing import config is in use, it is recommended to correct the config path (by removing/Resources) to follow the new folder tree structure, eg. "@PrestaSitemapBundle/~~Resources/~~config/routing.yaml", to ensure a smoother upgrade to upcoming major release. -
[Backend search]
keyandindexcolumns have been added to the search index. Run./bin/console pimcore:search-backend-reindexto reindex. -
[Cache] Pimcore use DoctrineDbalAdapter instead of PdoAdapter by default now.
-
Removed
ocramius/package-versionsdependency. If you rely on it, please add it to your owncomposer.json. -
[Permissions] Added an extra check about system permission in element
isAllowed()method, please make sure your custom implementations are not affected by this change. Listing, grid, tree view are not severely affected as the main permission is checked on a Kernel event level that prevents the page to be shown and prevents any process that iterate isAllowed() calls. The only cases could be affected are those where the workspace are set but main permissions are disallowed, before this change, it could lead to (not intended) false positive. -
[Security/User]
UsernameNotFoundException(deprecated since Symfony 5.3) occurences have been replaced withUserNotFoundException. -
[Deprecated] Generate type declarations option in class definition is deprecated, because type declarations will always be added with Pimcore 11
-
[Application Logger] File Objects are now stored in the flysystem. Due some incompatibilities of checking files by modification date (cloud storages) and for performance issues (scan folders/file), the cleanup task now do not run in time range from midnight and 4 a.m. anymore, but it deletes the file matching the column in the database as soon as the database entries are archived.
-
[Session] Implementing Session Configurator with tag
pimcore.session.configuratorto register session bags, is deprecated and will be removed in Pimcore 11. Implement an EventListener to register a session bag before the session is started. -
[Ecommerce][PricingManager] Token condition is deprecated and will be removed in Pimcore 11.
-
Parameter
pimcore.admin.session.attribute_bagsis deprecated and will be removed in Pimcore 11. -
[JS Events/Disabled] The plugin broker for fire events has been disabled. The plugins are still supported, but they are deprecated and will be removed in Pimcore 11
Please use event listener instead of plugins for JS events. -
Extension Manager - Registering or managing bundles/areabricks through
Tools -> Bundles & Bricksor manually throughvar/config/extensions.phpis deprecated and will not work on Pimcore 11. Please useconfig/bundles.phpto register/manage bundles instead. -
[Web2Print] Wkhtmltopdf Processor has been deprecated and will be removed in Pimcore 11. Please use HeadlessChrome or PDFreactor instead.
-
[Config]
Pimcore\Config\Confighas been deprecated and will be removed in Pimcore 11. -
The recommended nginx config for static pages has been updated (the old one still works!) from
server { ... location @staticpage{ try_files /var/tmp/pages$uri.html $uri /index.php$is_args$args; } location / { error_page 404 /meta/404; error_page 418 = @staticpage; if ($args ~* ^(?!pimcore_editmode=true|pimcore_preview|pimcore_version)(.*)$){ return 418; } try_files $uri /index.php$is_args$args; } ... }to
map $args $static_page_root { default /var/tmp/pages; "~*(^|&)pimcore_editmode=true(&|$)" /var/nonexistent; "~*(^|&)pimcore_preview=true(&|$)" /var/nonexistent; "~*(^|&)pimcore_version=[^&]+(&|$)" /var/nonexistent; } server { ... location / { error_page 404 /meta/404; try_files $static_page_root$uri.html $uri /index.php$is_args$args; } ... } -
[Elements] Deprecated setting the parent id to 1 (root node), when an element with a non-existing parent id gets created.
-
[Custom Layouts] Deprecated Class
ClassLayoutDefinitionManagerand constantPIMCORE_CUSTOMLAYOUT_DIRECTORY. -
[Workflows] Deprecated classes Pimcore\Model\Workflow, Pimcore\Model\Workflow\Dao, Pimcore\Model\Workflow\Listing\Dao and Pimcore\Model\Workflow\Listing. Please check the documentation on how to work with workflows: Workflow Management.
-
[Maintenance] Deprecated passing
--forceoption to maintenance command. -
[Exception]
MissingDependencyExceptionhas been deprecated and will be removed in Pimcore 11.
10.4.2
- When maintenance mode is active, all commands are prevented from starting (not just commands inheriting from
AbstractCommand). Until now, some commands (e.g.messenger:consume) could be executed even if the system was in maintenance mode. To circumvent, use--ignore-maintenance-modeoption, which is available to all commands.
10.4.0
-
Important: The folder structure for storing thumbnails changed, please run
bin/console pimcore:migrate:thumbnails-folder-structureafter the update to copy existing thumbnails to new folder structure. If you're dealing with a huge amount of thumbnails you should consider that this change might increase the load on your system as well as page-loading times during the migration command is executed, as non-existing thumbnails are then generated on demand. - [Image Optimizer] Optimize Image messages are now routed to different queue
instead of
pimcore_core. If you want to handle image optimize messages, then it is required to add specific optionpimcore_image_optimizeto the commandbin/console messenger:consume pimcore_core pimcore_maintenance pimcore_image_optimize. Also run commandbin/console messenger:consume pimcore_corebefore the upgrade, so that ImageOptimize messages on the queue gets consumed. -
Important: [Object bricks] A call to the object brick´s getter method no longer returns object bricks marked for deletion.
To restore the original behavior pass "true" to the getter method´s
$includeDeletedBricksargument. - [Image Optimizer] Image Optimizer services (e.g. PngCrushOptimizer, JpegoptimOptimizer etc.) are deprecated and will be
removed in Pimcore 11. Use Pimcore\Image\Optimizer\SpatieImageOptimizer service instead.
Currently, the existing optimizers are disabled. If you still want to use them, please re-enable them by tagging the services accordingly (in your
services.yaml):
Pimcore\Image\Optimizer\CjpegOptimizer:
tags:
- { name: pimcore.image.optimizer }
Pimcore\Image\Optimizer\JpegoptimOptimizer:
tags:
- { name: pimcore.image.optimizer }
Pimcore\Image\Optimizer\PngCrushOptimizer:
tags:
- { name: pimcore.image.optimizer }
- [Elements] Fixed the behavior of
setId()method, so not to cast null Id to 0 as explained below:
$object = new \Pimcore\Model\DataObject();
$object->setId(null);
//before:
$oldId = $object->getId(); //returns 0
//after:
$newId = $object->getId(); //returns null
- [Asset] Deprectaed the
marshal()/unmarshal()methods for metadata, usenormalize()/denormalize()methods instead.
10.3.0
-
Important: [Symfony Messenger] Pimcore Core & Maintenance messages are now routed to different queues instead of default. It is
required to run command
bin/console messenger:consume pimcore_core pimcore_maintenancebefore the upgrade, so that the messages on default queue gets consumed. -
Important: In preparation of upgrade to Symfony 6, return types must be added to methods which are extended from Symfony. In Pimcore, following changes are applied:
- Return type added to safe methods, which are
final& marked asinternal. - Return type hints are added as comments on the methods which are extendable and phpdocs are updated. These return types will be introduced in Pimcore 11. You must add return types, if you're extending any of these Pimcore classes. Please check changes here
- Return type added to safe methods, which are
- [Documents] Introduced additional interfaces for editable methods
getDataEditmode(),rewriteIds()&load(). Existingmethod_existscalls are deprecated and will be removed in Pimcore 11. - [Data objects] Default values now get saved to versions -> Restoring a version also restores the default values (before those fields were null after restoring)
- Method
create()fromPimcore\Model\DataObject\Classificationstore\CollectionGroupRelationandPimcore\Model\DataObject\Classificationstore\KeyGroupRelationno longer saves the new object, but just returns the instance. Related changes can be found here: https://github.com/pimcore/pimcore/pull/11326/files - Method
Kernel::getRootDir()is deprecated, useKernel::getProjectDir()instead. For more details, please check 10923.
10.2.0
- [Maintenance] Maintenance tasks are now handled with Symfony Messenger. The
pimcore:maintenancecommand will add the maintenance messages to the bus and runs them afterwards immediately from the queue. However it's recommended to setup independent workers that process the queues, by runningbin/console messenger:consume pimcore_core pimcore_maintenance(using e.g. Supervisor) and adding--asyncoption to thepimcore:maintenancecommand that stops the maintenance command to process the queue directly. Details about setting it up for production environments, please check Symfony Messenger Component docs. - [Maintenance] Image Optimizer maintenance task moved to Messages which are consumed by Symfony Messenger. If you want to disable the image optimization, please add config to avoid dispatching the messages on messenger bus:
pimcore:
assets:
image:
thumbnails:
image_optimizers:
enabled: false
- [Configs] The default storage for configurations is now
yamlfiles in thevar/configdirectory and are loaded as Symfony Config. The oldphpconfig-files continue to work, however, changes on existing configurations as well as new configurations are written toyaml.
Important notice: writing configs toyamlis only supported if the kernel is in debug mode, because changes of the config need a rebuild of the container configuration.
If you require to change the config on production environments we recommend to change the storage tosettings-storeas described here. - [Asset] Pimcore now automatically supports AVIF image format for thumbnails using
autoformat (onlyImagick). To disable AVIF please follow this instructions. - [DataObject API] There is change in behavior when validating the inherited dataobjects & variants. As before, the inherited object gets saved with invalid attribute value, if the parent object has a valid value for the same attribute. Now, the API will throw validation exception, if the inherited object has an invalid value. please see https://github.com/pimcore/pimcore/pull/10529
10.1.0
- [Core] Additional interfaces for data-types introduced. Existing
method_existscalls are deprecated and will be removed in Pimcore 11. - [InstallBundle] Installer preconfiguration path changed from
app/config/installer.ymltoconfig/installer.yaml. - [Core] composer.json:
symfony/symfonypackage requirement has been replaced bysymfony/*individual bundles. Note for Bundles: if you are usingsymfony/symfonydependency, it will now conflict with packagepimcore/pimcore. Please move your bundle requirements to Symfony individual component packages. -
[Ecommerce][TrackingManager] event name in method
trackCheckoutComplete()changed fromcheckouttopurchaseforGoogleTagManagerimplementation. - [Glossary]
pimcoreglossary()tag has been deprecated in favor ofpimcore_glossaryTwig filter and will be removed in Pimcore 11. - Bumped
google/apiclientto 2.10 version - Use proper namespaces for API references. - Bumped
endroid/qr-codeto version 4. - The
\Pimcore\Routing\Dynamic\DocumentRouteHandler::addDirectRouteDocumentType()method is deprecated, usepimcore.routing.direct_route_document_typesconfig instead. -
[Ecommerce][TrackingManager] event name in method
trackCheckoutComplete()changed fromcheckouttopurchaseforGoogleTagManagerimplementation - [Password encoding] Pimcore Password Encoder factory has been deprecated in favor of new Password Hasher factory, to align with Symfony authentication system. The default factory is used as default and to switch to new Password hasher factory, please enable through config
factory_typeas follows:
pimcore:
security:
factory_type: password_hasher
# the password hasher factory as defined in services.yml
password_hasher_factories:
App\Model\DataObject\User: website_demo.security.password_hasher_factory
and use new service handler:
services:
website_demo.security.password_hasher_factory:
class: Pimcore\Security\Hasher\Factory\UserAwarePasswordHasherFactory
arguments:
- Pimcore\Security\Hasher\PasswordFieldHasher
- ['password']
- [Session] Default setting for
framework.session.cookie_samesitechanged tostrict. For more information about the possible impact on your project, please have a look at the docs of set-cookie. If you prefer to stay on the old session cookie behavior, please add the following to your project configuration:
framework:
session:
cookie_samesite: 'lax'
10.0.0
System Requirements
- PHP >= 8.0
- Apache >= 2.4
Database
- MariaDB >= 10.3
- MySQL >= 8.0
- Percona Server (supported versions see MySQL)
Changes
-
Bumped
symfony/symfonyto "^5.2.0". Pimcore X will only support Symfony 5. -
ExtJS bumped to version 7.
-
Bumped:
-
guzzlehttp/guzzleto "^7.2" -
sensio/framework-extra-bundleto "^6.1" -
twig/twigto "^3.0" -
egulias/email-validatorto "^3.0.0" -
onnov/detect-encodingto "^2.0" -
mjaschen/phpgeoto "^3.0" -
matomo/device-detectorto "^4.0" -
ext-imagickto "^3.4.0" (suggest) -
lcobucci/jwtto "^4.0"
-
-
Pimcore\Model\DataObject\ClassDefinition\Data::isEqual()has been removed. For custom data types, implement\Pimcore\Model\DataObject\ClassDefinition\Data\EqualComparisonInterfaceinstead. -
Pimcore\Model\Document\Editable(former.Tags) properties visibility changed fromprotectedtoprivate. -
[Templating]
- PHP templating engine (including templating helpers & vars) has been removed to support Symfony 5. Use Twig or Php Templating Engine Bundle(enterprise) instead.
- Removed ViewModel.
- Removed Auto view rendering.
- Removed Placeholder support. Use Twig Parameters instead.
-
Pimcore\Model\Tool\Tracking\Eventhas been removed. -
Pimcore\Tool\Archivehas been removed. -
The object query table will now consider the fallback language. If you want to keep the old behavior set
pimcore.objects.ignore_localized_query_fallbackin your configuration. -
Removed QR Codes.
-
Remove Linfo Integration.
-
[Ecommerce][IndexService] Removed FactFinder integration.
-
Removed
Pimcore\Model\Tool\Lock. -
Removed HybridAuth integration.
-
Removed
Pimcore\Model\Document\Tag\*classes. UsePimcore\Model\Document\Editable\*classes instead. -
Removed
pimcore_tag_css classes, usepimcore_editable_css instead. -
Removed REST Webservice API.
-
Removed Legacy Service aliases.
-
[Document] Removed support for edit.php on Area-Bricks. Use new feature: Editable Dialog Box instead.
-
[Glossary] Removed support for
Acronym. UseAbbrinstead. -
[Element] Added
setProperties()andsetProperty()methods toPimcore\Model\Element\ElementInterface. -
[Element]
setProperty()method param$inheritabledefaults to false. Adding a new property will create a non-inheritable property for documents. -
[Document] Removed Editable Naming Strategy Support.
-
Removed Cookie Policy Info Bar Integration.
-
Removed
\Pimcore\Browserclass. Use\Browserinstead. -
Method signature
PageSnippet::setEditable(string $name, Editable $data)has been changed toPageSnippet::setEditable(Editable $editable). -
Removed Tag & Snippet Management.
-
Removed
Pimcore\Controller\EventedControllerInterface. UsePimcore\Controller\KernelControllerEventInterfaceandPimcore\Controller\KernelResponseEventInterfaceinstead. -
Doctrine dependencies bumped to latest major version:
- "doctrine/common": "^3.0.0"
- "doctrine/inflector": "^2.0.0"
-
Removed service
pimcore.implementation_loader.document.tag. UsePimcore\Model\Document\Editable\Loader\EditableLoaderinstead. -
Removed Pimcore Bundles generator and command
pimcore:generate:bundle. -
Pimcore\Controller\Controllerabstract class now extendsSymfony\Bundle\FrameworkBundle\Controller\AbstractControllerinstead ofSymfony\Bundle\FrameworkBundle\Controller\Controller. -
Pimcore\Translation\Translator::transChoice()&Pimcore\Bundle\AdminBundle\Translation\AdminUserTranslator::transChoice()methods have been removed. Usetrans()method with%count%parameter. -
Removed
pimcore.documents.create_redirect_when_movedconfig. Please remove from System.yml. -
Removed
pimcore.workflows.initial_placeconfig. Usepimcore.workflows.initial_markingsinstead. -
WebDebugToolbarListenerPasshas been removed andWebDebugToolbarListenerhas been marked as final & internal. -
Bumped
sabre/davto ^4.1.1 -
Removed
Pimcore\Model\Element\Reference\Placeholderclass. -
Removed
pimcore.routing.defaults. Usepimcore.documents.default_controllerinstead. -
Removed
\Pimcore\Tool::getRoutingDefaults(),PageSnippet::$module|$action|get/setAction()|get/setModule(),DocType::$module|$action|get/setAction()|get/setModule(),Staticroute::$module|$action|get/setAction()|get/setModule(). -
Removed
\Pimcore\Tool::getValidCacheKey/(), usepreg_replace('/[^a-zA-Z0-9]/', '_', $key)instead. -
Removed
\Pimcore\Tool::isValidPath/(), use\Pimcore\Model\Element\Service::isValidPath()instead. -
Deprecated
\Pimcore\Model\Element\Service::getSaveCopyName(), usegetSafeCopyName()instead. -
Deprecated methods
getObject()andsetObject()on the classes\Pimcore\Model\Document\Linkand\Pimcore\Model\DataObject\Data\Link, usegetElement()andsetElement()instead. -
Using dynamic modules, controllers and actions in static routes (e.g.
%controller) does not work anymore. -
Removed
\Pimcore\Controller\Config\ConfigNormalizer. -
Removed
pimcore_action()Twig extension. Use Twigrender()instead. -
Removed
\Pimcore\Console\Log\Formatter\ConsoleColorFormatter -
Removed
\Pimcore\Console\CliTrait, usephp_sapi_name() === 'cli'instead. -
Removed
\Pimcore\Console\Dumper, use Symfony'sVarDumperinstead. -
Removed
\Pimcore\Google\webmastertools, use\Pimcore\Config::getReportConfig()->get('webmastertools')instead. -
Removed
\Pimcore\Helper\JsonFormatter, usejson_encode($data, JSON_PRETTY_PRINT)instead. -
Removed
\Pimcore\Log\Handler\Mail, there's no replacement for this internal class. -
Removed
\Pimcore\File::isIncludeable()method, there's no replacement. -
Removed
\Pimcore\DataObject\GridColumnConfig\AbstractConfigElementjust implement\Pimcore\DataObject\GridColumnConfig\ConfigElementInterfaceinstead. -
[Documents] Renderlet Editable: removed
action&bundleconfig. Specify controller reference, e.g.App\Controller\FooController::myAction -
Bumped
codeception/codeceptionto "^4.1.12". -
Pimcore Bundle Migrations: Extending the functionality of
DoctrineMigrationsBundleis not any longer possible the way we did it in the past. Therefore we're switching to standard Doctrine migrations, this means also that migration sets are not supported anymore and that the available migrations have to be configured manually or by using flex.doctrine_migrations: migrations_paths: 'Pimcore\Bundle\DataHubBundle\Migrations': '@PimcoreDataHubBundle/Migrations' 'CustomerManagementFrameworkBundle\Migrations': '@PimcoreCustomerManagementFrameworkBundle/Migrations'However, we've extended the doctrine commands to accept an optional
--prefixoption, which let's you filter configured migration classes. This is in a way an adequate replacement for the-s(sets) option../bin/console doctrine:migrations:list --prefix=Pimcore\\Bundle\\CoreBundle -
[Ecommerce] Added
setItems($items)methodCartInterface,getRule()toModificatedPriceInterface&getId()method toProductInterface. -
[Data Objects] Relation Data-Types: throws exception if object without an ID was assigned. e.g.
$newObject = new MyDataObject(); $existingObject->setMyRelations([$newObject]); $existingObject->save(); //validation error -
[Data Objects] ManyToMany Relation Types: throws exception if multiple assignments passed without enabling Multiple assignments on class definition.
-
[Data Objects] ReverseManyToManyObjectRelation - now supports reverse relations from ManyToOneRelation field and has been renamed to ReverseObjectRelation with BC layer.
-
[Data Object] Table Data-Type always return an array.
-
[Data Object]
Model::getById()&Model::getByPath()do not catch exceptions anymore. -
Added methods
getArgument($key),setArgument($key, $value),getArguments(),setArguments(array $args = []),hasArgument($key)toPimcore\Model\Element\ElementInterface\ElementEventInterface. -
[Ecommerce] Changed name of interfaces from I* to *Interface .e.g.
Pimcore\Bundle\EcommerceFrameworkBundle\Model\ICheckoutable=>Pimcore\Bundle\EcommerceFrameworkBundle\Model\CheckoutableInterface -
Removed
cache/tag-interopdependency. -
[Cache]
Pimcore\Cacheis directly based on Symfony/Cache. If you have custom cache pool configured underpimcore.cache.poolsthen change it to Symfony Configframework.cache.pools. Read more -
Methods
checkCsrfToken(),getCsrfToken(),regenerateCsrfToken()methdos have been removed fromPimcore\Bundle\AdminBundle\EventListener\CsrfProtectionListener. UsePimcore\Bundle\AdminBundle\Security\CsrfProtectionHandlerinstead. -
Bumped
phpunit/phpunit&codeception/phpunit-wrapperto "^9" -
Replaced
html2text/html2textwithsoundasleep/html2text. Removed methods fromPimcore\Mail:determineHtml2TextIsInstalled(),setHtml2TextOptions($options = []),getHtml2TextBinaryEnabled(),enableHtml2textBinary(),getHtml2textInstalled(). -
Replaced
doctrine/commonwithdoctrine/persistence. -
[Asset] Image thumbnails: Using getHtml() will return
<picture>tag instead of<img>tag. -
[Asset] Config option
pimcore.assets.image.thumbnails.webp_auto_supportwas removed, since the browser detection is not needed anymore using the<picture>tags for thumbnails. -
[Ecommerce] Marked
AbstractOrder&AbstractOrderItemclasses as abstract. Changes onAbstractOrderclass:- Added:
getCartHash(),getComment(),setComment() - Removed:
getDeliveryEMail(),setDeliveryEMail(),getCartModificationTimestamp()
- Added:
-
[Data Objects] Data-Types: Removed getPhpdocType() BC layer
-
[Ecommerce][FilterService] Added method
getFilterValues()toPimcore\Bundle\EcommerceFrameworkBundle\FilterService\FilterType\AbstractFilterType -
[Data Objects] OwnerAwareFieldInterface: added methods
_setOwner($owner),_setOwnerFieldname(?string $fieldname),_setOwnerLanguage(?string $language),_getOwner(),_getOwnerFieldname(), _getOwnerLanguage() and removed methodsetOwner($owner, string $fieldname, $language = null). -
[Translations] Remove
pimcore.translations.case_insensitivesupport. -
[Core] Folder structure updated to support Symfony Flex. Changes as per Symfony Docs
-
[Translations]
Pimcore\Model\Translation\AbstractTranslation,Pimcore\Model\Translation\AdminandPimcore\Model\Translation\Websitewith corresponding listing classes have been removed. Use new classPimcore\Model\Translationwith domain support (Translation::DOMAIN_DEFAULTorTranslation::DOMAIN_ADMIN). -
Replaced
scheb/two-factor-bundlewithscheb/2fa-bundle,scheb/2fa-google-authenticator&scheb/2fa-qr-code. -
Removed Laminas Packages.
-
Removed Zend Compatibility Query Builder.
-
[Ecommerce] Payment Providers: Removed
WirecardSeamless,Qpay,Paypalintegration and moved to a separate bundle:-
Datatrans=> https://github.com/pimcore/payment-provider-datatrans -
Heidelpay=> https://github.com/pimcore/payment-provider-unzer -
Hobex=> https://github.com/pimcore/payment-provider-hobex -
Klarna=> https://github.com/pimcore/payment-provider-klarna -
Mpay24Seamless=> https://github.com/pimcore/payment-provider-mpay24-seamless -
OGone=> https://github.com/pimcore/payment-provider-ogone -
PayPalSmartPaymentButton=> https://github.com/pimcore/payment-provider-paypal-smart-payment-button -
PayU=> https://github.com/pimcore/payment-provider-payu
-
-
[Core] Security configurations not merged anymore from custom bundles.
-
twig/extensionsdependency has been removed. -
Removed legacy transliterator (changes related to
\Pimcore\Tool\Transliteration::_transliterationProcess). -
Config: Invalid pimcore configurations will result in compile error:
pimcore: xyz: xyz: -
[Data Objects] Removed
getFromCsvImport()method from data-types. -
Replaced
Ramsey/UuidwithSymfony/Uuid. -
Matomo Integration has been removed.
-
Pimcore\Tool\Console::exec()method has been removed. Use Symfony\Component\Process\Process instead. -
\Pimcore\Tool\Console::getOptions()method has been removed. -
\Pimcore\Tool\Console::getOptionString()method has been removed. -
\Pimcore\Tool\Console::checkCliExecution()method has been removed. -
Pimcore\Twig\Extension\Templating\Navigation::buildNavigation()method has been removed. -
Pimcore\Tool\Mimeclass has been removed. UseSymfony\Component\Mime\MimeTypesinstead. -
[Documents] Areabricks: location changed from
Areastoareaswith BC layer. -
[Documents] Areablocks: Adding a brick to areablocks will not trigger reload by default anymore and should be configured per Brick.
-
SQIP support has been removed.
-
Thumbnail::getHtml()doesn't accept direct pass of HTML attributes such asclassortitleanymore, useimageAttributesorpictureAttributesinstead. -
Removed methods
getForcePictureTag()andsetForcePictureTag()from\Pimcore\Model\Asset\Image\Thumbnail\Config -
\Pimcore\Model\Document\Editable\Block\AbstractBlockItem::getElement()has been removed, usegetEditable()instead. -
\Pimcore\Model\DataObject\Service::removeObjectFromSession()has been removed, useremoveElementFromSession()instead. -
\Pimcore\Model\DataObject\Service::getObjectFromSession()has been removed, usegetElementFromSession()instead. -
\Pimcore\Model\Asset\Image\Thumbnail\Config::setColorspace()has been removed -
\Pimcore\Model\Asset\Image\Thumbnail\Config::getColorspace()has been removed -
\Pimcore\Model\DataObject\ClassDefinition\Data\DataInterfacehas been removed -
\Pimcore\Model\Asset\Listing::getPaginatorAdapterhas been removed, useknplabs/knp-paginator-bundleinstead. -
\Pimcore\Model\Document\Listing::getPaginatorAdapterhas been removed, useknplabs/knp-paginator-bundleinstead. -
\Pimcore\Model\DataObject\Listing::getPaginatorAdapterhas been removed, useknplabs/knp-paginator-bundleinstead. -
\Pimcore\Google\Cse::getPaginatorAdapterhas been removed, useknplabs/knp-paginator-bundleinstead. -
\Pimcore\Helper\RobotsTxthas been removed -
\Pimcore\Tool\Frontend::getSiteKey()method has been removed. -
\Pimcore\Model\User::getUsername()has been removed, useUser::getName()instead. -
\Pimcore\Cache\Runtime::get('pimcore_editmode')isn't supported anymore, useEditmodeResolverservice instead. -
[Documents]
Editable::factory()was removed, useEditableLoaderservice instead. -
[Data Objects] Removed CSV import feature. Use https://github.com/pimcore/data-importer or https://github.com/w-vision/DataDefinitions instead.
-
[DataObjects] marked
Pimcore\DataObject\GridColumnConfig\Operatoroperator classes as final and internal -
[DataObjects] Calculator classes of Calculated Values must implement the
Pimcore\Model\DataObject\ClassDefinition\CalculatorClassInterfacenow. -
[DataObjects] PHP Class
Pimcore\Model\DataObject\Data\Geopointhas been replaced withGeoCoordinates. Changed the signature of__construct. -
Added
Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\FilterType\AbstractFilterType::getFilterValues()with the same signature asgetFilterFrontend(). To upgrade, renamegetFilterFrontend()togetFilterValues()and remove the rendering stuff to just return the data array.Before:
public function getFilterFrontend(AbstractFilterDefinitionType $filterDefinition, ProductListInterface $productList, $currentFilter) { // ... return $this->render($this->getTemplate($filterDefinition), [ //... ]); }After:
public function getFilterValues(AbstractFilterDefinitionType $filterDefinition, ProductListInterface $productList, array $currentFilter): array { // ... return [ //... ]; } -
Added Validation for Geo datatypes
- for Geopolyline and Geopolygon invalid data doesn't get serialized 1:1 anymore
- for Geobounds and Geopoint invalid data doesn't get dropped silently anymore
-
Calling
$imageAsset->getThumbnail('non-existing-thumbnail-definition)with a non-existing thumbnail definition will now throw an exception. Same goes for video assets and video image thumbnails. -
Removed grid column operator
ObjectBrickGettersince it is obsolete -
Grid operator
AnyGetteravailable only for admin users from now on -
[Ecommerce] Added
getAttributeConfigmethod toPimcore\Bundle\EcommerceFrameworkBundle\IndexService\Config\ConfigInterfaceinterface -
[Ecommerce] Added
getClientConfigmethod toPimcore\Bundle\EcommerceFrameworkBundle\IndexService\Config\ElasticSearchConfigInterface -
[Ecommerce] Added abstract method
setSuccessorOrdertoPimcore\Bundle\EcommerceFrameworkBundle\Model\AbstractOrder -
[Ecommerce] Indexing doesn't catch any exceptions that occur during preprocessing of attributes in BatchProcessing workers (e.g. elasticsearch). You can change that behavior with event listeners.
-
[Ecommerce] Added abstract method
setCartHashtoPimcore\Bundle\EcommerceFrameworkBundle\Model\AbstractOrder -
[Ecommerce] Added
getFieldNameMappedtoPimcore\Bundle\EcommerceFrameworkBundle\IndexService\Config\ElasticSearchConfigInterface -
[Ecommerce] Added
getReverseMappedFieldNametoPimcore\Bundle\EcommerceFrameworkBundle\IndexService\Config\ElasticSearchConfigInterface -
[Ecommerce] Changed tenant config type hint to
FindologicConfigInterfaceinPimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\DefaultFindologic::__construct -
[Ecommerce] Changed price fields
totalNetPriceandtotalPriceofOnlineShopOrderItemto decimal. -
[Ecommerce] Removed deprecated configuration options
enabled,pricing_manager_idandpricing_manager_optionsfor pricing_manager. Use tenant specific options. -
[Ecommerce] Removed deprecated functions
get/setCurrentTenantandget/setCurrentSubTenantofEnvironmentInterface -
[Ecommerce] Removed deprecated service alias for
Pimcore\Bundle\EcommerceFrameworkBundle\IEnvironment -
[Ecommerce] Removed deprecated functions
getGeneralSearchColumns,createOrUpdateTable,getIndexColumnsandgetIndexColumnsByFilterGroupofIndexService -
[Ecommerce] Removed deprecated function
getPaginatorAdapterfromProductList\MySql,ProductList\DefaultFindologic,ProductList\ElasticSearch\AbstractElasticSearch,Token\ListingandAbstractOrderList -
[Ecommerce] Removed deprecated functions
getCalculatedPriceandgetCalculatedPriceInfofromAbstractSetProduct -
[Ecommerce] Removed deprecated protected function
getAvailableFilterValuesfromOrder\Listing -
[Ecommerce] Activated
generateTypeDeclarationsfor all generated data object classes and field collections. For migration activategenerateTypeDeclarationsto all Ecommerce Framework data object classes and update your source code accordingly. -
[Ecommerce] Made methods abstract instead of throwing
UnsupportedExceptionwhere easily possible for model classes (AbstractProduct,AbstractSetProduct,AbstractOfferToolProduct,AbstractOfferItem,AbstractOffer). -
[Ecommerce] Added type declarations to Ecommerce Framework product interfaces (
ProductInterface,IndexableInterface,CheckoutableInterface). -
[Ecommerce] Removed Elasticsearch 5 and 6 support
-
[Ecommerce]
getItemAmountandgetItemCountofCartsnow require string parameter (instead of boolean). Use one ofCartInterface::COUNT_MAIN_ITEMS_ONLY,CartInterface::COUNT_MAIN_AND_SUB_ITEMS,CartInterface::COUNT_MAIN_OR_SUB_ITEMS. -
[Ecommerce] Removed legacy CheckoutManager architecture, migrate your project to V7 if not already
-
CancelPaymentOrRecreateOrderStrategyis now default strategy for handling active payments - Removed method
isCartReadOnlyfrom cart andcart_readonly_modeconfiguration option as readonly mode does not exist anymore. - Removed deprecated method
initPaymentfromPaymentInterface
-
-
[Ecommerce] Removed deprecated
ecommerce:indexservice:process-queuecommand, useecommerce:indexservice:process-preparation-queueorecommerce:indexservice:process-update-queueinstead -
[Ecommerce] Removed deprecated
mappingoption in index attributes configuration (never worked properly anyway) -
[Ecommerce] Removed deprecated
IndexUpdatertool -
[Ecommerce] Removed legacy BatchProcessing worker mode, product centric batch processing is now standard
- Removed abstract class
AbstractBatchProcessingWorker, useProductCentricBatchProcessinginstead - Removed methods from interface
BatchProcessingWorkerInterfaceand its implementations:-
BatchProcessingWorkerInterface::processPreparationQueue -
BatchProcessingWorkerInterface::processUpdateIndexQueue
-
- Added methods to interface
BatchProcessingWorkerInterface-
BatchProcessingWorkerInterface::prepareDataForIndex -
BatchProcessingWorkerInterface::resetPreparationQueue -
BatchProcessingWorkerInterface::resetIndexingQueue
-
- Removed constants
-
ProductCentricBatchProcessingWorker::WORKER_MODE_LEGACY -
ProductCentricBatchProcessingWorker::WORKER_MODE_PRODUCT_CENTRIC
-
- Removed configuration node
worker_modeinindex_serviceconfiguration
- Removed abstract class
-
[Ecommerce] Moved method
getIdColumnTypefromMysqlConfigInterfacetoConfigInterface. Since it was and still is implemented inAbstractConfigthis should not have any consequences. -
[Ecommerce] Timestamp of CartItems is now in mirco seconds (existing data will be migrated).
-
[Ecommerce][PricingManager] Added two new interfaces
ProductActionInterfaceandCartActionInterface. All actions need to implement either of it - otherwise they will not be considered anymore in price calculation. -
[Web2Print]
- Removed
PdfReactor8, usePdfReactorinstead. - Removed PDFreactor version selection in web2print settings, since most current PDFreactor client lib should be backwards compatible to older versions.
- Removed
-
[Email & Newsletter] Swiftmailer has been replaced with Symfony Mailer.
\Pimcore\Mailclass now extends fromSymfony\Component\Mime\Emailand new mailer servicePimcore\Mail\Mailerhas been introduced, which decoratesSymfony\Component\Mailer\Mailer, for sending mails.Email method and transport setting has been removed from System settings. Cleanup Swiftmailer config and setup mailer transports "main" & "newsletter" in config.yaml:
framework: mailer: transports: main: smtp://user:pass@smtp.example.com:port pimcore_newsletter: smtp://user:pass@smtp.example.com:portplease see Symfony Transport Setup for more information.
API changes:
Before:
$mail = new \Pimcore\Mail($subject = null, $body = null, $contentType = null, $charset = null); $mail->setBodyText("This is just plain text"); $mail->setBodyHtml("<b>some</b> rich text: {{ myParam }}"); ...After:
$mail= new \Pimcore\Mail($headers = null, $body = null, $contentType = null); $mail->text("This is just plain text"); $mail->html("<b>some</b> rich text: {{ myParam }}"); ...Before:
$mail->setFrom($emailAddress, $name); $mail->setTo($emailAddress, $name); ...After:
$mail->from(new \Symfony\Component\Mime\Address($emailAddress, $name)); $mail->to(new \Symfony\Component\Mime\Address($emailAddress, $name)); ... -
[Email & Newsletter]
\Pimcore\Mail::setEnableLayoutOnRendering/getEnableLayoutOnRendering()methods have been removed, with Twig they are just not necessary anymore. -
[Email & Newsletter]
\Pimcore\Mail::isValidEmailAddress()method has been removed, useEmailValidatorinstead. -
[Security] BruteforceProtectionHandler & BruteforceProtectionListener has been made final and marked as internal.
-
[JWTCookieSaveHandler]
Pimcore\Targeting\Storage\Cookie\JWT\Decoderhas been removed in favor ofLcobucci\JWT\Encoding\JoseDecoder. -
simple_html_domlibrary has been removed. UseSymfony\Component\DomCrawler\Crawlerinstead. -
Removed deprecated Twig extension
pimcore_action(). -
Removed method
getFlag()fromPimcore\Config. -
Removed
Pimcore\Reportclass. -
[Versioning] Default behavior has been changed to following:
- Empty values for
steps&days=> unlimited versions. - Value 0 for
stepsordays=> no version will be saved at all & existing will be cleaned up.
please update your system settings as per the requirements.
- Empty values for
-
Removed deprecated
marshal()andunmarshal()methods from object data-types. -
DynamicTextLabelInterface::renderLayoutText()must handle nullable object param. -
[AdminBundle] Marked classes and controllers as @internal/final - please see all changes here: https://github.com/pimcore/pimcore/pull/8453/files & https://github.com/pimcore/pimcore/pull/8988/files