Skip to main content
Version: 2026.1

Upgrade Information

The following steps are necessary when updating to newer versions.

Upgrade to 2026.1.0

PHP / Dependency Updates

  • PHP minimum requirement raised to 8.4. PHP 8.5 is now supported.
  • Dropped support for PHP 8.3 and Symfony v6.
  • Removed the pimcore/admin-ui-classic-bundle dependency.
  • Removed Doctrine DBAL enum mapping support.

Removed ExtJS / Admin Classic UI

  • Removed all ExtJS-based frontend JavaScript files (src/Resources/public/js/), including the full configuration UI, execution UI, log tab, transmitter configuration, workspace editor, and startup script.
  • Removed ConfigController (classic admin API for configuration management).
  • Removed AdminSubscriber (classic admin event listener integration).
  • Removed StudioRouteLoader — Studio routes are now registered directly via routing.yml using attribute-based routing.
  • PimcoreDataHubFileExportBundle no longer implements PimcoreBundleAdminClassicInterface and no longer uses BundleAdminClassicTrait.
  • PimcoreDataHubFileExportBundle::registerDependentBundles() no longer registers PimcoreAdminBundle.
  • Note: PimcoreDataHubFileExportBundle is not final as it is extended by other bundles (e.g. data-hub-productsup).

New Features

  • The CSV delimiter character is now configurable per export configuration. The default value remains ,.
  • Transmitters now access the exported file and its storage through the ExporterInterface instead of directly via the ExporterTypeInterface. This decoupling enables post-export file manipulation (e.g. bundling assets into a zip archive).

BC Breaks / Configuration Changes

  • The Symfony Messenger transport DSN parameter has been renamed from %pimcore.messenger.transport_dsn% to %pimcore.messenger.transport_dsn_prefix%. Update your config.yml or environment variables accordingly.
  • TransmitterInterface and AbstractTransmitter no longer depend on ExporterTypeInterface. The methods setExporterType()/getExporterType() have been replaced by setExporter(ExporterInterface)/getExporter(). Custom transmitters must be updated to use the new ExporterInterface to access the file and storage.
  • ExporterInterface has two new methods: getFile(): string and getFileStorage(): FilesystemOperator. Custom exporter implementations must implement these methods.

Removed StudioFile Class — Merged into AbstractExporter

  • Pimcore\Bundle\DataHubFileExportBundle\Exporter\StudioFile has been removed. All Studio GridService-based data extraction logic has been moved into AbstractExporter. Custom classes that extended StudioFile must now extend File instead.
  • The service ID pimcore.datahub.fileExport.exporter.studioFile has been renamed to pimcore.datahub.fileExport.exporter.file. The Helper::STUDIO_EXPORTER_SERVICE constant has been updated accordingly. Update any service configuration or code that references the old service ID.

Constructor Signature Change in AbstractExporter

  • AbstractExporter::__construct() now requires two additional parameters: GridServiceInterface $gridService and OutputFormatterLoaderInterface $formatterLoader, inserted before the $exporterTypes array parameter. The new signature is:
    public function __construct(
    LocaleServiceInterface $localeService,
    EventDispatcherInterface $eventDispatcher,
    RouterInterface $router,
    AssetRelationFixer $assetRelationFixer,
    LoggerInterface $applicationLogger,
    GridServiceInterface $gridService, // NEW
    OutputFormatterLoaderInterface $formatterLoader, // NEW
    array $exporterTypes = [],
    array $transmitter = [],
    )
    Custom exporters that extend AbstractExporter or File and override the constructor must update their signatures to include these parameters and pass them to parent::__construct().

Data Extraction Now Uses Studio GridService Exclusively

  • AbstractExporter no longer calls DataObject\Service::getCsvDataForObject(). All data extraction is now performed through the Studio GridServiceInterface::getGridDataForElement().
  • The legacy grid config format (schema.config.columns with helperDefinitions) is no longer supported by the base exporter. Configurations must use the Studio column format (schema.columns).
  • getGridConfigData() now returns array{columns: array, language: ?string} instead of the previous array{fields: array, helperDefinitions: array, language: ?string}. Code that relied on the fields or helperDefinitions keys must be updated.
  • getFieldMapping() now derives headers from column['label'] ?? column['key'] instead of DataObject\Service::getCsvDataForObject().
  • getItemData() now has an explicit return type of array|bool.
  • The protected method fixAssetRelations() has been removed and replaced by the private method fixStudioAssetRelations(), which delegates to registered OutputFormatter instances. Custom exporters that overrode fixAssetRelations() must migrate to the OutputFormatter system instead.
  • The protected method mapLabelToOperatorId() is no longer called from getItemData().

Logger Interface Change

  • AbstractExporter::$applicationLogger, AbstractExporter::__construct() and AbstractTransmitter::setApplicationLogger() now type-hint against Psr\Log\LoggerInterface instead of Pimcore\Log\ApplicationLogger. Custom exporter and transmitter classes that override these must update their type hints accordingly.
  • Exporter\Type\AbstractExporter::__construct() constructor parameter $applicationLogger changed from ApplicationLogger to LoggerInterface.
  • The ApplicationLogger namespace was updated from Pimcore\Log\ApplicationLogger to Pimcore\Bundle\ApplicationLoggerBundle\ApplicationLogger. Update your imports if you referenced the old namespace directly.

Classes Marked as Final / Internal

The following classes are now marked @internal and/or final. If you have extended or relied on these classes, you must refactor your implementation:

  • CronExecutionCommand — now final and @internal
  • ExportFileCommand — now final and @internal
  • ExportExecutionDispatcher — now final and @internal
  • ExportExecutionHandler — now final and @internal
  • ExportExecutionMessage — now final readonly and @internal
  • ConfigurationEventSubscriber — now final and @internal
  • CronExecutionService — now final and @internal
  • ExporterServiceCollector — now final and @internal
  • Installer — now final and @internal
  • ResetConfigEvent — now final; properties changed from protected to private
  • ValidateConfigEvent — now final; property changed from protected to private
  • DataObjectSubscriber — now @internal (not final, as it is extended by data-hub-productsup)

Return Type Changes

  • Installer::getLastMigrationVersionClassName() return type changed from ?string to string (non-nullable).

Upgrade to 3.4.0

With this version and the Pimcore Studio integration, we introduced a new architecture for schema definitions. We are moving from the tree-based schema definition (also used in the grid configuration of the Admin Classic UI) to a pipeline-based approach (also used in Studio UI grids). This change is driven by technical and maintenance considerations, as the tree-based implementation has limitations in terms of consistency, flexibility, and extensibility. The new architecture aligns with how Pimcore Studio UI grids work internally, streamlining the implementation across adapters and improving consistency, stability, and extensibility.

Existing configurations created in the Classic UI remain functional and continue to execute without changes. However, a configuration must be fully migrated to the new pipeline-based format before it can be edited in Pimcore Studio. Migration must be done manually by following the steps provided in the Pimcore Studio UI.

Read-only support for the legacy tree-based schema definitions will be removed in version 2027.1.0.

Upgrade to 3.0.0

  • File name configuration has been changed. Please make sure to extract the date/time format options into the new "date format for filename" field. Additionally, the format options have to be adjusted to the Carbon format. For example, %Y-%m-%d_%H-%i-%s has to be changed to Y-m-d_H-i-s. Further documentation on Carbon format options is available here.
  • Change return type to bool of exportData in ExporterTypeInterface and AbstractExporter

Upgrade to 2.2.0

  • The folder where the temporary file and the output file will be generated can now be configured in the flysystem configuration.

Upgrade to 2.1.0

  • Make sure all running exports are done prior to upgrading to version 2.1.0.

Upgrade to 2.0.0

  • Make sure all running exports are done prior to upgrading to version 2.0.0.

Upgrade to 1.1.0

  • Execute all migrations of the bundle.

Upgrade to Pimcore X

  • Update to latest (allowed) bundle version in Pimcore 6.9 and execute all migrations.
  • Then update to Pimcore X.