У мене є категорія товарів, на які (юридично) потрібно змінити ставку податку, коли ви замовляєте більше певної кількості. Я розширив різні моделі оподаткування, щоб це працювало, коли ви додаєте новий товар у кошик, але у мене виникають проблеми, коли користувач оновлює кількість у кошику або додає додаткові продукти, які доводять кількість вже в кошику понад поріг кількість.
Проблема 1:
Перш за все, я не на 100%, яку подію (ів) слід спостерігати. Я спробував наступне;
checkout_cart_save_after
(виходячи з цього -> https://stackoverflow.com/questions/14362702/magento-programatic-update-cart-via-event )
checkout_cart_update_items_after
(виходячи з цього -> https://stackoverflow.com/questions/5104482/programmatic-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);
Мої зміни не збережено, зміна елемента котирування було скинуто, а загальна кількість кошиків не перераховується. Починаючи замислюватися, чи можна знайти високу споруду, щоб скочити, може бути рішенням для цього.