Я отримую журнали винятків для цієї помилки у виробництві, але я не можу відтворити проблему в моєму локальному або інсценізаційному середовищі, тому вирішити проблеми було досить важко.
Помилка виникає Mage_Sales_Model_Service_Quote::_validate()
через те, що $rate
повернуте повідомлення $rate = $address->getShippingRateByCode($method)
порожнє.
Я додав у деяких журналах, щоб спробувати краще зрозуміти, що відбувається, і я можу побачити, що $method
містить правильний спосіб доставки.
Я найкраще здогадуюсь, що в якийсь момент процесу доставки тарифи видаляються до того, як вони повинні бути.
Я помітив, що кожного разу, коли цей виняток відбувається, це відбувається одразу після законного винятку, наприклад, недійсної кредитної картки. Я намагався відтворити проблему за допомогою недійсної кредитної картки, а потім дійсної, але вона не відтворюється для мене - в постановці, виробництві чи на місцевому рівні.
Моя первинна думка полягала в тому, що, можливо, метод доставки десь загубився після першого дійсного винятку, але це не так, тому що я бачу, що $method
має правильне значення на момент скидання цього винятку.
Модуль оформлення замовлень, який я використовую, - це AwesomeCheckout - він, наскільки мені не відомо, не має власної логіки при створенні замовлень, які тут можуть викликати проблеми, але можуть бути пов'язані.
ОНОВЛЕННЯ: Я додав у якийсь код, щоб спробувати пригадати ціни, якщо вони відсутні.
protected function _validate()
{
if (!$this->getQuote()->isVirtual()) {
$address = $this->getQuote()->getShippingAddress();
$addressValidation = $address->validate();
if ($addressValidation !== true) {
Mage::throwException(
Mage::helper('sales')->__('Please check shipping address information. %s', implode(' ', $addressValidation))
);
}
$method= $address->getShippingMethod();
$rate = $address->getShippingRateByCode($method);
/**
* Start Customization
*/
if (!$this->getQuote()->isVirtual() && !$rate) {
Mage::logException(new Exception("Rate was empty inside quote validate method, trying to forcefully recalculate"));
$this->getQuote()->getShippingAddress()->setCollectShippingRates(true);
$this->getQuote()->setTotalsCollectedFlag(false);
$this->getQuote()->collectTotals();
$rate = $address->getShippingRateByCode($method);
}
/** End Customization **/
if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
Mage::throwException(Mage::helper('sales')->__('Please specify a shipping method.'));
}
}