Upgrade Notes
v2026.1.0
Platform Requirements
- Added support for
PHP8.5. - Removed support for
PHP8.3and Symfonyv6.
Removed ExtJS / Admin Classic UI
All legacy ExtJS-based admin controllers and their associated frontend assets have been removed. The Admin Classic UI is no longer supported:
- Removed
src/Controller/AdminOrderController.php - Removed
src/Controller/ConfigController.php - Removed
src/Controller/IndexController.php - Removed
src/Controller/PricingController.php - Removed
src/Controller/VoucherController.php - Removed
src/Event/AdminEvents.php— the event constantsGET_VALUES_FOR_FILTER_FIELD_PRE_SEND_DATAandGET_INDEX_FIELD_NAMES_PRE_SEND_DATAno longer exist. Remove any listeners registered against these events. - Removed all ExtJS JavaScript files under
src/Resources/public/js/(startup, indexfieldselectionfield data/tags, pricing config/item/objects/panel, order/OrderTab, voucherservice/VoucherSeriesTab) - Removed legacy CSS files:
src/Resources/public/css/back-office.css,backend.css,pricing.css,voucherservice/style.css - Removed all Webpack build artifacts under
src/Resources/public/build/ecommerceFramework/ - Removed frontend asset entry points:
src/Resources/public/assets/bootstrap.js,flatpickr.js,leaflet.js,voucher.js - Removed vendor libraries:
bootstrap4,chart.min.js,chart.doughnut.js,flatpickr,fontawesome,leaflet,findologic/export.xsd - Removed
src/Routing/StudioRouteLoader.php— Studio routing is now handled via service configuration.
Removed Analytics Tracking Trackers
The following deprecated Google Analytics tracking trackers have been removed:
Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\Analytics\AbstractAnalyticsTrackerPimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\Analytics\EcommercePimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\Analytics\UniversalEcommercePimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\Analytics\EnhancedEcommerce
Use Google Tag Manager instead.
Studio Backend API (New)
All legacy admin controller endpoints have been migrated to modern Studio Backend API controllers. New Studio API controllers are available under src/Controller/Studio/:
- Pricing: Collection, Config, Copy, Create, Delete, Item, Rename, Save, SaveOrder
- Order: Collection, Item (Cancel, Complaint, Edit)
- Voucher: Reservation/Cleanup, Token (Cleanup, Export, Generate), View/Tab
- Back-office order views
New services and interfaces:
Pimcore\Bundle\EcommerceFrameworkBundle\Service\Studio\OrderServiceInterface— new interface for order Studio APIPimcore\Bundle\EcommerceFrameworkBundle\Service\Studio\OrderViewService— new service for rendering order viewsPimcore\Bundle\EcommerceFrameworkBundle\Service\Studio\PricingServiceInterface— new interface for pricing rule Studio APIPimcore\Bundle\EcommerceFrameworkBundle\Service\Studio\VoucherServiceInterface— new interface for voucher token managementPimcore\Bundle\EcommerceFrameworkBundle\Service\Studio\VoucherViewServiceInterface— new interface for voucher view rendering
New hydrators with interfaces:
src/Hydrator/OrderHydratorInterfacesrc/Hydrator/OrderItemHydratorInterfacesrc/Hydrator/PricingHydratorInterface
New Studio pre-response events:
Pimcore\Bundle\EcommerceFrameworkBundle\Event\Studio\PreResponse\OrderDetailEventPimcore\Bundle\EcommerceFrameworkBundle\Event\Studio\PreResponse\OrderListItemEventPimcore\Bundle\EcommerceFrameworkBundle\Event\Studio\PreResponse\PricingConfigEventPimcore\Bundle\EcommerceFrameworkBundle\Event\Studio\PreResponse\PricingRuleDetailEventPimcore\Bundle\EcommerceFrameworkBundle\Event\Studio\PreResponse\PricingRuleListItemEvent
Studio UI Integration
- Pricing Rules editor is now fully implemented in the Studio UI (React/TypeScript modules under
assets/studio/js/src/modules/pricing-rules/) - Voucher Series tab is now available in the Studio UI
- Index Field Selection field definitions (
IndexFieldSelection,IndexFieldSelectionCombo,IndexFieldSelectionField) are now implemented as Studio class editor dynamic types (TypeScript)
Interface and Return Type Changes
CartManager
AbstractCart::isValidCartItem()— removed theinstanceof CheckoutableInterfaceguard; the method now only checks forMockProductexclusion. Any product type is now accepted as a valid cart item.CartPriceCalculator::buildModificator()— removed the unnecessary null check before instantiating the modificator.
OrderManager
OrderManager::fillOrderItem()— removedinstanceof CheckoutableInterfaceguard when callinggetOSName()/getOSProductNumber(); these calls are now made unconditionally. Ensure your product classes implementProductInterfaceproperly.OrderManager::applyVoucherTokens()— removed theis_array($voucherTokens)guard;getVoucherTokenCodes()is now expected to always return an array.OrderManager::fillOrderItem()— removedis_object($item->getTotalPrice())guard;getTotalPrice()must return an object.OrderManager::fillOrderItem()— removedmethod_exists($orderItem, 'setPricingRules')check;setPricingRulesis now expected to exist on the order item.
OfferTool
DefaultService::createOfferItem()— removedinstanceof CheckoutableInterfaceguard when callinggetOSName()/getOSProductNumber(); products are now assumed to implementProductInterfacedirectly.
FilterService
NumberRangeSelection::prepareData()(bothFilterType\NumberRangeSelectionandFilterType\Findologic\NumberRangeSelection) — removedmethod_existschecks forgetPreSelectFrom()/getPreSelectTo(); these methods are now expected to always exist on filter definitions.SelectCategory::prepareData()— removedmethod_exists($filterDefinition, 'getPreSelect')check;getPreSelect()is now assumed to always exist.MultiSelectRelation::prepareData()(and Findologic variant) — removedis_array($objects)guard;$objectsis assumed to always be an array at this point.
PricingManager
PricingManager\Condition\CatalogCategory::fromJson()— now strictly checksinstanceof AbstractCategorybefore adding loaded objects to the category list (previously only truthiness was checked).PricingManager\Condition\CatalogProduct::fromJson()— now strictly checksinstanceof AbstractProductbefore adding loaded objects (previously only truthiness was checked).PricingManager\Condition\CatalogProduct::__wakeup()— now resets$this->products = []instead ofunset($this->products).PricingManager\Condition\VoucherToken::check()— removedis_array($voucherTokenCodes)guard;getVoucherTokenCodes()is expected to always return an array.
VoucherService
AbstractTokenManager::checkOncePerCart()— removedis_array($cartCodes)guard;getVoucherTokenCodes()must return an array.AbstractTokenManager::checkOnlyToken()— removedmethod_exists($this->configuration, 'getOnlyTokenPerCart')check; this method is expected to always exist.AbstractTokenManager::export()/exportData()— removedis_array($data)guards;$datais expected to be an array when not null.
IndexService
AbstractOpenSearch::load()— removed theinstanceof OpenSearch\Clienttype check;getOpenSearchClient()is now expected to always return a proper client.AbstractElasticSearch::loadIndexVersion()— removed theis_array($result)guard; also changedgetAlias()to accept['name' => [$this->indexName]](array) instead of a string.DefaultMysqlandProductCentricBatchProcessingWorker— removedinstanceof AbstractCategorychecks when building category ID maps; categories fromgetCategories()are assumed to always beAbstractCategoryinstances.
Tracking
AbstractProductData::getCategory()— removedis_array($this->categories)guard;$this->categoriesis now always expected to be an array.
Other Changes
- Removed Doctrine DBAL enum type mapping configuration (deprecated)
- Removed
src/Resources/config/studio_backend.yamltop-level file (routing consolidated) - Removed
src/Resources/config/studio_ui.yamltop-level file - Removed view templates:
src/Resources/views/includes/paging.html.twig,voucher/parts/statistics.html.twig,voucher/voucher_code_tab_error.html.twig,voucher/voucher_layout.html.twig
v2.1.0
Added the possibility to distinguish relations conditions applied as preconditions.
v2.0.0
Added bool as possible type to $condition parameter of addCondition function in ProductListInterface (and all implementing classes).
v1.2.1
- Removed the package "rybakit/twig-deferred-extension". If you extend the twig layout from the E-Commerce Framework,
please check if custom CSS/JS code added by
pimcore_head_scriptandpimcore_head_linkis still working.
v2.0.0
AbstractOfferToolProductnow only accepts int as the$idparameter.