Preisberechnungs-Plugin um HTTP-Cache und sBasket erweitert

Das Showcase-Plugin SynonynousPriceCalculator für Shopware 5.2 berücksichtigt in der neusten Version nun auch das Caching durch den HTTP Cache sowie das Hinzufügen von Artikel in den Warenkorb.

Erweiterung der HTTP Cache ID

Für gewöhnlich cached Shopware mittels des integrierten HTTP Cache komplette Seiten. Auch jene Teile, die einen Preis anzeigen. Ausgenommen hiervon sind lediglich ESI Tags.

Der Cache erkennt im Falle der Artikeldetailseite oder der Kategorieseiten anhand der Article-ID und der Kundengruppe des Kunden, ob die Seite aus dem Cache oder aus dem Core ausgeliefert werden soll und ob die generierte Seite für zukünftige Requests im Cache hinterlegt wird.

Dieses Muster funktioniert wunderbar, solange sich die Preise nur je Kundengruppe – dem Standard bei Shopware – unterscheiden. Wenn ein Plugin nun allerdings die Preise aufgrund anderer Kriterien berechnet – im Extremfall könnten dies zum Beispiel unterschiedliche Preise je Kunde sein – würde der HTTP Cache falsche Daten / Preise liefern.

Um diesem Fakt Rechnung zu tragen, konsumiert das SynonymousPriceCalculation Plugin den Event  Shopware_Plugins_HttpCache_GetCacheIds. Dieser FilterEvent wird getriggert, sobald die Cache IDs anhand des Requests zusammengestellt werden. Über den Event greift die Methode filterHttpCacheId() und fügt hier zu Demonstrationszwecken die ID des aktuell eingeloggten Users der Cache ID hinzu. Somit wird die Seite und auch der Preis für alle Gast-User und für jeden eingeloggten User getrennt gecached.

sBasket – Preisberechnung im Cart und Checkout

Die sBasket Klasse – im Shopware Core zuständig für das Management von Cart und Checkout – basiert, so wie auch einige andere Teile des Shopware Systems, aktuell noch auf der alten, nicht serviceorientierten Architektur. Das führt dazu, dass die Preise beim Hinzufügen eines Produkts zum Warenkorb und auch während des Checkout-Prozesses nicht über den von dem Plugin dekorierten PriceCalculationService gezogen werden, sondern über eigene Queries in der sBasket Klasse berechnet werden. Daher ist es nötige neben dem Service Decorator noch zusätzlich die Berechnung der Preise im Checkout zu modifizieren.

Für diese Modifikation bietet sich der Filter-Event  Shopware_Modules_Basket_UpdateArticle_FilterSqlDefault an. Dieser Event ermöglicht das Filtern des SQL Queries, der für die Preisberechnung herangezogen wird.

Der Event-Callback ruft die Methode basketUpdateArticleFilterSql() auf, in der wiederum über den PriceCalculationService der korrekte Preis in den SQL Query injiziert wird.

Zusammenfassung
Preisberechnungs-Plugin um HTTP-Cache und sBasket erweitert
Titel
Preisberechnungs-Plugin um HTTP-Cache und sBasket erweitert
Beschreibung
Das Showcase-Plugin SynonynousPriceCalculator für Shopware 5.2 berücksichtigt in der neusten Version nun auch das Caching durch den HTTP Cache sowie das Hinzufügen von Artikel in den Warenkorb.
Autor
Publisher
synonymous.rocks
Logo

8 Kommentare

In diesem Beitrag kannst Du Kommentare verfassen.


  • Hallo synonymous,

    das ist ein super Projekt. Bin gerade ein wenig am testen und hänge aktuell daran, Daten die von mir per ajax Post an den neuen decorated PriceCalculationService zu senden richtig anzunehmen. Hättest du vielleicht dafür einen Ansatz wie ich das am besten aufbaue?

    Danke und viel Erfolg bei deinen weiteren Projekten

    Corny

    Corny 1 Jahr ago Antworten


    • Hallo Corny,

      An sich nütze ich den Dekorator ausschließlich direkt in Verbindung mit dem Product-Service und nie explizit. Aber an sich spricht nichts dagegen, den PriceCalculationService auch explizit zu nützen. Du musst dafür aber zuerst das Produkt-Struct (ListProductStruct) erzeugen und gemeinsam mit dem Kontext an den Service übergeben. Dann erhältst Du auch die dekorierten Preise.

      Das ProductStruct kannst Du Dir anhand der Artikelnummer oder – ID aus dem ListProductService ziehen.

      Liebe Grüße,
      Synonymous

      synonymous 1 Jahr ago Antworten


      • Hallo Synonymous,

        danke für die schnelle Antwort. Auf den Ansatz wäre ich nicht gekommen. Ich habe aktuell wenig Zeit mich einzulesen und wollte daher Fragen ob du bereit wärest gegen einen kleinen Obolus dein Plugin in die Richtung weiter zu entwickeln oder eine extra Version welche meine Anforderungen erfüllt zu erstellen..

        Wir können gerne alles weitere per Email besprechen. Schreib mich einfach unter der von mir hinterlegten Email an.

        Beste Grüße

        Corny

        Corny 1 Jahr ago Antworten


        • Hallo Corny, Sorry – da muss ich passen. Es handelt sich dabei ja lediglich um ein Demo für andere Entwickler sehen zu können, wie man Preise manipuliert und nicht um ein fertiges Plugin.

          synonymous 1 Jahr ago Antworten


  • Hi,

    Das Plugin als Basis ist Super, danke dafür.

    Ich möchte in dem Plugin noch einbauen das mit einem Schalter alle Preise bei der Kundengruppe Händler umgeschaltet werden auf die Kundengruppe EK Endkunde.

    Dazu manipuliere ich die Kundengruppe einfach die dieser Funktion was auch funktioniert.

    $customerGroup = $context->getFallbackCustomerGroup();

    Diese Preise kommen aus dem Plugin mir einer eigenen Berechnung, das geht auch.
    Allerdings habe ich nich das Problem das immer noch zzgl. MwSt angezeigt wird.

    Mein Ziel ist es die Preise und alles was dazugehört als UVP inkl. MwSt anzuzeigen wie wenn der Händler nicht eingeloggt ist.
    Nich um diese so zu kaufen, am besten eine Sicherheit eingebaut das beim Checkout wieder alles normal angezeigt wird.

    Könnte man evtl. ganz einfach direkt am Anfang der Customer Struct anfangen um UVP Preise anzuzeigen.
    Ich vermute die Werte in der Session müssten teilweise auch überschrieben werden?

    Hast du da eine Idee?

    Vielen Dank und Gruß Markus

    Markus 5 Monaten ago Antworten


  • Damit habe ich es hin bekommen

    $session->offsetSet(‚groupkey‘, ‚EK‘);
    $session->offsetSet(‚tax‘, 1);
    $session->offsetSet(‚taxinput‘, 1);

    Allerdings würde ich mich über Ideen für den UVP Schalter weiterhin freuen.

    VG

    Markus 5 Monaten ago Antworten


  • Die Session sUserGroupData müssen auch noch überschrieben werden.

    [sUserGroupData] => Array ( [id] => 4 [groupkey] => Vk2 [description] => Händler [tax] => 0 [taxinput] => 0 [mode] => 0 [discount] => 0 [minimumorder] => 10 [minimumordersurcharge] => 0 )

    Markus 5 Monaten ago Antworten


  • Die Lösung ist die Session Variable sOutputNet . mit dieser alleine kann ich die UVP Funktion umsetzen.

    $session->get(sOutputNet); // Nettoanzeige

    1 = netto
    nichts = brutto

    Markus 5 Monaten ago Antworten


Kommentar verfassen

Folge mir auf Twitter

Hol Dir kostenlos Tipps und Tricks zu Shopware, E-Commerce und andere Open-Source Produkte.

Folge @synonymousrocks