Warenkorb-Details im account/orders Bereich auslesen

Hallo,

ich habe für unseren Shop eine Art Membersclub erstellt, in dem Kunden diverse Gutscheine zur Verfügung gestellt und entsprechend verschiedener Kriterien ein- oder ausgeblendet werden. Diese Kriterien fragen insbesondere die Anzahl getätiger Bestellungen, sowie die Anzahl verwendeter Gutscheine des jeweiligen Kunden ab, um diesem entsprechend zutreffende Gutscheine verfügbar zu machen. Diese können anschließend anhand eines Plugins per Klick zum Warenkorb hinzugefügt werden.

(Vorab der Hinweis, dass ich noch relativ neu im Umgang mit Shopware bin und lediglich Grundkenntnisse bezüglich der Erstellung eigener oder der Erweiterung vorhandener Controller besitze.) Um mir jedenfalls auf die genannten Kundendaten innerhalb des Membersclubs Zugriff zu verschaffen, habe ich den Club-Bereich von der ordersAction innerhalb des Account-Controllers abgeleitet. Dazu habe ich die ordersAction dupliziert und lediglich die Bezeichnung in clubAction umbenannt, um den Pfad account/club zu erstellen und hier gleichzeitig die Variablen aus dem orders-Bereich nutzen zu können (siehe Screenshot).

Zudem habe ich entsprechend im Theme die Datei ‚club.tpl‘ erstellt, um dort die gewünschten Club-Inhalte festlegen zu können. Das funktioniert auch alles wie erhofft und ist über den Pfad www.domain.com/account/club zu erreichen.

Nun ist es für einige Funktionen des Clubs allerdings notwendig, darüber hinaus auch den aktuellen Warenkorb abzufragen (Warenkorb-Items, Warenkorbwert, Anzahl der Artikel im Warenkorb). Zu diesem Zweck bräuchte ich neben den Kundendaten in dem Bereich Zugriff auf die sBasket-Variablen, die im Checkout (oder im AJAX-Warenkorb) abrufbar sind. Ich habe diesbezüglich bereits im Internet nach Lösungen gesucht und einige Ansätze ausprobiert, konnte bislang jedoch nicht das gewünschte Ergebnis erreichen, in meinem Template die Warenkorb-Variablen verfügbar zu machen bzw. diese an mein Template zu übergeben.

Für jeden Hinweis wäre ich sehr dankbar.

Viele Grüße,

Yannic

Probier doch mal:

$modules = $this->container->get('modules');
$sGetBasket = $modules->Basket()->sGetBasket();

Ich habe das jetzt nicht getestet. Dann hättest du ggf. den Inhalt vom Warenkorb.

 

PS: Ich würde dir für dein Vorhaben aber empfehlen ein Plugin zu schreiben. Vielleicht machst du das ja schon, aber der Screenshot sieht mir nach Versuchen im Live-System aus. Wenn du den Shop irgendwann mal aktualisiert, dann fliegt alles was du gemacht hast raus.

 

2 Likes

@R4M schrieb:

Probier doch mal:

$modules = $this->container->get(‘modules’);
$sGetBasket = $modules->Basket()->sGetBasket();

Vielen Dank schonmal, das war die Lösung nach der ich gesucht hatte! :slight_smile: Nun habe ich Zugriff auf die Warenkorb-Variablen, allerdings bleibt leider ein Problem bestehen, das ich gehofft hatte über diese Variablen lösen zu können: Wenn man sich auf der Club-Seite befindet, dann zur Shop-Seite geht, einen Artikel zum Warenkorb hinzufügt und anschließend wieder via ‘Zurück’-Button zur Club-Seite navigiert, wird sowohl Warenkorb, als auch sämtliche dazugehörige Variablen nicht korrekt geupdatet. Der Warenkorb wird immer noch als leer angezeigt und entsprechend Gutscheine im Frontend als nicht vefügbar dargestellt, die eigentlich nach dem Hinzufügen eines Artikels verfügbar sein sollten. Erst nachdem man die Seite manuell aktualisiert, wird der Warenkorb und damit die Club-Gutscheine korrekt angezeigt. 

Derzeit hatte ich dieses Problem mit einem etwas unschönen Workaround gelöst, indem ich via JavaScript festgelegt habe, dass, wenn man via Vorwärts- oder Zurück-Button zu der Seite navigiert hat, diese automatisch nach 100ms neu geladen werden soll. Das löste zwar das eine Problem, führte allerdings zu neuen Schwierigkeiten, nämlich, dass man durch diesen Prozess manchmal ausgeloggt wurde. 

Gibt es daher eine andere Möglichkeit, den Warenkorb oder die zugehörigen Variablen in so einem Fall auch ohne Reload der Seite korrekt zu aktualisieren?

1 Like

Ich vermute, dass dies hier mit dem Cache zusammenhängt. Deshalb hätte ich das ganze als eigenen Controller mittels Plugin umgesetzt. So läuft alles über den Controller “Account” und das wird gecacht. Irgendwie versuchen “/account/club” nicht zu cachen. Als Test könnte man ja “Shop im Bearbeitungsmodus verwenden” mal einstellen und mal schauen ob ads Verhalten dann auch noch ist.

Vielleicht hilft ja vor dem Aufruf auch:

$modules->Basket()->sRefreshBasket();

Einfach mal ausprobieren.

2 Likes

@R4M schrieb:

Ich vermute, dass dies hier mit dem Cache zusammenhängt. Deshalb hätte ich das ganze als eigenen Controller mittels Plugin umgesetzt. So läuft alles über den Controller „Account“ und das wird gecacht. Irgendwie versuchen „/account/club“ nicht zu cachen. Als Test könnte man ja „Shop im Bearbeitungsmodus verwenden“ mal einstellen und mal schauen ob ads Verhalten dann auch noch ist.

Vielleicht hilft ja vor dem Aufruf auch:

$modules->Basket()->sRefreshBasket();

Einfach mal ausprobieren.

Leider bleibt der Fehler selbst im Bearbeitungsmodus mit deaktiviertem Caching bestehen. Der Fehler, dass der Warenkorb nicht korrekt geupdatet wird, wenn man einen Artikel hinzufügt und dann eine Seite zurück geht, findet übrigens seitenübergreifend statt. (Falls diese Information bei der Analyse des Problems hilfreich ist.)

Die Funktion sRefreshBasket() hat sich vielversprechend angehört, leider aber auch nichts am Ergebnis ändern können. Ich habe den Befehl versucht folgendermaßen einzubinden:

$modules = $this->container->get('modules');
$modules->Basket()->sRefreshBasket();
$sGetBasket = $modules->Basket()->sGetBasket();

Gerne hätte ich das Ganze übrigens als eigenständiges Plugin umgesetzt, allerdings fehlt mir zum Erstellen eigener Plugins derzeit noch ein wenig die Expertise. Da der Fehler jedoch auch in anderen Bereichen und unabhängig vom Cache besteht, fürchte ich, dass das für die spezielle Problematik auch keine Lösung hätte bringen können.

Hat jemand sonst eine Idee, woran es liegen könnte, dass der Warenkorb beim zurück-navigieren nicht korrekt geupdatet wird?