ปรากฎว่านี่เป็นข้อบกพร่อง Mage_Sales_Model_Quote_Item::compare()
ที่ได้รับการแนะนำใน Magento CE 1.9.2 / EE 1.14.2 วิธีนี้ใช้ในการเปรียบเทียบสินค้าเพื่อตัดสินใจว่าเป็นสินค้าเดียวกันและสามารถรวมกันได้หรือไม่ (ระหว่างการเข้าสู่ระบบและเมื่อเพิ่มสินค้าลงในตะกร้า)
เมื่อเปรียบเทียบตัวเลือกที่กำหนดเองทั้งหมดควรข้ามตัวเลือกที่ไม่ได้รับการตอบกลับ ( _notRepresentOptions
) คือตัวเลือกinfo_buyRequest
ในเวอร์ชันวีโอไอพีรุ่นก่อนหน้าดูเหมือนว่า:
foreach ($this->getOptions() as $option) {
if (in_array($option->getCode(), $this->_notRepresentOptions)) {
continue;
}
และทำงานอย่างถูกต้อง ตอนนี้ดูเหมือนว่านี้:
foreach ($this->getOptions() as $option) {
if (in_array($option->getCode(), $this->_notRepresentOptions)
&& !$item->getProduct()->hasCustomOptions()
) {
continue;
}
และการตรวจสอบเพิ่มเติมสำหรับhasCustomOptions()
สาเหตุข้อผิดพลาดที่อธิบายไว้ ทำไม? ดูเหมือนว่ามีการเพิ่มการตรวจสอบเพื่อแยกผลิตภัณฑ์ด้วยตัวเลือกที่กำหนดเองเสมอ ฉันไม่คิดว่ามันสมเหตุสมผลอย่างน้อยก็ไม่ใช่ในทางที่จะถูกนำมาใช้ แต่จะมีเหตุผลบางอย่างที่ทำให้ฉันไม่ทราบ
อย่างไรก็ตาม$item->getProduct()->hasCustomOptions()
จะส่งกลับค่าจริงสำหรับรายการคำพูดเสมอ!
นี่คือวิธีการ:
public function hasCustomOptions()
{
if (count($this->_customOptions)) {
return true;
} else {
return false;
}
}
แต่$this->_customOptions
ยังมีinfo_buyRequest
ตัวเลือกจากรายการอ้างอิง
สำหรับวิธีการที่ไม่เป็นการรบกวนฉันพยายามลบinfo_buyRequest
ตัวเลือกออกจากผลิตภัณฑ์ทั้งหมดในผู้สังเกตการณ์sales_quote_merge_before
โดยไม่ประสบความสำเร็จ
เหตุผลอยู่Mage_Sales_Model_Quote_Item_Abstract::getProduct()
ที่ตัวเลือกจะถูกคัดลอกอีกครั้งจากรายการอ้างอิง:
public function getProduct()
{
$product = $this->_getData('product');
[...]
if (is_array($this->_optionsByCode)) {
$product->setCustomOptions($this->_optionsByCode);
}
return $product;
}
วิธีการแก้
ฉันสร้าง rewrite สำหรับMage_Sales_Model_Quote_Item
โดยแทนที่สำหรับที่getProduct()
จะไม่รวมinfo_buyRequest
ตัวเลือก ณ จุดนี้:
public function getProduct()
{
$product = parent::getProduct();
$options = $product->getCustomOptions();
if (isset($options['info_buyRequest'])) {
unset($options['info_buyRequest']);
$product->setCustomOptions($options);
}
return $product;
}
ปัญหานี้ทำให้เกิดปัญหากับชุดผลิตภัณฑ์ทางเลือกด้านล่างหรือแพทช์อย่างเป็นทางการตามที่อธิบายโดย @ AnnaVölklเป็นทางออกที่ดีกว่า
ทางเลือก
นอกจากนี้คุณยังสามารถลบการละเมิด&& !$item->getProduct()->hasCustomOptions()
ในcompare()
วิธีการถ้าคุณเขียนโมเดลรายการต่อไป ฉันไม่ทราบว่าจะพยายามแก้ปัญหาอะไร แต่มันสร้างเพิ่มเติม ...
อัปเดต 29 มกราคม 2559
ฉันรายงานเรื่องนี้กับ Magento และได้รับการตอบกลับว่าพวกเขาไม่สามารถทำซ้ำปัญหาได้ดังนั้นโปรแกรมแก้ไขจะไม่ทำให้เป็นฉบับชุมชน (การส่ง APPSEC-1321)
ซึ่งหมายความว่าหากคุณมีปัญหาคุณต้องใช้แพตช์องค์กร SUPEE-6190 หลังจากการอัพเดทแต่ละครั้งหรือใช้การเขียนคลาสแทน