# Warenkorb nach ItemId auslesen?

**URL:** <https://forum.shopware.com/t/warenkorb-nach-itemid-auslesen/59664>\
**Category:** Programmierung\
**Created:** [22. Mai 2019 um 13:08 UTC](https://forum.shopware.com/t/warenkorb-nach-itemid-auslesen/59664 "2019-05-22T13:08:30Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![paddelboot](https://avatars.discourse-cdn.com/v4/letter/p/e95f7d/32.png) [@paddelboot](https://forum.shopware.com/u/paddelboot)\
**Post date:** [22. Mai 2019 um 13:08 UTC](https://forum.shopware.com/t/warenkorb-nach-itemid-auslesen/59664/1 "2019-05-22T13:08:30Z")

</div>

Hallo,

Ich habe hier einen Subscriber für das Event _Shopware\_Modules\_Basket\_UpdateArticle\_Start._

Hintergund: ich möchte bei jeder Aktualisierung des Warenkorbes die Staffelpreise prüfen - diese kommen von einer externen REST API.

Das Event liefert 2 Parameter, ID und Quantity. Die ID gehört zur jeweiligen Warenkorbposition, **wie lese ich diese nun aus** (Artikel, Stückzahl, Preis usw)?

Es gibt die sBasket::sGetBasket() - Funktion, aber wie komme ich da ran von meinem Plugin aus?

Ich habe mir auch die beiden Services _shopware.cart.basket\_helper_ und _shopware.cart.basket\_query\_helper_ angeschaut, keine davon liefern den Warenkorb (nach Position) zurück.

_Shopware()-\>Modules()-\>Basket()-\>sGetBasket()_ führt in dem besprochenen Event zu einem Fehler, vermutlich weil es selber das Event auslöst.

Wie kommt man hier weiter?

Danke, Paddelboot

---

<div class="post-metadata">

**Author:** ![paddelboot](https://avatars.discourse-cdn.com/v4/letter/p/e95f7d/32.png) [@paddelboot](https://forum.shopware.com/u/paddelboot)\
**Post date:** [22. Mai 2019 um 13:33 UTC](https://forum.shopware.com/t/warenkorb-nach-itemid-auslesen/59664/2 "2019-05-22T13:33:50Z")

</div>

PS: die sBasket::sGetBasket() bringt mich nicht weiter, weil sie die updateCartItems() aufruft, in der das Event ausgelöst wird. Ich stehe hier echt vor einer Schleife, warum ist es in Shopware so schwierig, eine simple Aktion wie das programmatische Auslesen des Warenkorbs beim Aktualisieren hinzubekommen?

---

<div class="post-metadata">

**Author:** ![paddelboot](https://avatars.discourse-cdn.com/v4/letter/p/e95f7d/32.png) [@paddelboot](https://forum.shopware.com/u/paddelboot)\
**Post date:** [23. Mai 2019 um 09:50 UTC](https://forum.shopware.com/t/warenkorb-nach-itemid-auslesen/59664/3 "2019-05-23T09:50:44Z")

</div>

Eine mögliche Herangehensweise:

Die Session-ID auslesen (indem man den Session-Service via DI an die eigene Klasse übergibt) und dann den Warenkorb-Posten direkt aus der s\_order\_basket auslesen, denn dort steht neben dem Artikel auch der Preis.

&nbsp;

Außerdem habe ich das Event _Shopware\_Modules\_Basket\_getPriceForUpdateArticle\_FilterPrice_ in der Klasse _sBasket_ gefunden. Damit können Artikelpreise im Warenkorb gefiltert werden.

---

<div class="post-metadata">

**Author:** ![R4M](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/r4m/32/9983_2.png) [@R4M](https://forum.shopware.com/u/R4M)\
**Post date:** [23. Mai 2019 um 13:08 UTC](https://forum.shopware.com/t/warenkorb-nach-itemid-auslesen/59664/4 "2019-05-23T13:08:45Z")

</div>

> Es gibt die sBasket::sGetBasket() - Funktion, aber wie komme ich da ran von meinem Plugin aus?

&nbsp;Eventuell über ‚Shopware\_Controllers\_Frontend\_Checkout::getBasket::after‘

```
/* Beipsiel */

public static function getSubscribedEvents() 
 {
 $events = Array(
 'Shopware_Controllers_Frontend_Checkout::getBasket::after' => 'afterGetBasket'
 );
 return $events;
}

public function afterGetBasket(\Enlight_Event_EventArgs $args) 
 {
 $basket = $args->getReturn();
 /* hier sortieren, anpassen etc. */
 print_r( $basket['content'] ); // als Kontrolle 
 $args->setReturn($basket);
}

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![paddelboot](https://avatars.discourse-cdn.com/v4/letter/p/e95f7d/32.png) [@paddelboot](https://forum.shopware.com/u/paddelboot)\
**Post date:** [23. Mai 2019 um 16:36 UTC](https://forum.shopware.com/t/warenkorb-nach-itemid-auslesen/59664/5 "2019-05-23T16:36:04Z")

</div>

Danke für das konkrete Beispiel. Das wäre allerdings ein Hook, oder? Von diesen wird ja eher abgeraten, aber vielleicht hilft es mir am Ende doch.

&nbsp;

PS: spricht etwas dagegen, die s\_order\_basket direkt zu bearbeiten? Ich habe mir ein simples Read Model erstellt, um den Warenkorb-Posten auszulesen, funktioniert soweit:

```
namespace MyApp\Models\ReadModels;

use Shopware\Components\Model\ModelManager;
use Shopware\Models\Order\Basket;

class DoctrineQueryBasketItemById implements QueryBasketItemById {

    private $ModelManager;

    public function __construct( ModelManager $ModelManager ) {

        $this->ModelManager = $ModelManager;
    }

    public function execute( int $Id ) {

        return $this->ModelManager->getRepository( Basket::class )->findOneBy( [
            'id' => $Id
        ] );
    }
}

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![R4M](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/r4m/32/9983_2.png) [@R4M](https://forum.shopware.com/u/R4M)\
**Post date:** [24. Mai 2019 um 05:57 UTC](https://forum.shopware.com/t/warenkorb-nach-itemid-auslesen/59664/6 "2019-05-24T05:57:52Z")

</div>

Ja, klar wäre es ein Hook und natürlich ist es nur ein Beispiel auf die Frage. Wenn deine 2. Lösung auch geht oder sogar besser, dann nutze sie 🙂
