Ich habe eine Kategorie von Produkten, deren Steuersatz (rechtlich) geändert werden muss, wenn Sie mehr als eine bestimmte Menge bestellen. Ich habe die verschiedenen Steuermodelle erweitert, damit dies funktioniert, wenn Sie ein neues Produkt in den Warenkorb legen. Es treten jedoch Probleme auf, wenn der Benutzer die Mengen im Warenkorb aktualisiert oder zusätzliche Produkte hinzufügt, die die bereits im Warenkorb befindlichen Mengen über den Schwellenwert bringen Menge.
Problem 1:
Zuallererst bin ich nicht zu 100% der zu beobachtenden Ereignisse. Ich habe folgendes versucht;
checkout_cart_save_after
(basierend auf -> https://stackoverflow.com/questions/14362702/magento-programatically-update-cart-via-event )
checkout_cart_update_items_after
(basierend auf -> https://stackoverflow.com/questions/5104482/programmatisch-Produkt-zum-Warenkorb-mit-Preisänderung hinzufügen )
sales_quote_save_before
(basierend auf -> https://stackoverflow.com/questions/7638858/magento-recalculate-cart-total-in-observer )
Problem 2:
Ich bin in der Lage, auf die Angebote aus dem Warenkorb zuzugreifen. Es gibt viele Möglichkeiten, dies zu tun. Ich kann auch die einzelnen Artikel im Einkaufswagen durchlaufen, die Eigenschaften dieser Artikel aktualisieren und die Artikel dann (zumindest vorübergehend) speichern. In diesem Fall kann ich das Angebot jedoch nicht speichern und die Steuern an der Kasse neu berechnen.
Ein Grund dafür ist, dass ich zwar auf das Warenkorbangebot zugreifen kann, aber nicht sicher bin, welche Methode ich verwenden soll, um darauf schreiben zu können.
Was ich versucht habe:
Was ich versucht habe, um auf den Inhalt des Einkaufswagens zuzugreifen, hing von dem Ereignis ab, das ich beobachtet habe, aber ich habe Folgendes versucht:
1.
$item = $observer->getQuoteItem;
2.
$cart = Mage::getSingleton('checkout/cart');
$cartItems = $cart->getCart()->getItems();
3.
$cart = $observer->getData('cart');
$quote = $cart->getData('quote');
$cartItems = $quote->getAllVisibleItems();
4.
$cartHelper = Mage::helper('checkout/cart');
$cartItems = $cartHelper->getCart()->getItems();
5.
$quote = Mage::getModel('checkout/cart');
$cartItems = $quote->getItems();
Die, die es mir zumindest zu ermöglichen scheint, auf das Angebot zuzugreifen, es durchzugehen und die Artikel zu aktualisieren, ist
6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();
Auf diese Weise kann ich jedes Angebotselement aktualisieren, wenn ich es durchlaufe (ich glaube, ich verwende Magic Setter, da ich keine entsprechenden Methoden finde). Ich hatte gehofft, die Steuerklassen-ID für den Angebotsposten aktualisieren und dann die Steuern neu berechnen zu können. Wenn ich Folgendes verwende (wobei sich $ taxClassId von der bereits von jedem Anführungszeichen verwendeten unterscheidet);
$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;
Und dann die Ergebnisse protokollieren;
Mage::log($item->debug(), null,'taxobserver.log', true);
Es zeigt, dass ich diesen Angebotsposten tatsächlich aktualisiert und die Steuernummer geändert habe. Wenn ich dann jedoch nachverfolge und versuche, das geänderte Zitat zu speichern,
$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();
Und dann erneut debuggen;
Mage::log($item->debug(), null,'taxobserver.log', true);
Meine Änderungen wurden nicht gespeichert, die Angebotsartikeländerung wurde zurückgesetzt und die Warenkorbsummen werden nicht neu berechnet. Man beginnt sich zu fragen, ob es die Lösung für dieses Problem sein könnte, ein hohes Gebäude zu finden, von dem man abspringen kann.