Eigene Filter hinzufügen

//edit: Thema hat sich erledigt. Manchmal sollte man erstmal in Ruhe einen Kaffee trinken…  Foot-in-Mouth

 

 

**Hallo, in der Dokumentation gibt es folgenden Artikel um einen Filter hinzuzufügen. 

Doc: https://docs.shopware.com/en/shopware-platform-dev-en/how-to/extend-storefront-listing#adding-new-filter

Dieses Beispiel scheint offenbar nicht zu funktionieren, da in der Console Fehler 500 -> 

Argument 1 passed to Shopware\Core\Content\Product\SalesChannel\Listing\ProductListingSortingRegistry::add() must be an instance of Shopware\Core\Content\Product\SalesChannel\Listing\ProductListingSorting, instance of DRGeolocation\Subscriber\ExampleListingSubscriber given, called in /var/www/vhosts/lopero.de/shopware.lopero.de/vendor/shopware/core/Content/Product/SalesChannel/Listing/ProductListingSortingRegistry.php on line 15

ausgegeben wird.

Hier der Quelltext des Subscribers…

class ExampleListingSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            ProductListingCriteriaEvent::class => 'handleRequest',
            ProductListingResultEvent::class => 'handleResult',
        ];
    }

    public function handleRequest(ProductListingCriteriaEvent $event)
    {
        $criteria = $event->getCriteria();

        $request = $event->getRequest();

        $criteria->addAggregation(
            new EntityAggregation('manufacturer', 'product.manufacturerId', 'product_manufacturer')
        );

        $ids = $this->getManufacturerIds($request);

        if (empty($ids)) {
            return;
        }

        $criteria->addPostFilter(new EqualsAnyFilter('product.manufacturerId', $ids));
    }

    public function handleResult(ProductListingResultEvent $event)
    {
        $event->getResult()->addCurrentFilter('manufacturer', $this->getManufacturerIds($event->getRequest()));
    }

    private function getManufacturerIds(Request $request): array
    {
        $ids = $request->query->get('manufacturer', '');
        $ids = explode('|', $ids);

        return array_filter($ids);
    }
}

 und die services.xml

    name-desc
    filter.sortByNameDescending
    
        desc

hat jemand eine Idee wie man das Problem lösen könnte? 

P.S. Wenn ich die Service Argumente weg lasse scheint es wie gewohnt zu funktionieren, allerdings gibts dann auch keinen neuen Filter.

Den Service den du taggst für das Sorting muss von ProductListingSorting erben

Ok. Der Listener funktioniert soweit und macht genau das was er soll.

Dazu jetzt 2 Fragen

  1. by default werden Artikel aus der product entity geladen. Kann man die entity ändern? Ich möchte die Artikel gern aus der tabelle marketplace_product erhalten. Ich habe ein bisschen mit $criteria->addAggregation herumprobiert allerdings ohne Erfolg. Vielleicht gibt es ja einen einfachen Weg um die entity zu ändern?

  2. die Listener fügen ja nicht wirklich einen Filter im Frontend hinzu. Weiß jemand wie das funktioniert?