У меня есть категория продуктов, для которых (по закону) необходимо изменить налоговую ставку, когда вы заказываете больше определенного количества. Я расширил различные налоговые модели, чтобы это работало, когда вы добавляете новый продукт в корзину, но у меня возникают проблемы, когда пользователь обновляет количества в корзине или добавляет дополнительные продукты, которые превышают пороговое значение, уже находящееся в корзине. количество.
Проблема 1:
Прежде всего, я не на 100% какое событие (я) наблюдаю. Я пробовал следующее;
checkout_cart_save_after
(на основании этого -> https://stackoverflow.com/questions/14362702/magento-programatics-update-cart-via-event )
checkout_cart_update_items_after
(на основании этого -> https://stackoverflow.com/questions/5104482/programmatics-add-product-to-cart-with-price-change )
sales_quote_save_before
(на основании этого -> https://stackoverflow.com/questions/7638858/magento-recalculate-cart-total-in-observer )
Проблема 2:
Я могу получить доступ к пунктам цитаты из корзины, есть множество способов сделать это, как кажется. Я также могу перебирать отдельные элементы в корзине, обновлять свойства этих элементов и затем сохранять элементы (по крайней мере, временно). Тем не менее, я не могу сохранить квоту и пересчитать налоги в кассе.
Частично причина в том, что, хотя я могу получить доступ к цитате корзины, я не уверен, какой метод использовать, чтобы иметь возможность писать в нее.
Что я попробовал:
То, что я пробовал с точки зрения доступа к содержимому корзины, зависело от события, которое я наблюдал, но я пробовал все следующее;
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();
Тот, который, по-видимому, по крайней мере позволяет мне получить доступ к цитате, просмотреть их и обновить элементы,
6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();
Это позволяет мне обновлять каждый элемент цитаты, когда я выполняю итерацию (я считаю, что использую магические сеттеры, так как не могу найти соответствующие методы). Я надеялся, что смогу обновить идентификатор класса налога для позиции цитаты, а затем пересчитать налоги. Если я использую следующее (где $ taxClassId отличается от того, который уже используется каждым элементом цитаты);
$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;
И затем зарегистрируйте результаты;
Mage::log($item->debug(), null,'taxobserver.log', true);
Это показывает, что я действительно обновил этот пункт цитаты и изменил налоговый идентификатор. Тем не менее, если я затем выполню и попытаюсь сохранить измененную цитату;
$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();
А затем снова отладить;
Mage::log($item->debug(), null,'taxobserver.log', true);
Мои изменения не были сохранены, изменение позиции котировки было сброшено, а итоги корзины не были пересчитаны. Начинаю задумываться, может ли решение этой проблемы найти высокое здание, с которого можно спрыгнуть.