Tôi đang cố thay đổi giao hàng theo đơn đặt hàng hiện có trong Magento. Điều này làm việc tốt từ backend admin, ngay cả khi nó khá là quá trình vì tôi phải cập nhật thủ công nhiều trường/thuộc tính thứ tự sau khi tôi đặt phương thức giao hàng mới trên đối tượng địa chỉ giao hàng và tính toán lại tổng số trích dẫn.Magento: thay đổi phương thức giao hàng theo đơn hàng hiện tại
Vấn đề của tôi là khi chạy cùng mã trên giao diện người dùng, nó hoàn toàn không hoạt động, collectTotals trích dẫn sẽ hoàn nguyên mọi thay đổi tôi đã thực hiện trong shippingAddress và tôi không biết cách giải quyết hoặc tại sao nó hoạt động từ phần phụ trợ.
Đây là cách nó nhìn:
$shippingAddress = $quote->getShippingAddress();
$shippingAddress->setShippingMethod('dynamicshipping_'.$shippingCode);
$shippingAddress->setCollectShippingRates(true);
$shippingAddress->collectShippingRates();
$quote->setUseCustomerBalance(1)->setTotalsCollectedFlag(false)->collectTotals()->save();
$order->setShippingHiddenTaxAmount($shippingAddress->getShippingHiddenTaxAmount());
$order->setBaseShippingHiddenTaxAmount($shippingAddress->getBaseShippingHiddenTaxAmount());
$order->setBaseShippingHiddenTaxAmnt($shippingAddress->getBaseShippingHiddenTaxAmnt());
$order->setShippingInclTax($shippingAddress->getShippingInclTax());
$order->setBaseShippingInclTax($shippingAddress->getBaseShippingInclTax());
$order->setShippingTaxAmount($shippingAddress->getShippingTaxAmount());
$order->setBaseShippingTaxAmount($shippingAddress->getBaseShippingTaxAmount());
$order->setShippingAmount($shippingAddress->getShippingAmount());
$order->setBaseShippingAmount($shippingAddress->getBaseShippingAmount());
$order->setShippingDiscountAmount($shippingAddress->getShippingDiscountAmount());
$order->setBaseShippingDiscountAmount($shippingAddress->getBaseShippingDiscountAmount());
$order->setGrandTotal($shippingAddress->getGrandTotal());
$order->setBaseGrandTotal($shippingAddress->getBaseGrandTotal());
$order->setShippingMethod('dynamicshipping_'.$shippingCode);
$order->setShippingDescription($shippingDescription);
$order->setServicePoint($servicePoint);
$order->save();
Và như tôi đã nói, mà làm việc tốt mỗi khi từ phụ trợ, nhưng không phải khi gọi từ front-end.
Tôi đã thử các biến thể, chẳng hạn như điều này để thử và xóa mọi dấu vết của phương thức giao hàng cũ, không có may mắn.
$quote->getShippingAddress()->removeAllShippingRates()
->setShippingMethod('dynamicshipping_'.$shippingCode)
->setShippingDescription($shippingDescription)
//->setBaseShippingAmount(0)
//->setBaseShippingTaxAmount(0)
//->setShippingTaxAmount(0)
//->setShippingInclTax(0)
->setCollectShippingRates(true)
//->unsetData('cached_items_all')
//->unsetData('cached_items_nominal')
//->unsetData('cached_items_nonnominal')
->collectShippingRates()
//->collectTotals()
->save();
Có vẻ với tôi như thể trích dẫn được sử dụng một cũ/diffrent bản sao của địa chỉ vận chuyển khi tôi gọi collectTotals, bất kể những gì tôi làm.
Bất kỳ đề xuất nào hoặc có lẽ là thông tin chi tiết về cách nó thậm chí có thể thực hiện được điều này trong phần phụ trợ chứ không phải giao diện người dùng?
EDIT
Sau khi gỡ lỗi hơn, tôi có thể thấy rằng vận chuyển không thay đổi cả trong frontend và backend. Vấn đề là, phí sẽ chỉ thay đổi khi chạy mã này thông qua chương trình phụ trợ. Rất lạ. Nó chỉ từ chối cập nhật phí vận chuyển.
Bạn có thể cung cấp mã hoàn chỉnh hơn (nơi bạn đã đặt đoạn mã của mình) và thông tin thêm về trường hợp sử dụng của bạn không? Tôi sẽ cần một số bối cảnh, để trả lời câu hỏi của bạn. –
Đó là mã hoàn chỉnh và tôi chạy nó từ quản trị viên và giao diện người dùng bất cứ khi nào giao hàng được thay đổi theo thứ tự đã đặt –
Tôi có nghĩa là bạn đã đưa đoạn mã vào lớp nào và bạn đề xuất như thế nào để thu hút mã này từ giao diện người dùng? –