ProductAttributeCondition mit Varianten

Guten Morgen zusammen.

Ich probiere gerade mit einer Search Criteria alle Produkte zurückgeliefert zu bekommen, bei denen ein bestimmtes Attribut gesetzt ist. Funktioniert mit „normalen“ Artikel und der ProductAttributeCondition auch ganz gut. Leider bekomme ich in meinem Result keine Varianten zurück… 

Meine Criteria sieht so aus:

$criteria = new Criteria();
$criteria->addCondition(new IsAvailableCondition());
$criteria->addCondition(new ProductAttributeCondition('custom_attribute', ProductAttributeCondition::OPERATOR_EQ, '4711'));

Kann mit jemand nen Denkanstoß geben, ob und wie ich die Criteria anpassen muss, damit ich sowohl die normalen Artikel wie auch alle Varianten zurück geliefert bekomme bei denen custom_attribute auf 4711 steht?

Viele Grüße
Marco

 

Hallo Marco,

 

das Problem ist hier der Join zwischen s_articles und s_articles_details.

Die QueryBuilderFactory joined nur auf alle Varianten, wenn die VariantCondition im Criteria Object vorhanden ist.

Ansonsten leider immer nur auf die Haupt Variante.

Allerdings kannst Du die VariantCondition nicht einfach so deinem Criteria Object hinzufügen, da der Constructor u.a. die optionIds der varianten als Parameter entgegen nimmt.

Die sind Dir aber ja nicht bekannt.

Die Lösung wäre hier eine eigene Condition zu programmieren.

Im Prinzip ist es eine 1 zu 1 Kopie der ProductAttributeCondition.

Im Condition Handler musst Du Dich dann um die joins aber selbst kümmern:

public function generateCondition(
        ConditionInterface $condition,
        QueryBuilder $query,
        ShopContextInterface $context
    ) {
        /*
         * $this->parse method is Imported from DynamicConditionParserTrait
         */
        
        $query->resetQueryPart('join');
        $query->innerJoin(
            'product',
            's_articles_details',
            'variant',
            'variant.articleID = product.id
                 AND variant.active = 1
                 AND product.active = 1'
        );
        $query->innerJoin(
            'variant',
            's_articles_attributes',
            'productAttribute',
            'productAttribute.articledetailsID = variant.id'
        );

        return $this->parse(
            $query,
            's_articles_attributes',
            'productAttribute',
            $condition->getField(),
            $condition->getValue(),
            $condition->getOperator()
        );
    }