NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #5689 most downloaded on Packagist
ProductStorage module
Last release 26 days ago
11 Sep 2026
Release timing varies
gaps range from 8 days to 4 months
Rarely documented
notes for 12 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
88 releases · first in 2018
Included commits: 1.57.0...1.58.0
Included commits: 1.57.0...1.58.0
AbstractProductViewTransferFinder to build and read its product view transfer cache using attributes selected per product ID instead of the whole selection, ensuring correct cached data when rendering multiple products with different selected attributes on the product detail page.Included commits: 1.56.1...1.57.0
Included commits: 1.56.1...1.57.0
SelectedProductAttributesResolver and ProductStorageFactory::createSelectedProductAttributesResolver() to resolve selected super attribute values that were provided in a foreign locale (e.g. carried over via query string after a language switch) to their current-locale equivalents in ProductStorageClient::mapProductStorageData(), fixing product attribute selection being canceled after a locale change.ProductAbstractStorageReaderInterface::getBulkProductAbstractStorageDataByProductAbstractIdAndLocaleNames() to fetch abstract product storage data for multiple locales in one storage request, with in-memory caching, collector-compatibility mode, and unified-storage fallback support.ProductStorageToLocaleInterface and ProductStorageToLocaleBridge with getLocales().One column per quarter.
Included commits: 1.56.0...1.56.1
Included commits: 1.56.0...1.56.1
Included commits: 1.55.0...1.56.0
Included commits: 1.55.0...1.56.0
Included commits: 1.54.0...1.55.0
Included commits: 1.54.0...1.55.0
OptimizedSimpleArrayFormatter to bulk concrete product queries, reducing memory usage for projects with large product catalogs.spryker/propel-orm constraint to ^1.22.0.Included commits: 1.54.0...1.54.1
Included commits: 1.54.0...1.54.1
ProductConcreteStorageCatalogSearcher to populate all product view transfer fields when mapping to ProductConcretePageSearchTransfer, ensuring the full product data is available during concrete product search.createAttributeMap(), getProductFacade(), and getProductStorageClient() in ProductStorageBusinessFactory from protected to public to allow access from extending classes.Included commits: 1.53.0...1.54.0
Included commits: 1.53.0...1.54.0
ProductConcreteStorageCatalogSearcher to map product images from ProductViewTransfer into ProductConcretePageSearchTransfer, enabling product images to be available in catalog search results.Bug
On the Configurable Bundle configurator slot page (e.g. /DE/en/configurable-bundle/configurator/2/slots/6), non-selected products rendered without images; only the selected product showed its image.
Root cause
Spryker\Client\ProductStorage\ProductConcreteSearch\ProductConcreteStorageCatalogSearcher::mapProductViewTransfersToProductConcretePageSearchTransfers() mapped only fkProduct, fkProductAbstract, sku, name into the ProductConcretePageSearchTransfer and dropped the images. The non-selected product list is rendered by ProductConcreteSearchGridWidget, which consumes these search-result transfers, so it had no image data. The selected product is expanded via a separate path (ConfigurableBundlePage\Expander\ProductConcreteImageExpander) and therefore kept its image.
Fix
Carry the images already resolved by the product view expanders into the search-result transfer:
->setImages($productViewTransfer->getImages()->getArrayCopy())ProductViewTransfer::getImages() returns ArrayObject<ProductImageStorageTransfer>; getArrayCopy() yields array<ProductImageStorageTransfer> matching ProductConcretePageSearchTransfer::setImages(array). Downstream ProductSearchWidget\Mapper\ProductConcreteMapper round-trips via fromArray(toArray()); AbstractTransfer::processArrayObject passes TransferInterface elements through untouched, so images survive. Purely additive — no interface/transfer/schema change (Internal API, MINOR).
Tests
Added ProductConcreteStorageCatalogSearcherTest::testGivenProductViewWithImagesWhenSearchingProductConcretesThenMapsImagesToPageSearchTransfer (Client suite) — fails without the fix (images size 0 vs 1), passes with it. Plus an explicit empty-images boundary assertion. Suite green: 12 tests, 26 assertions.
Verification
data-src (was 1/47).ProductConcreteStorageCatalogSearcher.| Module | Type | Change |
|
Deprecated StorageProductAbstractReadinessProviderPlugin in favor of StorageTableProductAbstractReadinessProviderPlugin .
Included commits: 1.52.0...1.53.0
ProductStorageClient::getRawProductCollection() to support batch retrieval of raw product data from storage, enabling product readiness improvements.ProductStorageRepositoryInterface::getProductAbstractStorageEntriesByIdProductAbstract() to fetch all per-store/locale storage entries for a given product abstract.StorageProductAbstractReadinessProviderPlugin in favor of StorageTableProductAbstractReadinessProviderPlugin.Included commits: 1.51.0...1.52.0
Included commits: 1.51.0...1.52.0
ProductConcreteStorageSearchPlugin to serve concrete product search results from Redis storage via direct SKU lookup and abstract-product fallback, supporting removal of product concretes from the search index.ProductConcreteSuggestionEnricherPlugin to enrich suggest search results with matching concrete product SKUs loaded from storage when product concretes are not indexed in the search engine.spryker/catalog-extension: ^1.2.0 dependency to support the new storage-based search plugin interfaces.ProductAbstractStorageReader::isProductInCurrentStore() to correctly bypass the store-map check when the unified store storage key is used.Included commits: 1.50.2...1.51.0
Included commits: 1.50.2...1.51.0
product_abstract_stores_map field listing which stores carry the product.ProductStorageConfig::isProductAbstractStorageUnifiedEnabled() on the Zed and Client layers and ProductStorageConfig::isProductAbstractStorageUnifiedFallbackEnabled() on the Client layer to allow incremental migration to unified storage without interrupting URL resolution.ProductStorageConfig::PRODUCT_ABSTRACT_STORES_MAP and ProductStorageConfig::PRODUCT_ABSTRACT_STORAGE_UNIFIED_STORE_KEY constants to Spryker\Shared\ProductStorage\ProductStorageConfig.isProductAbstractStorageUnifiedEnabled() method to the shared ProductStorageConfig to enable consistent configuration across Zed and Client layers.ProductStorageFactory::getStorageClient() visibility from protected to public to support unified storage resolution in URL mapper plugins.Included commits: 1.50.1...1.50.2
Included commits: 1.50.1...1.50.2
ProductCategoryStorageFacade::publish() not removing orphaned storage entries — commit() was missing after processing stale store/locale entries, causing batched deletes to never be flushed to the database.Included commits: 1.50.0...1.50.1
Included commits: 1.50.0...1.50.1
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →