Manipulation der Funktion checkIfArticleIsInBasket

Hallo zusammen,

ich bräuchte wieder mal Hilfe von den Shopware Experten.

 

Ich möchte die Funktion manipulieren, die beim Hinzufügen eines Artikels in den Warenkorb, der schon dort liegt, keinen eigenen Eintrag macht, sondern den bestehenden Artikel “aufstockt”.

Das ist checkIfArticleIsInBasket in sBasket. Dort wird ein Query Builder aufgesetzt, den ich über den gesetzten Controller Shopware_Modules_Basket_AddArticle_CheckBasketForArticle manipulieren kann.

Ich möchte nun eine weitere Bedingung zu diesem Query Builder hinzufügen: Nur wenn das attribute1 des s_order_basket Eintrags (in s_order_basket_attributes) einen gewissen Wert hat, soll der Basket Eintrag zurückgegeben werden, ansonsten eben nicht. Ich habe jetzt schon einiges versucht (u.A. das from zu erweitern oder mit leftJoin) aber habe es nicht geschafft, die s_order_basket und s_order_basket_attributes vernünftig zu verknüpfen, indem ich den Query Builder nur erweitere.

Hat hier jemand einen Tipp für mich? Der Query Builder macht mir im allgemeinen noch Schwierigkeiten.

 

Beste Grüße und ein schönes Wochenende!

@SebastianKlöpper‍ ich denke das wäre - ohne unhöflich sein zu wollen - genau deine Frage :wink:

Hi,

was genau hast du denn bisher versucht? Das Event ist grundsätzlich erstmal korrekt. shopware/sBasket.php at 9c393b1218815589b6c05aa41a962fa90b30454a · shopware/shopware · GitHub

Von der Idee her, gibt das Ding entweder die ID und Quantity eines bereits im WK befindlichen Artikels zurück, mit dem der aktuelle Artikel zusammengeführt werden kann - oder eben nicht, dann handelt es sich um ein zusätzliches Line Item. Für weitere Hilfe wäre es da einfach hilfreich, wenn du kurz den aktuellen Code zeigst und beschreibst, was das Problem damit ist.

Bestmen Gruß,

Daniel

Hallo Daniel,

danke für deine Antwort!

Ja, das habe ich soweit verstanden.

Mir geht es jetzt um die Erweiterung des Querys selbst, das ich ja direkt über den Controller erweitert kann, das klappt auch schon. 

Etwas wie 

$builder->leftJoin('s_order_basket_attributes','attributes')
->andWhere('s_order_basket_attributes.basketID = s_order_basket.id')
->andWhere('s_order_basket_attributes.attribute1 = :attribute1')
->setParameter('attribute1', 'XYZ');

hätte ich mir vorgestellt. Ich möchte also, die Bedingung “dar Eintrag muss als Attribut1 XYZ haben” zum Query hinzfügen, nur dann sollen ID und Quantity des Warenkorbeintrags zurückkommen, ansonsten halt nichts.

Das funktioniert so aber leider nicht, was mache ich falsch? 

Danke bereits im Voraus & ein schönes Wochenende!

Hi,

“funktioniert nicht” ist aber keine Fehlermeldung - sondern einfach nicht das gewünschte Resultat? Schau dir mal die Doku zu den Join Clauses an, das sieht mir noch nicht korrekt aus: http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/query-builder.html#join-clauses. leftJoin hat vier Parameter, drei davon verpflichtend:

$fromAlias The alias that points to a from clause.
$join The table name to join.
$alias The alias of the join table.
$condition The condition for the join.

Besten Gruß,

Daniel

Hallo, falls es noch relevant ist:

            $queryBuilder->leftJoin('basket', 's_order_basket_attributes', 'attributes', 'attributes.basketID = basket.id')
                ->andWhere('attributes.attribute1= :attribute1')
                ->select('basket.id', 'quantity')
                ->setParameter('attribute1', 'XYZ'));

Die Select-Methode muss erneut aufgerufen werden, damit die id-Spalte, die es in beiden Tabellen gibt, eindeutig ist.