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.
quelle
Antworten:
Mein Vorschlag wäre, einen Beobachter auf das
sales_quote_collect_totals_before
Ereignis zu setzen, das in derMage_Sales_Model_Quote::collectTotals
Methode ausgelöst wird, bevor der gesamte Erfassungsprozess gestartet wird. Anschließend iterieren Sie in dieser Observer-Methode die Angebotspositionen und ändern die Steuerklasse für das (bereits geladene) Produktobjekt, das Sie aus der Angebotsposition abrufen können.Versuchen Sie nach dem Festlegen der Informationen für das Produktobjekt NICHT, diese in der Datenbank zu speichern. Wenn die Steuerklasse für das Produktobjekt im Speicher nach Bedarf festgelegt ist, ist dies ausreichend, um die Logik für die Erfassung der Gesamtsummen zu verwenden, die in
Mage_Tax_Model_Sales_Total_Quote_Tax
der Ermittlung der Steuerklasse gefunden wird, auf der die Berechnungen basieren sollen. Das Speichern des Produkts (wie Sie es anscheinend in Ihrem obigen Codebeispiel versucht haben) führt zu schwerwiegenden Leistungsproblemen, schafft Rennbedingungen im Berechnungsprozess und ist einfach keine gute Praxis.Der Grund dafür, dass Sie mit den Ereignissen, mit denen Sie arbeiten möchten, nicht das erreichen können, was Sie erreichen möchten, ist, dass alle Ereignisse nach der Gesamtberechnung ablaufen. Dieser Vorgang wird nur einmal ausgeführt, bevor das Angebot gespeichert wird.
In Bezug auf den Vorgang zum Sammeln von Gesamtsummen sollte darauf hingewiesen werden, dass Sie ihn nach dem Ausführen ohne zusätzliche Arbeit nicht erneut aufrufen können, um ihn basierend auf den Änderungen, die Sie an den Angebotselementen vorgenommen haben, neu berechnen zu lassen. Sehen Sie sich dieses Beispiel aus der Blog-Serie an, die ein Kollege von mir vor kurzem für den Vorgang zum Sammeln von Gesamtsummen zusammengestellt hat:
Wenn Sie eine Ahnung davon haben, wie der Vorgang zum Sammeln von Gesamtsummen wirklich funktioniert, können Sie die erste der vier Teilreihen zum Gesamtsammeln hier genauer lesen: Enträtseln von Magentos collectTotals: Einführung
Zusammenfassend muss ein Ereignis erfasst werden, das vor dem Vorgang zum Erfassen der Gesamtsummen ausgeführt wird (und bevor getAllItems für die Angebotsadressen aufgerufen wird), damit Änderungen, die Sie an den Elementen vornehmen, von den Gesamtsammlern verwendet werden. Ich habe nicht überprüft, ob das vorgeschlagene
sales_quote_collect_totals_before
Ereignis ausgeführt wird, bevor Anrufe an diegetAllItems
unter der Angebotsadresse angegebene Adresse gesendet wurden, aber ich bin mir fast sicher, dass es für die von Ihnen gewünschten Anforderungen funktioniert. Wenn nicht, habe ich hoffentlich genug Kontext bereitgestellt, damit Sie herausfinden können, welches Ereignis Sie abfangen müssen, damit es funktioniert.quelle
Es gibt ein anderes Ereignis:
sales_quote_item_set_product
in Mage_Sales_Model_Quote_Item :: setProductMit diesem Ereignis können Sie die Produktsteuerklasse ändern. Verwenden Sie die Methode quoteItem getQty, um die Menge zu ermitteln, die dem Einkaufswagen hinzugefügt wurde.
quelle
Vielleicht ist der Versuch, die Steuerklasse zu ändern, nicht der beste Ansatz. Erstellen Sie ein ähnliches Produkt für Produkte, die die höhere Steuerklasse verwenden, und legen Sie für dieses Produkt eine Mindestmenge im Warenkorb fest. Dann verwenden Sie die
checkout_cart_update_items_after
, um Produkte basierend auf der Gesamtmenge im Warenkorb zu tauschen.Dies ist definitiv keine "Best Practice", aber es könnte Ihnen helfen, in eine andere Richtung zu denken.
Alternativ können Sie unter http://www.mageworx.com/multi-fees-magento-extension.html eine Option einrichten, bei der Sie eine Gebühr für die zusätzliche Steuer hinzufügen. Dies könnte tatsächlich eine schönere Methode sein, wird aber nicht in den Steuersummen angezeigt, sondern eher als zusätzliche Gesamtsumme der Bestellungen.
quelle
Benutze das
<sales_quote_collect_totals_before>
und in deiner Funktion gerne
Ich hoffe das wird definitiv funktionieren
quelle