वास्तव में वे कौन से सेक्शन हैं?
एक खंड ग्राहक डेटा का एक समूह है जिसे एक साथ समूहीकृत किया गया है। प्रत्येक अनुभाग को कुंजी द्वारा दर्शाया जाता है जो डेटा और डेटा को स्वयं एक्सेस और प्रबंधित करने के लिए उपयोग किया जाता है। 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-data। Magento\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)