कार्ट में जोड़ने के बाद मिनिकार्ट अपडेट को कैसे ट्रिगर किया जाए


10

मेरे पास निम्न वर्ग है जो मैं कस्टम तरीके से कार्ट में जोड़ने का परीक्षण करने के लिए उपयोग कर रहा हूं;

use Magento\Framework\App\Action;
use Magento\Checkout\Model\Cart;

class Add extends Action\Action
{
    protected $cart;

    public function __construct(
        Action\Context $context,
        Cart $cart
    ){
        $this->cart = $cart;
        parent::__construct($context);
    }

    public function execute()
    {
        $this->cart->addProductsByIds([1])
            ->save();
    }
}

यह बहुत अच्छा काम करता है। जब आप गाड़ी को देखते हैं तो यह मेरा आइटम दिखाता है, सभी डेटाबेस में शांत दिखता है। हालांकि, मिनिकर्ट अभी भी दिखाता है जैसे टोकरी में कोई आइटम नहीं हैं।

यदि मैं तब उत्पाद पर "ऐड टू कार्ट" बटन का उपयोग करके गाड़ी में एक और उत्पाद जोड़ देता हूं या कार्ट में जोड़े गए पृष्ठों को सूचीबद्ध करता है और दोनों वस्तुओं को दिखाने के लिए मिनीकार्ट को अपडेट करता है।

यह स्वयं को अपडेट करने के लिए मिनीकार्ट को कहां से ट्रिगर करता है या फिर कैसे पता चलता है कि मिनीकार्ट को रीफ्रेश करने की आवश्यकता है?

जवाबों:


36

आपकी सहायता के लिए धन्यवाद :)

मैंने पाया है कि इसे कैसे ट्रिगर किया जाता है, आपको sections.xmlअपने मॉड्यूल के अंदर / सामने की ओर स्थापित करने की आवश्यकता होती है जो मैगेंटो को बताता है कि किसी दिए गए अजाक्स कॉल के लिए कौन सा अनुभाग अपडेट करना है। यहाँ एक उदाहरण है;

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
    <action name="[frontName]/[ActionPath]/[ActionName]">
        <section name="cart"/>
    </action>
</config>

मेरे Ajax कॉल के समाप्त होने के बाद [frontName]/[ActionPath]/[ActionName]Magento लोड करने के लिए अनुभागों को पारित करने के लिए / ग्राहक / अनुभाग / लोड को एक और कॉल करता है।

डिफ़ॉल्ट रूप से यह किसी भी संदेश का अनुरोध करता है, लेकिन यदि आपने अपने अनुभागों को स्थापित किया है। तो सही ढंग से आप उन अनुभाग नामों को भी देखेंगे, जिन्हें आपने वहाँ परिभाषित किया है।


@ smartic, अच्छी जानकारी मैं यहाँ से अंटी मिला
अमित बेरा


बहुत बढ़िया, मैं अजाक्स के माध्यम से अन्य ब्लॉकों को अपडेट करने पर काम कर रहा था और यह मुझे वहां मिला। अपना समाधान पोस्ट करने के लिए धन्यवाद।
इरिक

@Smartie वहाँ कुछ magento एपीआई कॉल के बाद गाड़ी अनुभाग अद्यतन करने के लिए कोई रास्ता नहीं है?
ND17

1
@Smartie कई जोड़ने वाले उत्पादों के लिए, यह केवल पहले उत्पाद की मात्रा को अद्यतन कर रहा है और बाकी उत्पाद की संख्या को मिनी कार्ट में नहीं दिखाया गया है। क्या हम यहाँ कुछ और जोड़ने के लिए de करते हैं?
DEEP JOSHI

6

यह सीधे सवाल से संबंधित नहीं है, लेकिन अगर आप सामान्य मैगेंटो require.jsफ़ाइलों में AJAX कॉल के माध्यम से गाड़ी को अपडेट कर रहे हैं, तो आपको Magento_Customer/js/customer-dataऑब्जेक्ट की आवश्यकता हो सकती है और इस तरह से ताज़ा करने के लिए मिनीकार्ट से पूछ सकते हैं :

<script>
    require([
        'Magento_Customer/js/customer-data'
    ], function (customerData) {
        var sections = ['cart'];
        customerData.invalidate(sections);
        customerData.reload(sections, true);
    });
</script>

स्रोत: https://github.com/magento/magento2/issues/5621


इसलिए मैंने इसे अपने कस्टम पेज_लेआउट के समाधान की तलाश में यहाँ बनाया है। जब भी मैं अपने किसी कस्टम पेज पर जाता था, तो मेरी मिनी कार्ट की संख्या हमेशा 0 होती थी। मैंने भागना समाप्त कर दिया customerData.invalidate(sections);और फिर मैगेंटो आराम करने में सक्षम था।
जेम्स हैरिंगटन

2

स्टोर के सामने में अगर आप मिनिकार्ट क्षेत्र में स्रोत में गोता लगाते हैं

<div data-block="minicart" class="minicart-wrapper">
  <a class="action showcart" 
   data-bind="scope: 'minicart_content'">
     ... 
  </a>

   <script type="text/x-magento-init">
   {
    "[data-block='minicart']": {
        "Magento_Ui/js/core/app": {"components":{....}
     }
   }
</script>
</div>

जैसा कि आप यहाँ देख सकते हैं कि magento2 स्क्रिप्ट टैग और डायनामिक बाइंड डेटा के अंदर पुर्जों को निष्पादित करता है ताकि मिनीकार्ट को नॉकआउटJs का उपयोग किया जा सके

दिलचस्प मैं पता चलता है

\vendor\magento\module-checkout\view\frontend\layout\default.xml

चेकआउट लेआउट से। यह componentminicart-content के लिए getdata के लिए परिभाषित करता है जारी रखें देखें कि Magento_Checkout/js/view/minicartआप देखेंगे

.....
$('[data-block="minicart"]').on('contentLoading', function(event) {
      addToCartCalls++;
      self.isLoading(true);
});
.....
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.