ฉันได้รับบันทึกข้อยกเว้นสำหรับข้อผิดพลาดนี้ในการผลิต แต่ฉันไม่สามารถทำซ้ำปัญหาในสภาพแวดล้อมท้องถิ่นหรือการแสดงละครของฉันได้ดังนั้นมันค่อนข้างยากที่จะแก้ไขปัญหา
ข้อผิดพลาดเกิดขึ้น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.'));
}
}