SearchResult um category Filter erweitern

Hallo,

Der aus Shopware < 5.6 bekannte Kategoriefilter wurde ja auch in Shopware 6 entfernt.
Ich versuche gerade über ein Plugin das SearchResult um eine category Aggregation und einen category Filter zu erweitern.

Ziel ist, dass der search Controller einen zusätzlichen Parameter ‚category‘ akzeptiert, um die Suchergebnisse nach Kategorien filtern zu können.

Beispiel: www.myshop.de/search?search=test&category=c22c5acc170e40f7826c012d4ae08452

Der Parameter category soll entsprechend die ID der Kategorie enthalten.

 

Bisher versuche ich leider erfolglos folgendes:

/**
 * @return array
 */
public static function getSubscribedEvents(): array
{
    return [
        ProductSearchCriteriaEvent::class => 'onTest',
        ProductSearchResultEvent::class => 'onTest2'
    ];
}


public function onTest(ProductListingCriteriaEvent $event)
{
    $categoryId = $event->getRequest()->get('category');

    if ($categoryId) {
        $event->getCriteria()->addAggregation(
            new TermsAggregation('category', 'product.categories.id')
        );
    }
}


public function onTest2(ProductListingResultEvent $event)
{
    $event->getResult()->addCurrentFilter('category', $event->getRequest()->get('category'));

}

 

Die Aggregation und der Filter werden hinzugefügt, die Suchergebnisse werden aber nicht nach der Category gefiltert.

Jemand eine Idee @Shopware?

 

Viele Grüße

Dennis

 

Hi Dennis,

wenn du nur auf die Kategorie filtern möchtest, sollte das eigentlich genügen:

/**
     * @return array
     */
    public static function getSubscribedEvents(): array
    {
        return [
            ProductSearchCriteriaEvent::class => 'onTest',
        ];
    }


    public function onTest(ProductListingCriteriaEvent $event)
    {
        $categoryId = $event->getRequest()->get('category');


        if ($categoryId) {
            $event->getCriteria()->addFilter(new EqualsFilter('product.categories.id', $categoryId));
        }
    }

Gruß

Krispin

1 Like

So einfach kann es gehen!

Damit funktioniert es.

Danke!

@Krispin schrieb:

Hi Dennis,

wenn du nur auf die Kategorie filtern möchtest, sollte das eigentlich genügen:

/**

  • @return array
    */
    public static function getSubscribedEvents(): array
    {
    return [
    ProductSearchCriteriaEvent::class => ‚onTest‘,
    ];
    }

public function onTest(ProductListingCriteriaEvent $event)
{
$categoryId = $event->getRequest()->get(‚category‘);

if ($categoryId) {
$event->getCriteria()->addFilter(new EqualsFilter(‚product.categories.id‘, $categoryId));
}
}

Gruß

Krispin

 

Eine kurze Frage noch: Welchen Unterschied macht es, ob ich addFilter oder addPostFilter verwende? Beides scheint zu funktionieren und der Shopware Standard verwendet bspw. für die manufacturerId ein addPostFilter

Hi Dennis,

dazu gibt es einen Artikel in der Dokumentation, der das gut erklärt: https://docs.shopware.com/en/shopware-platform-dev-en/internals/core/data-abstraction-layer/search#post-filter

Gruß

Krispin

Vielen Dank!