Externes Update des Warenkorbes bei eingeloggtem User

#1

Hallo zusammen,

ich bin gerade dabei, ein Modul für einen geplanten Shop (6.1) zu entwickeln.
Ziel ist es, dass Daten von einem externen System in den Warenkorb eines Users gelegt werden.

Ich habe dazu die Klasse “FrontendController” etwas “missbraucht”, um einen Controller zu haben, den ich von extern aufrufen kann und dem ich per GET die gewünschten Daten mitgeben kann.

Das funktioniert soweit auch alles ganz gut und der Warenkorb wird in der DB gespeichert… bis zu dem Zeitpunkt, an dem sich der entsprechende User einloggt.

Nach dem Login werden erstmal sämtliche Daten des “savedbasket” aus der Datenbank gefischt und in den Basket geladen. Soweit, so gut
Alle Artikel, die ggf. nach dem Login noch ankommen, wandern zwar in die Datenbank, werden aber nicht mehr im Frontend angezeigt. Das wiederum ist allerdings eine Anforderung. Die Artikel sollen “on the fly” im Shop sichtbar werden (bzw. zumindest nach einem [F5])

Hat jemand so etwas ähnliches schon fabriziert oder eine zündende Idee für mich?

Vielen Dank und liebe Grüße!

#2

Hi,

dafür gibt’s doch die toBasket-Funktion: https://goo.gl/J4YQpJ

#3

Hmmm, ok vielleicht habe ich auch nur einen Denkfehler.

Die BasketComponent ist ja im Frontend überall verfügbar. Ich habe aber beim Hinzufügen der Artikel keine Information darüber, ob der Kunde aktuell eingeloggt ist oder nicht. Daher nutze ich erstmal den Basket an sich und rufe die Funktion “addToBasket” auf.

Anbei ein kurzer Schnipsel:

    $oBasket=oxNew(\OxidEsales\Eshop\Application\Model\Basket::class);
    $oBasket->setBasketUser($oUser);
    $oBasket->load();       
    $oBasket->addToBasket($sArtId, $iQuantity);             
    //to save the data in DB 
    $oBasket->calculateBasket();

Das funktioniert auch solange wunderbar, solange der User nicht eingeloggt ist.
Beim Einloggen zieht er sich dann den passenden Warenkorb aus der oxuserbaskets

Erst danach fängt eigentlich mein Problem an, denn der Warenkorb des Users ist ja mit der Session verknüpft, auf die ich, nach meinem Verständnis, in meinem Controller kein Zugriff habe.
Sollten jetzt noch Daten der externen Quelle kommen, werden diese dem aktiven Nutzer nicht mehr angezeigt, da die Daten aus der Datenbank ja bereits in die Session geladen wurden.

#4

Du müsstest beim eingeloggten Benutzer den Timestamp der letzten Änderung im WK in der DB prüfen und wenn es neuer ist, als der Timestamp des WK in der Session, dann WK neuladen.

#5

Hallo,
vielen Dank für die Unterstützung. Mittlerweile funktioniert mein Vorhaben, auch wenn es mir deutlich mehr Zeit gekostet hat als notwendig (Stichwort: PHP Fatal error Out of Memory)

Ist sicherlich nicht der sauberste Code, macht aber das was ich brauche. Die Auswirkungen auf die Performance kann ich noch nicht abschätzen, wird aber noch getestet. Allerdings ist der Shop auch nur einer sehr begrenzten Nutzergruppe zugänglich.

Und abschließend noch eine Frage als Forenneuling:

Wie kann ich denn das Thema als erledigt markieren?

Viele Grüße