XML Values Keep Their Text When Typing Would Change Them
The XML interpreter no longer converts a numeric looking value to a number when that would change it. 603E709
used to become INF and aborted the import, 0123 was stored as 83. Such values now stay text.
Values that stay text now: 0123 (was 83), 12.50 (was 12.5), 1.0, +5, 1E5, 0x1F, 0b101.
Plain values such as 42, -7, 1.5, true, false and null are converted as before.
If a column with such values is used as identifier (resolver, cleanup) or in a delta check, review it before the
first import after the upgrade: the resolver may not find objects stored under the old value (duplicates), cleanup
may unpublish or remove them, and the affected rows are imported again once.
Operators that rely on a typed value answer differently for these inputs: the Boolean operator gave true for
1.0 and now gives false, the Numeric operator returns 0.0 for 0x1F (was 31).
Skipping Element Persistence From a PreSaveEvent Listener
DataObject\PreSaveEvent now carries a skip flag: a listener can call setSkipSave(true) to stop the import
from persisting the current element. The element is not saved, DataObject\PostSaveEvent is not dispatched, and
the skip is written to the import log. Processing continues with the next record.
A skipped element that already exists is reloaded afterwards, so the changes the mapping applied to it in
memory cannot leak into a later row that resolves the same element.
The flag defaults to false, so imports without such a listener behave exactly as before. No migration needed.
The compiled Studio frontend is no longer committed as an expanded src/Resources/public/studio/build/
directory. It now ships as a single archive (build-dist/build-<id>.zip) that is extracted into
src/Resources/public/studio/build/ automatically during cache warmup.
The extraction is provided by pimcore/studio-ui-bundle, which this bundle already requires at
^2026.2.6. No dependency change is needed.
Read-only filesystem deployments must run bin/console cache:warmup (or cache:clear) during the
build/deploy phase, while the bundle directory (usually below vendor/) is still writable. Standard
Pimcore deployments already do this.
When assets:install runs in copy mode, run cache:warmup before it, otherwise no frontend assets are
copied. If the filesystem becomes read-only before the first warmup, the bundle throws
BuildArchiveNotWritableException, because there is no build to serve.
Removed the pimcore/admin-ui-classic-bundle dependency. The bundle no longer implements
PimcoreBundleAdminClassicInterface and no longer uses BundleAdminClassicTrait.
Removed all ExtJS-based JavaScript and CSS paths. getCssPaths() and getJsPaths() were removed from
PimcoreDataImporterBundle.
PimcoreAdminBundle is no longer registered as a dependent bundle.
The configuration panel is now implemented in Pimcore Studio.
Pimcore\Bundle\AdminBundle\Helper\QueryParams is no longer used. It was replaced by
DataTypeServiceInterface::extractSortingSettings().
The messenger transport DSN is configurable via the %pimcore.messenger.transport_dsn_prefix% container parameter
instead of being hardcoded to doctrine://default. The installer can now wire the transport DSN from environment
variables such as PIMCORE_MESSENGER_TRANSPORT_DSN_PREFIX.