Eigenes Facet fehlt in ProductStream

Hallo,

komischerweise fehlt immer mein eigenes Facet auf dem ProductStream Seiten, Der CriteriaRequestHandler wird aufgerufen und er fügt auch den Facet hinzu, jedoch kommt dieser nie beim FacetHandler an. Ich habe alle Facets ausgedumpt die beim supportsFacet abgefragt werden, meiner fehlt leider nur auf dem Produktstream Seiten.

Ich habe folgende Events verwendet:

 Shopware\_SearchBundleDBAL\_Collect\_Facet\_Handlers
 Shopware\_SearchBundleDBAL\_Collect\_Condition\_Handlers
 Shopware\_SearchBundle\_Collect\_Criteria\_Request\_Handlers

Ich konnte im Kern von Shopware auch kein ->resetFacets finden :(.

Hat evtl. jemand eine Idee?

mfg,

Shyim

Hi,

die Filter der Product Streams müssen ein wenig besonders gehandelt werden, da diese möglicherweise mit den bereits im Product Stream hinterlegten Filter kolidieren würden.

Daher resetet zunächst die \Shopware\Components\ProductStream\CriteriaFactory::createCriteria alle Facetten. Die Facetten für Product Streams werden jedoch anschließend fürs Listing über die \Shopware\Components\ProductStream\FacetFilter Klasse gesetzt. 

Diese Klasse kannst du dekorieren um deine eigene Facette in Listings anzuzeigen auch wenn Product Streams verwendet werden.

Solltest du deine Filter Möglichkeit auch bei den Product Streams supporten (Sprich im Backend kann man deinen Filter bei Product Streams auswählen), solltest du dir einmal die Implementierung vom Core ansehen und es genauso machen um keine Kollision mit dem Stream zu bekommen. Sollte das nicht der Fall sein so kannst du deine Facette einfach hinzufügen.

Hoffe das hilft dir weiter.

Gruß Oliver

1 „Gefällt mir“

Hi, wo genau muss ich ansetzen, um diese Klasse zu „dekorieren“? Gibt es ein kurzes Beispiel, wie man ein Facet hinzufügen kann, nachdem diese resettet wurden?

@oldschripp‍

Ich hab es via Dekorieren vom Enlight_Bootstrap_AfterInitResource_shopware_product_stream.criteria_factory gelöst.

class CriteriaFactory implements CriteriaFactoryInterface
{
    private $parentFactory;
    public function __construct(CriteriaFactoryInterface $parentFactory)
    {
        $this->parentFactory = $parentFactory;
    }
    /**
     * @param Request $request
     * @param ShopContextInterface $context
     *
     * @return Criteria
     */
    public function createCriteria(Request $request, ShopContextInterface $context)
    {
        $criteria = $this->parentFactory->createCriteria($request, $context);
        if (Shopware()->Container()->has('MyFacets')) {
            $facets = Shopware()->Container()->get('MyFacets');
            foreach ($facets as $facet) {
                $criteria->addFacet($facet);
            }
        }
        return $criteria;
    }
}

Ich hab meine Facets in den Container gepackt im CriteriaRequestHandler und nach dem resetten füge ich diese wieder hinzu. Wie oben im Beispiel einsehbar. Es gibt bestimmt eine bessere Methode, hatte jedoch in diesem Augenblick einfach keine Lust :slight_smile:

2 „Gefällt mir“

@Shyim besten Dank, sieht gut aus :slight_smile: