Skip to main content
Version: 2026.1

Upgrade Notes

v2026.1.0

Platform Requirements

  • Added support for PHP 8.5.
  • Removed support for PHP 8.3 and Symfony v6.

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 constants GET_VALUES_FOR_FILTER_FIELD_PRE_SEND_DATA and GET_INDEX_FIELD_NAMES_PRE_SEND_DATA no 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\AbstractAnalyticsTracker
  • Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\Analytics\Ecommerce
  • Pimcore\Bundle\EcommerceFrameworkBundle\Tracking\Tracker\Analytics\UniversalEcommerce
  • Pimcore\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 API
  • Pimcore\Bundle\EcommerceFrameworkBundle\Service\Studio\OrderViewService — new service for rendering order views
  • Pimcore\Bundle\EcommerceFrameworkBundle\Service\Studio\PricingServiceInterface — new interface for pricing rule Studio API
  • Pimcore\Bundle\EcommerceFrameworkBundle\Service\Studio\VoucherServiceInterface — new interface for voucher token management
  • Pimcore\Bundle\EcommerceFrameworkBundle\Service\Studio\VoucherViewServiceInterface — new interface for voucher view rendering

New hydrators with interfaces:

  • src/Hydrator/OrderHydratorInterface
  • src/Hydrator/OrderItemHydratorInterface
  • src/Hydrator/PricingHydratorInterface

New Studio pre-response events:

  • Pimcore\Bundle\EcommerceFrameworkBundle\Event\Studio\PreResponse\OrderDetailEvent
  • Pimcore\Bundle\EcommerceFrameworkBundle\Event\Studio\PreResponse\OrderListItemEvent
  • Pimcore\Bundle\EcommerceFrameworkBundle\Event\Studio\PreResponse\PricingConfigEvent
  • Pimcore\Bundle\EcommerceFrameworkBundle\Event\Studio\PreResponse\PricingRuleDetailEvent
  • Pimcore\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 the instanceof CheckoutableInterface guard; the method now only checks for MockProduct exclusion. 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() — removed instanceof CheckoutableInterface guard when calling getOSName()/getOSProductNumber(); these calls are now made unconditionally. Ensure your product classes implement ProductInterface properly.
  • OrderManager::applyVoucherTokens() — removed the is_array($voucherTokens) guard; getVoucherTokenCodes() is now expected to always return an array.
  • OrderManager::fillOrderItem() — removed is_object($item->getTotalPrice()) guard; getTotalPrice() must return an object.
  • OrderManager::fillOrderItem() — removed method_exists($orderItem, 'setPricingRules') check; setPricingRules is now expected to exist on the order item.

OfferTool

  • DefaultService::createOfferItem() — removed instanceof CheckoutableInterface guard when calling getOSName()/getOSProductNumber(); products are now assumed to implement ProductInterface directly.

FilterService

  • NumberRangeSelection::prepareData() (both FilterType\NumberRangeSelection and FilterType\Findologic\NumberRangeSelection) — removed method_exists checks for getPreSelectFrom()/getPreSelectTo(); these methods are now expected to always exist on filter definitions.
  • SelectCategory::prepareData() — removed method_exists($filterDefinition, 'getPreSelect') check; getPreSelect() is now assumed to always exist.
  • MultiSelectRelation::prepareData() (and Findologic variant) — removed is_array($objects) guard; $objects is assumed to always be an array at this point.

PricingManager

  • PricingManager\Condition\CatalogCategory::fromJson() — now strictly checks instanceof AbstractCategory before adding loaded objects to the category list (previously only truthiness was checked).
  • PricingManager\Condition\CatalogProduct::fromJson() — now strictly checks instanceof AbstractProduct before adding loaded objects (previously only truthiness was checked).
  • PricingManager\Condition\CatalogProduct::__wakeup() — now resets $this->products = [] instead of unset($this->products).
  • PricingManager\Condition\VoucherToken::check() — removed is_array($voucherTokenCodes) guard; getVoucherTokenCodes() is expected to always return an array.

VoucherService

  • AbstractTokenManager::checkOncePerCart() — removed is_array($cartCodes) guard; getVoucherTokenCodes() must return an array.
  • AbstractTokenManager::checkOnlyToken() — removed method_exists($this->configuration, 'getOnlyTokenPerCart') check; this method is expected to always exist.
  • AbstractTokenManager::export() / exportData() — removed is_array($data) guards; $data is expected to be an array when not null.

IndexService

  • AbstractOpenSearch::load() — removed the instanceof OpenSearch\Client type check; getOpenSearchClient() is now expected to always return a proper client.
  • AbstractElasticSearch::loadIndexVersion() — removed the is_array($result) guard; also changed getAlias() to accept ['name' => [$this->indexName]] (array) instead of a string.
  • DefaultMysql and ProductCentricBatchProcessingWorker — removed instanceof AbstractCategory checks when building category ID maps; categories from getCategories() are assumed to always be AbstractCategory instances.

Tracking

  • AbstractProductData::getCategory() — removed is_array($this->categories) guard; $this->categories is now always expected to be an array.

Other Changes

  • Removed Doctrine DBAL enum type mapping configuration (deprecated)
  • Removed src/Resources/config/studio_backend.yaml top-level file (routing consolidated)
  • Removed src/Resources/config/studio_ui.yaml top-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_script and pimcore_head_link is still working.

v2.0.0

  • AbstractOfferToolProduct now only accepts int as the $id parameter.