Я пытаюсь изменить доставку в существующем порядке в Magento. Это отлично работает с бэкэндом администратора, даже если это довольно процесс, так как я должен вручную обновлять множество полей/атрибутов заказа после того, как я установил новый метод доставки на объект адрес доставки и пересчитал итоговые значения котировок.
Моя проблема заключается в том, что при запуске того же кода в интерфейсе это вообще не работает, quote collectTotals вернет любые изменения, внесенные мной в shippingAddress, и я понятия не имею, как его решить или почему работает от бэкэнда.
Вот как это выглядело:
$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();
И, как я уже сказал, это прекрасно срабатывало каждый раз из бэкэнда, но не при вызове из интерфейса.
Я пробовал варианты, такие как это, чтобы попытаться искоренить любые следы старого метода доставки, без везения.
$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();
Мне кажется, что цитата использует старую/разную копию адреса доставки, когда я вызываю collectTotals, независимо от того, что я делаю.
Любые предложения или, возможно, понимание того, как это возможно, что это работает в бэкэнд, но не в интерфейсе?
ИЗМЕНИТЬ
После дополнительной отладки, я вижу, что доставка делает изменения как в frontend, так и в backend. Проблема в том, что плата будет изменяться только при запуске этого кода через бэкэнд. Очень странно. Он просто отказывается обновлять стоимость доставки.