Magento 2: ग्राहक अनुभाग / अनुभाग.xml कैसे काम करते हैं?


49

मैं हाल ही में Magento 2 में एक नई अवधारणा के पार आया था जो मुझे दिलचस्प लगी: ग्राहक अनुभाग

आप में से कुछ को sections.xmlइस तरह दिखने वाली फ़ाइलों की उपस्थिति नोटिस हो सकती है :

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
    <action name="sales/guest/reorder">
        <section name="cart"/>
    </action>
    <action name="sales/order/reorder">
        <section name="cart"/>
    </action>
</config>

मुझे जो समझ में आया था, उन फ़ाइलों को निर्दिष्ट करता है कि संबंधित कार्रवाई को कॉल करने पर ग्राहक अनुभागों को अपडेट किया जाना चाहिए।

मैंने Magento/Checkout/etc/frontend/sections.xmlनिम्नलिखित भाग के साथ उदाहरण के लिए देखा :

<action name="checkout/cart/add">
    <section name="cart"/>
</action>

क्या आपके पास कार्ट में कोई उत्पाद जोड़ने के बाद मिनिकार्ट अद्यतन चालू होता है।

मैंने etc/frontend/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="checkout/cart/index">
        <section name="cart"/>
    </action>
</config>

लेकिन जब मैं कार्ट पेज (कंसोल में कोई जीईटी अनुरोध नहीं) तक पहुंचता हूं, तो यह मेरे कार्ट सेक्शन को अपडेट करने की कोशिश नहीं करता है। ऐसा लगता है कि यह संपूर्ण खंड कार्यक्षमता Magento_Customerकिसी तरह से मॉड्यूल द्वारा नियंत्रित की जाती है ।

  • वास्तव में वे कौन से सेक्शन हैं? आप एक अनुभाग को कैसे परिभाषित करते हैं?
  • अनुभाग अपडेट कैसे ट्रिगर किए जाते हैं?
  • (वैकल्पिक) जब मैं कार्ट पेज पर पहुंचता हूं, तो मैं अपने परीक्षण कोड को कैसे ठीक कर सकता हूं?

क्या यह नियंत्रक और कार्रवाई में संदर्भित है जैसे कि एक निष्पादित विधि या किसी अन्य तरीके से?
LM_Fielding

1
@LM_Fielding देख मैं सिर्फ एक उत्तर भेजा है: magento.stackexchange.com/a/142350/2380
डिजिटल Pianism में राफेल

जवाबों:


82

वास्तव में वे कौन से सेक्शन हैं?

एक खंड ग्राहक डेटा का एक समूह है जिसे एक साथ समूहीकृत किया गया है। प्रत्येक अनुभाग को कुंजी द्वारा दर्शाया जाता है जो डेटा और डेटा को स्वयं एक्सेस और प्रबंधित करने के लिए उपयोग किया जाता है। Magento AJAX द्वारा /customer/section/load/कुंजी के तहत ब्राउज़र स्थानीय भंडारण में लोड किए गए डेटा को कैश करने का अनुरोध करता है mage-cache-storage। Magento ट्रैक करता है जब कुछ सेक्शन को बदल दिया जाता है और अपडेटेड सेक्शन को स्वचालित रूप से लोड करता है।

आप एक अनुभाग को कैसे परिभाषित करते हैं?

खंड में di.xmlएक नया खंड जोड़कर फ़ाइल में परिभाषित एक खंड

<type name="Magento\Customer\CustomerData\SectionPoolInterface">
    <arguments>
        <argument name="sectionSourceMap" xsi:type="array">
            <item name="cart" xsi:type="string">Magento\Checkout\CustomerData\Cart</item>
            <item name="directory-data" xsi:type="string">Magento\Checkout\CustomerData\DirectoryData</item>
        </argument>
    </arguments>
</type>

इसलिए यहां दो नए अनुभाग पंजीकृत हैं cartऔर directory-dataMagento\Checkout\CustomerData\Cartऔर विधि के परिणाम के रूप में वास्तविक डेटा को Magento\Checkout\CustomerData\DirectoryDataलागू Magento\Customer\CustomerData\SectionSourceInterfaceकरता है और प्रदान करता है getSectionData

अनुभाग अपडेट कैसे ट्रिगर किए जाते हैं?

Magento मानता है कि ग्राहक के निजी डेटा एक ग्राहक कुछ राज्य संशोधन अनुरोध भेजता है जब बदल जाता है ( POST, PUT, DELETE)। सर्वर पर लोड को कम करने के लिए, डेवलपर्स को यह निर्दिष्ट करना चाहिए कि कौन सा एक्शन (या अनुरोध) अपडेट करता है जो ग्राहक डेटा अनुभाग में है etc/section.xml

<action name="checkout/cart/add">
    <section name="cart"/>
</action>

एक्शन नाम एक एक्शन की पैटर्न है। जब कोई उपयोगकर्ता निर्दिष्ट पैटर्न से मेल खाने वाली कार्रवाई के लिए कहता है, तो पता चलेगा कि संबंधित अनुभाग पुराना है और इसे फिर से लोड करता है। यदि कार्रवाई का नाम है *, तो इसका मतलब है कि प्रत्येक POST और PUT अनुरोध पर अनुभाग अपडेट किया जाएगा। यदि सेक्शन टैग छूट गया है तो सभी सेक्शन को अपडेट किया जाएगा।

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

आप ग्राहक डेटा के बारे में अधिक जानकारी यहाँ पा सकते हैं


आंतरिक कार्यान्वयन

यह समझने के लिए कि कब और कैसे अनुभाग अपडेट किए गए हैं आइए कार्यान्वयन देखें। समझने की कुंजी फाइलें हैं magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.jsऔर magento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js

पिछले दो घटनाओं में से एक के लिए हैंडलर पंजीकृत हैं ajaxCompleteऔर submit। इसका मतलब है कि जब कोई भी फॉर्म पोस्ट किया गया है (पोस्ट या पीयूटी विधियों के साथ) सर्वर पर, या जब जावास्क्रिप्ट एक या AJAX, POSTया PUTअनुरोध भेजता है , तो संचालकों को आमंत्रित किया जाएगा। दोनों हैंडलर के पास समान तर्क हैं: Magento_Customer/js/section-configचेक की मदद से किसी भी अनुभाग को अपडेट किया जाना चाहिए या नहीं। यदि कुछ खंड को अद्यतन किया जाना चाहिए, तो customerData.invalidate(sections)कहा जाता है। और बाद में सभी अमान्य अनुभाग एक सर्वर से लोड किए जाते हैं।

तो कैसे Magento_Customer/js/section-configपता चलता है कि किस धारा को हटा दिया जाना चाहिए और किस पर कार्रवाई की जानी चाहिए। जवाब में है Magento/Customer/view/frontend/templates/js/section-config.phtml:

<script type="text/x-magento-init">
<?php
     /* @noEscape */ echo $this->helper(\Magento\Framework\Json\Helper\Data::class)->jsonEncode([
    '*' => ['Magento_Customer/js/section-config' => [
        'sections' => $block->getSections(),
        'clientSideSections' => $block->getClientSideSections(),
        'baseUrls' => array_unique([
            $block->getUrl(null, ['_secure' => true]),
            $block->getUrl(null, ['_secure' => false]),
        ]),
    ]],
]);
?>
</script>

इस तरह, एक सर्वर एक ब्राउज़र में मर्ज किए गए सेक्शन कॉन्फ़िगरेशन को पास करता है।

तो यह सब मानते हुए, अनुभाग केवल POST या PUT फॉर्म सबमिट करके या AJAX अनुरोध द्वारा अपडेट किया जा सकता है

इसके अलावा, केवल दो नोट हैं:

  • यहाँ वर्णित सभी आंतरिक कार्यान्वयन है और इसे बदला जा सकता है, इसलिए आप सुरक्षित रूप से केवल अनुभागों.xml का उपयोग कर सकते हैं और जब निर्दिष्ट POST या PUT या DELETE कार्रवाइयों को ट्रिगर किया जाता है तो अनुभाग अपडेट की उम्मीद कर सकते हैं।
  • यदि आपको यकीन है, कि आपको वास्तव में कुछ सेक्शन को अपडेट करने की आवश्यकता है, तो आप हमेशा कुछ ऐसा कर सकते हैं: require('Magento_Customer/js/customer-data').reload(['cart'], false)

इसके लिए बहुत बढ़िया धन्यवाद। किसी भी तरह से आप यह बता सकते हैं कि जब मैं कार्ट पेज पर पहुंचता हूं तो मेरे प्रश्न का कोड मिनी कार्ट को रिफ्रेश क्यों नहीं करता है?
राफेल डिजिटल पियानोवाद

1
@ राफेलटाइटलडिजालिज्म, मैंने अपनी टिप्पणी उत्तर के साथ अपडेट की है
वोलोडाइमर कुब्लीत्स्की

मैं कार्ट पेज में एक कस्टम अजाक्स कॉल कर रहा हूं, मुझे इस ग्राहक लोड सेक्शन कॉल की आवश्यकता नहीं है। इससे कैसे बचा जा सकता है? magento.stackexchange.com/questions/156425/…
sawi

5

आपके द्वारा टैग में परिभाषित की गई कार्रवाई POST अनुरोध के माध्यम से विकसित की जानी चाहिए। उदाहरण के लिए:

इसके अलावा, यदि आप सभी अनुभागों में ग्राहक डेटा ताज़ा करना चाहते हैं, तो बस उपयोग करें (विक्रेता / Magento / मॉड्यूल-ग्राहक / etc / frontend / section.xml देखें)

आप फ़ाइल के अंत में भी देख सकते हैं vendor/magento/module-customer/view/frontend/web/js/section-‌​config.js
कोड खोजें:

$ (दस्तावेज़) .on ('सबमिट', फ़ंक्शन (घटना) { 
    var अनुभाग; 
    अगर (event.target.method.match (/ पोस्ट | डाल / i)) { 
        अनुभाग = sectionConfig.getAffectedSections (event.target.action);
        यदि (अनुभाग) { 
            customerData.invalidate (भागों); 
        } 
    } 
});

आप फ़ाइल विक्रेता / Magento / मॉड्यूल-ग्राहक / दृश्य / फ़्रंट / वेब / js / अनुभाग-config.js के अंत में कोड $ (दस्तावेज़) खोजें .on ('सबमिट', फ़ंक्शन (घटना) {var भी देख सकते हैं। सेक्शन; ;
lemk0

3

ऐसा करने के लिए मुझे एक हैकी तरीका मिला:

मेरे एक्शन क्लास में जो मैं करता हूँ उस कार्ट को रीडायरेक्ट करता है:

$this->_checkoutSession->setMinicartNeedsRefresh(true);

फिर मैंने अपने कार्ट पेज पर निम्नलिखित को जोड़ा:

<?php if ($this->isRefreshRequired()): ?>
    <script type="text/javascript">
        require( [ 'jquery' ], function ($)
        {
            $.ajax({
                url: '<?php echo $this->getRefreshUrl(); ?>',
                type: 'POST'
            });
        });
    </script>
<?php endif; ?>

फिर मेरे ब्लॉक में मेरे पास है:

public function isRefreshRequired()
{
    if ($this->_checkoutSession->getMinicartNeedsRefresh()) {
        $this->_checkoutSession->setMinicartNeedsRefresh(false);
        return true;
    } else {
        return false;
    }
}

/**
 * Get the refresh URL
 * @return string
 */
public function getRefreshUrl()
{
    return $this->getUrl('module/cart/refresh');
}

और मेरा Refresh.phpएक्शन क्लास इस तरह दिखता है:

<?php

namespace Vendor\Module\Controller\Cart;

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;

class Refresh extends Action
{

    /**
     * Dummy action class called via AJAX to trigger the section update
     */
    public function execute()
    {
        return $this->getResponse()->representJson(
            $this->_objectManager->get('Magento\Framework\Json\Helper\Data')->jsonEncode(['success'=>true])
        );
    }
}

जब मैं फ़ाइल में url के लिए पोस्ट अनुरोध भेजता हूं तो राफेल, मेरे अनुभागों.xml भी कार्ट को अपडेट करने का प्रयास नहीं कर रहा है ... कोई विचार?
LM_Fielding

@LM_Fielding हाँ मेरे पास एक ही लोग थे, मेरा उत्तर पढ़ें
राफेल एट डिजिटल पियानिज़्म

तो इसे काम पर लाने के लिए, हमें यह लिखना होगा? क्या डिफ़ॉल्ट व्यवहार टूट गया है या मैं गलत समझ रहा हूं?
LM_Fielding

@LM_Fielding अच्छी तरह से मुझे नहीं पता कि मैंने यह सवाल क्यों पूछा और मुझे इसके बारे में कोई अच्छा जवाब नहीं मिला। जैसा कि मैंने कहा कि यह "हैकी" तरीका है जो मैंने इसे करने के लिए पाया।
राफेल डिजिटल पियानोवाद

यह निश्चित रूप से मेरे लिए एक रिश्तेदार यूआरएल का उपयोग कर रहा था - यह अनुभाग अद्यतन को ट्रिगर नहीं करता है।
LM_Fielding

0

मुझे सवाल के लेखक के रूप में एक ही समस्या का सामना करना पड़ा है। प्रलेखन और कोर कोड में कुछ घंटों के शोध और अंतराल के बाद, मुझे अचानक समाधान मिला। मेरे मामले में मुझे मिला ... / etc / frontend / section.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="roadsignconf/index/addtocart">
        <section name="cart"/>
    </action>
</config>

और यह काम नहीं करना चाहता था। इस विषय और इस मुद्दे को पढ़ने के बाद https://github.com/magento/magento2/issues/3287 मैं इतना भ्रमित हो गया कि प्रयोग करना शुरू कर दिया। मेरे लिए स्लैश जोड़ने में मदद करता है:

 <?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="/roadsignconf/index/addtocart/">
            <section name="cart"/>
        </action>
    </config>

आशा है कि यह किसी को समाधान खोजने के लिए कम समय बिताने में मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.