Tôi có một danh mục sản phẩm (về mặt pháp lý) cần phải thay đổi thuế suất khi bạn đặt hàng nhiều hơn một số lượng nhất định. Tôi đã mở rộng các mô hình thuế khác nhau để hoạt động này khi bạn thêm một sản phẩm mới vào giỏ hàng, nhưng tôi gặp vấn đề khi người dùng cập nhật số lượng trong giỏ hàng hoặc thêm các sản phẩm bổ sung có số lượng trong giỏ hàng vượt quá ngưỡng số lượng.
Vấn đề 1:
Trước hết, tôi không quan sát 100% sự kiện nào. Tôi đã thử như sau;
checkout_cart_save_after
(dựa trên điều này -> https://stackoverflow.com/questions/14362702/magento-programatically-update-cart-via-event )
checkout_cart_update_items_after
(dựa trên điều này -> https://stackoverflow.com/questions/5104482/programmatically-add-product-to-cart-with-price-change )
sales_quote_save_before
(dựa trên điều này -> https://stackoverflow.com/questions/7638858/magento-recalculate-cart-total-in-observer )
Vấn đề 2:
Tôi có thể truy cập các mục báo giá từ giỏ hàng, có rất nhiều cách để làm điều đó dường như. Tôi cũng có thể lặp qua các mục riêng lẻ trong giỏ hàng, cập nhật thuộc tính của các mục đó và sau đó lưu các mục (ít nhất là tạm thời). Tuy nhiên, sau đó tôi không thể lưu báo giá và tính toán lại các khoản thuế trong thanh toán.
Một phần lý do là trong khi tôi có thể truy cập vào báo giá giỏ hàng, tôi không chắc nên sử dụng phương pháp nào để có thể viết cho nó.
Những gì tôi đã thử:
Những gì tôi đã thử về việc truy cập nội dung của giỏ hàng phụ thuộc vào sự kiện tôi đã quan sát nhưng tôi đã thử tất cả những điều sau đây;
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();
Cái mà dường như ít nhất cho phép tôi truy cập vào trích dẫn, chạy qua chúng và cập nhật các mục là
6.
$quote = Mage::getSingleton('checkout/session')->getQuote();
$cartItems = $quote->getAllVisibleItems();
Điều này cho phép tôi cập nhật từng mục trích dẫn khi tôi lặp lại (Tôi tin rằng sử dụng ma thuật khi tôi không thể tìm thấy bất kỳ phương pháp tương ứng nào). Tôi đã hy vọng có thể cập nhật ID Nhóm thuế cho mục báo giá và sau đó tính toán lại các loại thuế. Nếu tôi sử dụng như sau (trong đó $ taxClassId khác với mục đã được sử dụng bởi mỗi mục trích dẫn);
$item->setTaxClassId( $taxClassId );
$item->getProduct()->setIsSuperMode(true);
$item->save;
Và sau đó đăng nhập kết quả;
Mage::log($item->debug(), null,'taxobserver.log', true);
Nó cho thấy rằng tôi thực sự đã cập nhật mục báo giá này và thay đổi ID thuế. Tuy nhiên, nếu sau đó tôi làm theo và cố gắng lưu trích dẫn đã sửa đổi;
$quote->setTotalsCollectedFlag(false)->collectTotals();
$quote->save();
Và sau đó gỡ lỗi một lần nữa;
Mage::log($item->debug(), null,'taxobserver.log', true);
Thay đổi của tôi chưa được lưu, thay đổi mục báo giá đã được đặt lại và tổng số giỏ hàng không được tính toán lại. Bắt đầu tự hỏi nếu tìm một tòa nhà cao tầng để nhảy xuống có thể là giải pháp cho cái này.