Einkaufswelt Produktlisting mit fixem Filter

Hallo zusammen,

in einem eigenen Controller lade ich eine Kategorie-Erlebniswelt. Im Designer sind keine Filter eingestellt erstmal, sondern nur das Produktlisting. Als Kategorie nehme ich die NavigationCategory des aktuellen Sales-Channel und es werden in der Storefront auch alle Artikel ausgegeben.

So sieht der Code im Controller dafür aus:


$page = $this->navigationPageLoader->load($request, $salesChannelContext);

if($cmsPageId){

    // lade root categoriy des aktuellen sales channel
    $category = $this->container->get('category.repository')->search(new Criteria([$salesChannelContext->getSalesChannel()->getNavigationCategoryId()]), $salesChannelContext->getContext())->first();

     // resolver für cms elemente
    $resolverContext = new EntityResolverContext($salesChannelContext, $request, $this->categoryDefinition, $category);

    // lade cms elemente
    $pages = $this->cmsPageLoader->load(
        $request,
        $this->createCriteria($cmsPageId, $request),
        $salesChannelContext,
        null,
        $resolverContext
    );

    if (!$pages->has($cmsPageId)) {
        throw new PageNotFoundException($cmsPageId);
    }

    $page->setCmsPage($pages->get($cmsPageId));

}else{
    throw new PageNotFoundException($cmsPageId);
}

Jetzt die Frage aller Fragen - wie kann ich hier Filter für das Produktlisting übergeben?

Ich habe gedacht, das geht am einfachsten, indem ich die im Request-Objekt hinzufüge:

$request->query->add([
    'manufacturer' => $manufacturerId,
]);

Aber das funktionniert leider nicht; es wird komplett ignoriert :confused:
Dabei müssen die doch daraus entommen werden, wie in den Kategorien auch… was habe ich übersehen?

Im Controller:

$salesChannelContext->addExtension(‚XY‘,[ArrayStruct mit deinen Filtern])

ProductListingCriteriaEvent subscriben

$salesChannelContext vom Event ziehen

Wenn $salesChannelContext->hasExtension(‚XY‘) dann mach Stuff…

1 „Gefällt mir“

joa, das wäre ein Workaround… aber lieber wäre es mir, ich könnte die gleich mitgeben irgendwie.

Shopware selbst macht das genauso, wenn du dir mal im Core den ProductListingFeaturesSubscriber anschaust weißt du was ich meine :wink:

Leider hast du im Controller ja noch keinen Zugriff auf das Criteria Objekt, sonst wär es einfach :wink:

Kannst ja mal:

$request->query->set('manufacturer', 'id123|id234|id345');
$request->request->set('manufacturer', 'id123|id234|id345');

probieren…

Oh man, mein o.g. Beispiel funktioniert doch. Ich habe aber im Designer den Hersteller-Filter deaktiviert, damit der in der Storefront nicht angezeigt wird. Blöd nur das so dann gar nicht nach Hersteller gefiltert wird…

Also, mit aktivierten Filtern funktioniert es, indem man im Request-Objekt einfach die Parameter hinzufügt.