Custom Search Filter: Facetten an die verbliebenen Treffer anpassen

Hallo Community,

ich versuche die Treffer in einer Kategorie auf bestimmte ordernumbers einzuschränken. Das schaffe ich auch, allerdings passen sich die Filter nicht an, sondern zeigen immer noch Optionen, die keine Treffer mehr haben. Ich hätte erwartet, das diese mit unten aufgeführtem Ansatz automatisch angepasst werden. Scheint nicht so zu sein :slight_smile: Was muss ich noch tun?

Mein bisheriger Ansatz mit einem eigenen Plugin:

Im Subscriber:

public static function getSubscribedEvents()
    {
        return [
            'Shopware_SearchBundle_Collect_Criteria_Request_Handlers' => 'registerRequestHandler'
        ];
    }

public function registerRequestHandler()
    {
        return new CriteriaRequestHandler();
    }

 

Der RequestHandler:

public function handleRequest(
        Request $request,
        Criteria $criteria,
        ShopContextInterface $context
    ) {
        $criteria->addCondition(new MyCondition());
    }

Der ConditionHandler:

public function generateCondition(
        ConditionInterface $condition,
        QueryBuilder $query,
        ShopContextInterface $context
    ) {


        $pids = array('SW10152', 'SW10153');

        $query->andWhere('variant.ordernumber IN (:pids)');

        $query->setParameter(
            ':pids',
            $pids,
            Connection::PARAM_STR_ARRAY
        );

    }

Danke schonmal für jeden Tipp!

Bin mittlerweile darüber gestolpert: https://forum.shopware.com/discussion/29032/filterabhaengigkeit

Nach meinen Tests ist es in 5.3 auch noch so, dass die Filter nicht an die aktuelle Ergebnisliste angepasst werden. Kennt jemand einen guten Weg damit umzugehen? Ich erreiche nahezu das gewünschte Verhalten, wenn ich in Shopware\Bundle\SearchBundleDBAL\ProductNumberSearch in der Methode:

private function createFacets(SearchBundle\Criteria $criteria, ShopContextInterface $context)
    {
        if (count($criteria->getFacets()) === 0) {
            return [];
        }

        $facets = [];

        $clone = clone $criteria;

        if (!$criteria->generatePartialFacets()) {
            $clone->resetConditions();
            $clone->resetSorting();
        }

        foreach ($criteria->getFacets() as $facet) {
            $handler = $this->getFacetHandler($facet);

            if ($criteria->generatePartialFacets() && !$handler instanceof PartialFacetHandlerInterface) {
                throw new \Exception(sprintf("New filter mode activated, handler class %s doesn't support this mode", get_class($handler)));
            }

            if ($handler instanceof PartialFacetHandlerInterface) {
                $result = $handler->generatePartialFacet($facet, $clone, $criteria, $context);
            } else {
                trigger_error(sprintf("Facet handler %s doesn't support new filter mode. FacetHandlerInterface is deprecated since version 5.3 and will be removed in 6.0.", get_class($handler)), E_USER_DEPRECATED);
                $result = $handler->generateFacet($facet, $criteria, $context);
            }

            if (!$result) {
                continue;
            }

            if (!is_array($result)) {
                $result = [$result];
            }

            $facets = array_merge($facets, $result);
        }

        return $facets;
    }

die beiden Zeilen:

$clone->resetConditions();
$clone->resetSorting();

auskommentiere.

Hat das jemand schon mal im Rahmen eines Plugins umgesetzt, oder hat jemand einen Tipp welche Strategie ich hier verfolgen kann?