[gelöst] Ajax Warenkorb Summe ändern

Hi Forum,

wie andere zuvor auch, möchte ich gerne das Warenkorbfeld dynamisch ändern. Nun finde ich kein passendes Event.

Mit einem Hook auf sBasket::sGetAmount::after bekomme ich zwar:
$return = $arguments->getReturn();
$return[‘totalAmount’] den Warenkorb Wert.

Ich bräuchte an dieser Stelle allerdings den Warenkorb Inhalt bzw. ein Attribut eines Artikels um den Amount dieses Artikels neu zu berechnen.

Mit:
Shopware()->Modules()->Basket()->sGetBasket() bekomme ich in diesem Hook -> nichts. Das Ladebildchen läuft und Shopware bleibt stecken! Loop?

So, hat jemand einen Masterplan wie ich letztendlich die Ajax Warenkorb Summe, aufgrund einzelner Artikelattribute neu berechnen kann?

Es gibt hier soviele Einträge bzgl. dieses Themas allerdings hat bisher nix geholfen

Danke euch schonmal im Vorraus
-Flo
 

Ja, weil das einzige was in diesem Fall hilft, ist den Shopware-Code durchzulesen bis man es selbst raushat. Das ist hier sehr komplex und auch wenn ich den Warenkorb schon erfolgreich manipuliert habe, müsste ich wissen wie dein Code aussieht und trotz der Code-Dokumentation in meinem Code müsste ich da wahrscheinlich erstmal wieder einen gesamten Tag (kurz übertrieben) reinstecken bis ich genau kapiere warum man wo welchen Umweg machen muss. Und dann bist du das ja evtl. ganz anders angegangen als ich. Da kann man leider nicht einfach mal so helfen außer:

Wühl dich durch den Code von Shopware und tricks da rum bis es „update-sicher“ ist.

Cool,
genau das habe ich gemacht bis ich mich überredet habe hier einen Betrag zu posten.

Hättest du wenigstens einen Anhaltspunkt, ein Event o.ä? Ich habe noch keinen festen Weg, da ich am rumprobieren mit Events bin. Weißt du warum ich über das Objekt

Shopware()->Modules()->Basket()->sGetBasket()

in dem Hook keine Ausgabe bekomme?

Danke dir schonmal für dein Interesse
-Flo

Ich findes es immer toll, wenn bei einem als gelöst markierten Beitrag, die Lösung mit dabei steht. Deshalb hier mein Lösungsweg.

Ziel war es, das Warenkorbfeld bzw. die Summe dynamisch neu zu berechnen. Wir haben für gewisse Artikel Preise pro 100 St. um auf den richtigen Preis zu kommen muss bei der Summenberechnung der Artikel mit der Menge multipliziertund anschließend durch 100 geteilt werden. Als Beispiel:

100 St. kosten 50€. Bestellt werden 90 St. -> (90 * 50) / 100 = 45€
Ich subscribe den Hook

sBasket::sGetAmount::after

In meiner function hole ich mir das return array und erhalte die Summe des Warenkorbes (totalAmount):

# Das Return Array holen
$return = $arguments->getReturn();
# Summe im Warenkorb
$return['totalAmount']

Nun brauche ich eine Datenbankabfrage um an das attribut Feld, in meinem Fall GC_FAKTOR, zu kommen.

$db = Shopware()->DB();
$session_id = Shopware()->SessionID();
$result = $db->fetchAll(
'SELECT 
       sob.quantity as quantity, 
       sob.price as price, 
       saa.GC_FAKTOR as faktor
FROM 
       s_order_basket as sob, 
       s_articles_attributes as saa
WHERE 
       sob.articleID = saa.articleID
AND 
       sessionID = ?',
array($session_id)
);

Da ich nun mein attribute Feld, die Menge und den Preis habe kann ich nun den Wert in totalAmount überschreiben:

# So nun wird die neue Summe in des Warenkorb geschrieben
$return['totalAmount'] = $new_amount;
# Un das ganze zurück geben
$arguments->setReturn($return);

Da in der abgefragten Tabelle bereits der richtige Preis liegt (Staffelpreise, Sonderangebote etc.) ist das Ganze relativ sicher und einwandfrei zu benutzen. Es wäre schön, wenn ich hierfür keinen Hook bräuchte, da aber die function sGetAmount warscheinlich nie von Shopware ersetzt wird ist das Ganze updatesicher!

Falls jemand einen performanteren Vorschlag hätte - immer her damit.

Einen schönen Tag noch
-Flo

Hallo Flo,

nachdem ich den gleichen Weg gegangen bin wie du und mich nach 2 Tagen durchwühlen endlich durchgerungen habe hier zu fragen bin ich ebene auf deine Lösung gekommen. Erstmal vielen Dank das überhaupt eine Lösung gepostet wird.

Ich will ebenfalls einen Preis im Warenkorb modifizieren aber finde einfach nicht den richtigen Hook. Um jetzt mal ganz auf Anfang zu gehen habe ich deine Lösung stark vereinfach nachgebaut:

$return = $arguments->getReturn();
$return['totalAmount'] = '90.0000';
$arguments->setReturn($return);

Leider ändert sich am Preis (Shopware 5.2.2) nichts. Der Hook wird aber ausgeführt den ein print_r($return); liefert mir den Betrag zurück. Vielleicht stehe ich aktuell auch einfach nur total auf dem Schlauch.

Gruß Martin

Tja, also von dem was ich an deinem Schnipsel sehe ist alles richtig! So läufts! Es kann aber an cache Dateien liegen, dass sich nichts ändert?! Vielleicht mal den Template Cache leeren, oder das Plugin neu installieren!

Nur nochmal zum Verständnis: Es soll sich nur das Warenkorbfeld ändern. Der seitliche Warenkorb wird nicht von diesem Hook angesprochen!

Genau genommen will ich den Preis eines Artikels im Warenkorb ändern aber ich bekomme die Daten nicht per AJAX in den Warenkorb. Daher wollte ich jetzt mal ganz an den Anfang zufrück gehen und schauen ob ich aus gehend von diesem Punkt eine Lösung finde. Cache ist aus und das Plugin wird nach jedem ändern des Hook/Event neu installiert.

Ohne deinen Code genauer zu kennen, kann ich da jetzt leider nicht mehr dazu sagen. Gibt den geReturn einen totalAmount bei dir aus?