EE 1.14.2 / CE 1.9.2: लॉगिन पर उद्धरण आइटम सही तरीके से मर्ज नहीं किए गए हैं (कार्ट में डुप्लिकेट उत्पाद)


16

मुझे गाड़ी के साथ मैगेंटो ईई 1.14.2 (सीई 1.9.2 को भी प्रभावित करता है) में एक अजीब बग मिला।

प्रजनन करने कि प्रक्रिया:

  1. ग्राहक A के रूप में लॉग इन करें
  2. उत्पाद X को कार्ट में जोड़ें
  3. एक अलग ब्राउज़र पर स्विच करें
  4. उत्पाद X को कार्ट में जोड़ें
  5. ग्राहक A के रूप में लॉग इन करें

अपेक्षित गाड़ी:

  • 2 एक्स उत्पाद एक्स

वास्तविक गाड़ी:

  • 1 एक्स उत्पाद एक्स
  • 1 एक्स उत्पाद एक्स

यानी उत्पादों को विलय नहीं किया जाता है।

ब्राउज़र को स्विच करने के बजाय आप सत्र कुकी को साफ़ कर सकते हैं या उत्पाद के लिए एक अलग मात्रा चुन सकते हैं।

इसका सबसे बुरा दुष्प्रभाव यह है कि प्रति आइटम अधिकतम ऑर्डर मात्रा लागू होती है। मेरे मामले में, किसी उत्पाद पर 100% की छूट थी लेकिन आप इसे केवल एक बार ही ऑर्डर कर सकते थे। इस छोटी सी चाल के साथ, आप इसे किसी भी मात्रा में मुफ्त में ऑर्डर कर सकते हैं।

ऐसा क्यों होता है और मैं इसे कैसे रोक सकता हूं?

जवाबों:


18

ऊपर बग के ऊपर अच्छा लपेटो, Fabian!

इस बग के आगे आने वाले किसी भी उपयोगकर्ता के लिए, इसके लिए पहले से ही Magento का एक पैच है।

एक एंटरप्राइज़ ग्राहक के रूप में, आप इसे PATCH_SUPEE-6190_EE_1.14.2.0_v1.shठीक करने के लिए अनुरोध / डाउनलोड कर सकते हैं ।

अद्यतन 24.02.2016: यह भी नवीनतम SUPEE-7405 v 1.1 पैच में संबोधित किया गया था। ट्विटर पर फैबियन के अनुसार (इसे देखें और निम्नलिखित ट्वीट ) एक मौका है जो अभी भी पूरी तरह से हल नहीं हुआ है। कृपया इसे स्वयं भी परखें।

ईई 1.14.2.0 के लिए समाधान के रूप में है:

diff --git a/app/code/core/Mage/Sales/Model/Quote/Item.php b/app/code/core/Mage/Sales/Model/Quote/Item.php
index 3554faa..d759249 100644
--- a/app/code/core/Mage/Sales/Model/Quote/Item.php
+++ b/app/code/core/Mage/Sales/Model/Quote/Item.php
@@ -502,8 +502,8 @@ class Mage_Sales_Model_Quote_Item extends Mage_Sales_Model_Quote_Item_Abstract
                         $itemOptionValue = $_itemOptionValue;
                         $optionValue = $_optionValue;
                         // looks like it does not break bundle selection qty
-                        unset($itemOptionValue['qty'], $itemOptionValue['uenc']);
-                        unset($optionValue['qty'], $optionValue['uenc']);
+                        unset($itemOptionValue['qty'], $itemOptionValue['uenc'], $itemOptionValue['form_key']);
+                        unset($optionValue['qty'], $optionValue['uenc'], $optionValue['form_key']);
                     }
                 }

नोट: आमतौर पर मैं यहां ईई कोड पोस्ट नहीं करता, लेकिन जैसा कि समस्या / फाइलें सीई में हैं और ईई-ओनली फीचर को प्रभावित नहीं करती हैं, मुझे उम्मीद है कि यह ठीक है।


4
मुझे यह मंजूर है।
१६:१५ को १५:१५

5
हम इसे स्लाइड करेंगे।
18

1
यह तो स्लाइड है।
मेरियस

यह मेरे फिक्स से बेहतर काम करता है, जिससे बंडल उत्पादों के साथ परेशानी हुई। साझा करने के लिए धन्यवाद!
फेबियन शेंगलर

1
यदि आप उत्पाद सूची के माध्यम से एक बार और उत्पाद विवरण पृष्ठ के माध्यम से एक बार उत्पाद जोड़ते हैं, तो दुर्भाग्य से यह अभी भी बाईपास हो सकता है, क्योंकि "संबंधित_प्रकार" पैरामीटर केवल बाद के मामले में मौजूद है। आप unset()कॉल से संबंधित "संबंधित_प्रकार" भी जोड़ सकते हैं , लेकिन यह अभी भी सुरक्षित नहीं है क्योंकि कोई भी मनमाना POST पैरामीटर खरीदने के समान विकल्प में भी जोड़ा जाता है। मैं इस विकल्प को पूरी तरह से अनदेखा करने जा रहा हूं।
फेबियन शेंगलर

15

यह पता चला कि यह एक बग है 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->_customOptionsinfo_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 लागू करना होगा या इसके बजाय एक वर्ग फिर से लिखना होगा।


However, $item->getProduct()->hasCustomOptions() always returns true for quote items!यह कस्टम आइटम के लिए उत्पाद डेटा की जाँच कर रहा है उद्धरण आइटम नहीं :)
kanevbgbe

1
@kanevbgbe आश्चर्यजनक रूप से, नहीं। Magento एक उद्धरण आइटम के साथ जुड़े उत्पाद उदाहरण को "तैयार करता है" और इसके कस्टम विकल्प मूल्यों को जोड़ता है
Fabian Schmengler

मुझे पता है कि कार्ट एक्शन में ऐड करने पर उत्पाद का इंस्टेंस पूरी तरह से लोड हो जाता है (उद्धरण लोड की तुलना में), इसलिए इसे बोली के एल्गोरिदम के बाहर से सीधे कोट आइटम के उदाहरण से सेट किया जाता है ट्रफ सेटप्रोडक्ट (), शायद तब इस चेक का एक अलग आउटपुट होता है ।
kanevbgbe

1

जैसा कि मैं देख सकता हूं कि उपरोक्त उत्तर पहले से ही Magento के नवीनतम संस्करण में उपलब्ध है, लेकिन हम अभी भी इस मुद्दे को प्राप्त कर रहे थे। यह काम नहीं किया क्योंकि हमने बहुत सारे अनुकूलन किए हैं। समाधान साझा करने की बात कही।

हमारे लिए यह बहुत सरल था क्योंकि हम केवल सरल उत्पादों का उपयोग करते हैं। इसलिए, हमने फ़ंक्शन मर्ज की तुलना इस प्रकार की है:

NS_Module_Model_Sales_Quote_Item का विस्तार Mage_Sales_Model_Quote_Item {

public function compare($item) {
    if ($this->getProductId() == $item->getProductId()) {
        return true;
    }
    return parent::compare($item);
}

}

और जोड़ा

<models>
   <sales>
      <rewrite>
         <quote_item>NS_Module_Model_Sales_Quote_Item</quote_item>
      </rewrite>
   </sales>
</models>

परंतु। जो लोग विन्यास उत्पादों का उपयोग कर रहे हैं, उनके लिए भी यह आपके लिए उपयोगी नहीं हो सकता है। उस स्थिति में आप दोनों सरणियाँ मुद्रित कर सकते हैं: $ ItemOptionValue और $ विकल्पवैल्यू और अंतर देखें। सभी अतिरिक्त कुंजियों को परेशान करें जो दोनों सरणियों में आम नहीं हैं। इससे समस्या का समाधान होना चाहिए।


-1

आप इवेंट की बिक्री में उत्पाद के लिए एक विकल्प जोड़ सकते हैं sales_quote_add_item:

$data['microtime'] = microtime(true);
$product->addCustomOption('do_not_merge', serialize($data));
$item->addOption($product->getCustomOption('do_not_merge'));

संदर्भ लिंक: कार्ट पोजीशन का विलय अक्षम करें?


यह एक वर्कअराउंड है, लेकिन आमतौर पर आइटम विलय को पूरी तरह से अक्षम करना वांछनीय नहीं है।
फैबियन शेंगलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.