यह पता चला कि यह एक बग है Mage_Sales_Model_Quote_Item::compare()
जिसमें Magento CE 1.9.2 / EE 1.14.2 में पेश किया गया था। विधि का उपयोग वस्तुओं की तुलना करने के लिए किया जाता है ताकि यह तय हो सके कि वे एक ही उत्पाद हैं और मर्ज किए जा सकते हैं (लॉगिन के दौरान और कार्ट में उत्पादों को जोड़ते समय)।
सभी कस्टम विकल्पों की तुलना करते समय, यह उन विकल्पों को छोड़ देना चाहिए _notRepresentOptions
जो रिप्रेजेंटेटिव ( ) नहीं हैं , अर्थात् info_buyRequest विकल्प।
पिछले Magento संस्करणों में, यह इस तरह दिखता था:
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;
}
समाधान
मैंने इस बिंदु पर विकल्प को शामिल नहीं करने के 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;
}
यह बंडल उत्पादों के साथ परेशानी का कारण था, नीचे विकल्प या आधिकारिक पैच जैसा कि @ अन्नावोक्कल द्वारा वर्णित है, एक बेहतर समाधान है
विकल्प
तुम भी अपमान && !$item->getProduct()->hasCustomOptions()
को दूर कर सकते हैंcompare()
यदि आप आइटम मॉडल को फिर से लिखना चाहते हैं, तो आप विधि सकते हैं। मैं नहीं जानता कि यह किस समस्या को हल करने की कोशिश करता है, लेकिन इसने और अधिक ...
अपडेट 29 जनवरी 2016
मैंने मैगेंटो को इसकी सूचना दी और प्रतिक्रिया मिली कि वे इस मुद्दे को पुन: पेश नहीं कर सकते हैं, इसलिए पैच इसे सामुदायिक संस्करण (सबमिशन APPSEC-1321) में नहीं बनाएंगे।
इसका मतलब है, अगर आपको समस्या है, तो आपको प्रत्येक अपडेट के बाद एंटरप्राइज़ पैच SUPEE-6190 लागू करना होगा या इसके बजाय एक वर्ग फिर से लिखना होगा।