Hi, wir haben ein CMS Element erstellt, das einen Filter und ein Produkt Grid beinhaltet (aufgebaut wie bei einer Product Listing Page).
Für dieses Element haben wir einen Resolver erstellt, der über Dependency Injection Zugriff auf folgende Services hat:
<argument type="service" id="property_group_option.repository" />
<argument type="service" id="sales_channel.product.repository" />
Über die enrich function vom Element Resolver haben wir die korrekten Produkte sowie Properties geladen und dem Filter im Template als „listing“ übergeben.
public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
{
$data = new HomeConfiguratorStruct();
$criteria = new Criteria();
$criteria->setLimit(6);
$criteria->addAssociation('cover');
$criteria->addAssociation('options');
$criteria->addAssociation('properties');
$criteria->addAggregation(
new FilterAggregation(
'properties',
new EntityAggregation('properties', 'properties.groupId', 'property_group'),
[
new EqualsFilter('properties.group.visibleOnProductDetailPage', true)
]
)
);
$criteria->addAggregation(
new EntityAggregation('options', 'properties.groupId', 'property_group_option')
);
// Only show parent products
$criteria->addFilter(
new EqualsFilter('product.parentId', null)
);
$result = $this->_salesChannelProductRepository->search(
$criteria,
$resolverContext->getSalesChannelContext()
);
$result->getAggregations()->getElements();
$data->listing = $result;
$slot->setData($data);
}
Grundsätzlich funktioniert das Product Listing und auch die Properties werden korrekt geladen. Leider fehlen die options bei den properties, die der Filter jedoch braucht. Wir haben etwas mit den associations und aggregations herumgespielt, wirklich erfolgreich wurden wir hier jedoch nicht.
Wir konnten mit „nested aggregations“ zwar erreichen, dass die Properties auch die Options beinhalten, jedoch scheint das auch nur mit TermsAggregations zu funktionieren.
Meine Frage daher: Gibt es eine Möglichkeit EntityAggregations zu verschachteln, bzw. gibt es eine Möglichkeit die Buckets aus dem Result einer nested TermsAggregation in Entities umzuwandeln?
Oder sind wir bei dem Problem gar komplett am falschen Weg?
Im Shopware Core haben wir die Datei ProductListingFeaturesSubscriber.php gefunden, die in der function „groupOptionAggregations“ womöglich das Problem lösen könnte, jedoch kommt uns das ziemlich extrem vor, nur um options von properties bei einer Anfrage mitzuladen.
LG und Danke für jede Hilfe im voraus!