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. PHP8.5is now supported. - Dropped support for PHP
8.3and Symfonyv6. - Removed the
pimcore/admin-ui-classic-bundledependency. - 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 viarouting.ymlusing attribute-based routing. PimcoreDataHubFileExportBundleno longer implementsPimcoreBundleAdminClassicInterfaceand no longer usesBundleAdminClassicTrait.PimcoreDataHubFileExportBundle::registerDependentBundles()no longer registersPimcoreAdminBundle.- Note:
PimcoreDataHubFileExportBundleis notfinalas 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
ExporterInterfaceinstead of directly via theExporterTypeInterface. 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 yourconfig.ymlor environment variables accordingly. TransmitterInterfaceandAbstractTransmitterno longer depend onExporterTypeInterface. The methodssetExporterType()/getExporterType()have been replaced bysetExporter(ExporterInterface)/getExporter(). Custom transmitters must be updated to use the newExporterInterfaceto access the file and storage.ExporterInterfacehas two new methods:getFile(): stringandgetFileStorage(): FilesystemOperator. Custom exporter implementations must implement these methods.
Removed StudioFile Class — Merged into AbstractExporter
Pimcore\Bundle\DataHubFileExportBundle\Exporter\StudioFilehas been removed. All Studio GridService-based data extraction logic has been moved intoAbstractExporter. Custom classes that extendedStudioFilemust now extendFileinstead.- The service ID
pimcore.datahub.fileExport.exporter.studioFilehas been renamed topimcore.datahub.fileExport.exporter.file. TheHelper::STUDIO_EXPORTER_SERVICEconstant 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 $gridServiceandOutputFormatterLoaderInterface $formatterLoader, inserted before the$exporterTypesarray parameter. The new signature is:Custom exporters that extendpublic function __construct(
LocaleServiceInterface $localeService,
EventDispatcherInterface $eventDispatcher,
RouterInterface $router,
AssetRelationFixer $assetRelationFixer,
LoggerInterface $applicationLogger,
GridServiceInterface $gridService, // NEW
OutputFormatterLoaderInterface $formatterLoader, // NEW
array $exporterTypes = [],
array $transmitter = [],
)AbstractExporterorFileand override the constructor must update their signatures to include these parameters and pass them toparent::__construct().
Data Extraction Now Uses Studio GridService Exclusively
AbstractExporterno longer callsDataObject\Service::getCsvDataForObject(). All data extraction is now performed through the StudioGridServiceInterface::getGridDataForElement().- The legacy grid config format (
schema.config.columnswithhelperDefinitions) is no longer supported by the base exporter. Configurations must use the Studio column format (schema.columns). getGridConfigData()now returnsarray{columns: array, language: ?string}instead of the previousarray{fields: array, helperDefinitions: array, language: ?string}. Code that relied on thefieldsorhelperDefinitionskeys must be updated.getFieldMapping()now derives headers fromcolumn['label'] ?? column['key']instead ofDataObject\Service::getCsvDataForObject().getItemData()now has an explicit return type ofarray|bool.- The protected method
fixAssetRelations()has been removed and replaced by the private methodfixStudioAssetRelations(), which delegates to registeredOutputFormatterinstances. Custom exporters that overrodefixAssetRelations()must migrate to theOutputFormattersystem instead. - The protected method
mapLabelToOperatorId()is no longer called fromgetItemData().
Logger Interface Change
AbstractExporter::$applicationLogger,AbstractExporter::__construct()andAbstractTransmitter::setApplicationLogger()now type-hint againstPsr\Log\LoggerInterfaceinstead ofPimcore\Log\ApplicationLogger. Custom exporter and transmitter classes that override these must update their type hints accordingly.Exporter\Type\AbstractExporter::__construct()constructor parameter$applicationLoggerchanged fromApplicationLoggertoLoggerInterface.- The
ApplicationLoggernamespace was updated fromPimcore\Log\ApplicationLoggertoPimcore\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— nowfinaland@internalExportFileCommand— nowfinaland@internalExportExecutionDispatcher— nowfinaland@internalExportExecutionHandler— nowfinaland@internalExportExecutionMessage— nowfinal readonlyand@internalConfigurationEventSubscriber— nowfinaland@internalCronExecutionService— nowfinaland@internalExporterServiceCollector— nowfinaland@internalInstaller— nowfinaland@internalResetConfigEvent— nowfinal; properties changed fromprotectedtoprivateValidateConfigEvent— nowfinal; property changed fromprotectedtoprivateDataObjectSubscriber— now@internal(notfinal, as it is extended bydata-hub-productsup)
Return Type Changes
Installer::getLastMigrationVersionClassName()return type changed from?stringtostring(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-%shas to be changed toY-m-d_H-i-s. Further documentation on Carbon format options is available here. - Change return type to
boolofexportDatainExporterTypeInterfaceandAbstractExporter
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.