मैं आपके प्रश्न का उत्तर देने का प्रयास करूंगा।
नहीं । यह कस्टम विशेषताओं को शिपिंग एड्रेस फॉर्म में जोड़ने का एक सही तरीका नहीं है। आपको संपादित करने की आवश्यकता नहीं है new-customer-address.js
। दरअसल, यह जेएस फाइल सभी पूर्वनिर्धारित पते विशेषताओं को सूचीबद्ध करती है और संबंधित बैकएंड इंटरफेस से मेल खाती है \Magento\Quote\Api\Data\AddressInterface
लेकिन मैगेंटो बैकएंड / फ्रंटेंड घटकों के संशोधन के बिना किसी भी कस्टम विशेषताओं को पारित करने की क्षमता प्रदान करता है ।
उल्लेखित जेएस घटक के पास customAttributes
संपत्ति है। यदि आपकी $dataScopePrefix
' shippindAddress.custom_attributes
' है तो आपकी कस्टम विशेषताएँ अपने आप नियंत्रित हो जाएंगी ।
अगर मैंने आपके प्रश्न को सही ढंग से समझा, तो आपके पास डेटा है जो ग्राहक पते का हिस्सा नहीं है, लेकिन आपको इसे बैकएंड पर भी भेजने की आवश्यकता है। इस प्रश्न का उत्तर है:
यह निर्भर करता है । उदाहरण के लिए, आप निम्नलिखित दृष्टिकोण का चयन कर सकते हैं: चेकआउट पृष्ठ पर कस्टम फ़ॉर्म जोड़ें जिसमें आपके सभी अतिरिक्त फ़ील्ड शामिल हों (like comment, invoice request etc)
, JS लॉजिक जोड़ें जो कुछ घटनाओं के आधार पर इस फ़ॉर्म को संभालेंगे, और एक कस्टम सेवा प्रदान करेंगे जो फ्रंटएंड और स्टोर से डेटा प्राप्त करेंगे। यह भविष्य के उपयोग के लिए कहीं है।
चेकआउट से संबंधित सभी आधिकारिक दस्तावेज http://devdocs.magento.com/guides/v2.1/howdoi/checkout/checkout_overview.html पर स्थित है । स्थिर शब्द उन रूपों को संदर्भित करता है जहां सभी फ़ील्ड पहले से ही ज्ञात / पूर्वनिर्धारित हैं (उदाहरण के लिए: फ़ॉर्म में हमेशा पूर्वनिर्धारित लेबल के साथ 2 पाठ फ़ील्ड होंगे) और बैकएंड में कुछ सेटिंग्स के आधार पर बदल नहीं सकते हैं।
इस तरह के रूपों का उपयोग करके घोषित किया जा सकता है layout XML configuration
। दूसरी ओर, टर्म डायनेमिक उन रूपों को संदर्भित करता है , जिनका फील्ड सेट बदल सकता है (उदाहरण के लिए: चेकआउट फॉर्म में कॉन्फ़िगरेशन के आधार पर अधिक / कम फ़ील्ड हो सकते हैं)।
इस मामले में ऐसे फॉर्म को घोषित करने का एकमात्र तरीका LayoutProcessor
प्लगइन का उपयोग करना है ।
:) Magento जितना संभव हो उतना उपयोग मामलों को कवर करने की कोशिश करता है जो Magento के उपयोग / अनुकूलन के दौरान व्यापारियों के लिए महत्वपूर्ण हो सकते हैं। कभी-कभी यह स्थिति की ओर जाता है जब कुछ सरल उपयोग के मामले अधिक जटिल हो जाते हैं।
उम्मीद है की यह मदद करेगा।
================================================== =======================
ठीक है ... कुछ कोड लिखते हैं;)
- PHP कोड जो लेआउटप्रोसेसर में अतिरिक्त फ़ील्ड सम्मिलित करता है
========
/**
* @author aakimov
*/
$customAttributeCode = 'custom_field';
$customField = [
'component' => 'Magento_Ui/js/form/element/abstract',
'config' => [
// customScope is used to group elements within a single form (e.g. they can be validated separately)
'customScope' => 'shippingAddress.custom_attributes',
'customEntry' => null,
'template' => 'ui/form/field',
'elementTmpl' => 'ui/form/element/input',
'tooltip' => [
'description' => 'Yes, this works. I tested it. Sacrificed my lunch break but verified this approach.',
],
],
'dataScope' => 'shippingAddress.custom_attributes' . '.' . $customAttributeCode,
'label' => 'Custom Attribute',
'provider' => 'checkoutProvider',
'sortOrder' => 0,
'validation' => [
'required-entry' => true
],
'options' => [],
'filterBy' => null,
'customEntry' => null,
'visible' => true,
];
$jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']['shippingAddress']['children']['shipping-address-fieldset']['children'][$customAttributeCode] = $customField;
return $jsLayout;
जैसा कि मैंने पहले ही उल्लेख किया है, यह आपके क्षेत्र को customAttributes
जेएस एड्रेस ऑब्जेक्ट की संपत्ति में जोड़ देगा । यह संपत्ति कस्टम EAV पते विशेषताओं को समाहित करने के लिए डिज़ाइन की गई थी और यह \Magento\Quote\Model\Quote\Address\CustomAttributeListInterface::getAttributes
विधि से संबंधित है ।
ऊपर दिए गए कोड स्वचालित रूप से फ्रंटेंड पर स्थानीय भंडारण दृढ़ता को संभाल लेंगे। आप checkoutData.getShippingAddressFromData()
(जहाँ checkoutData
है Magento_Checkout/js/checkout-data
) का उपयोग करके स्थानीय भंडारण से अपने क्षेत्र का मूल्य प्राप्त कर सकते हैं ।
- 'Magento_Checkout / js / क्रिया / सेट-शिपिंग-जानकारी' के व्यवहार को बदलने के लिए मिक्सिन जोड़ें (यह घटक शिपिंग और बिलिंग चेकआउट चरणों के बीच डेटा सबमिशन के लिए ज़िम्मेदार है)
========
2.1। सृजन करनाyour_module_name/view/frontend/requirejs-config.js
/**
* @author aakimov
*/
var config = {
config: {
mixins: {
'Magento_Checkout/js/action/set-shipping-information': {
'<your_module_name>/js/action/set-shipping-information-mixin': true
}
}
}
};
2.2। अपना_मॉडल_नाम / दृश्य / दृश्य / वेब / js / क्रिया / सेट-शिपिंग-जानकारी-mixin.ds बनाएं
/**
* @author aakimov
*/
/*jshint browser:true jquery:true*/
/*global alert*/
define([
'jquery',
'mage/utils/wrapper',
'Magento_Checkout/js/model/quote'
], function ($, wrapper, quote) {
'use strict';
return function (setShippingInformationAction) {
return wrapper.wrap(setShippingInformationAction, function (originalAction) {
var shippingAddress = quote.shippingAddress();
if (shippingAddress['extension_attributes'] === undefined) {
shippingAddress['extension_attributes'] = {};
}
// you can extract value of extension attribute from any place (in this example I use customAttributes approach)
shippingAddress['extension_attributes']['custom_field'] = shippingAddress.customAttributes['custom_field'];
// pass execution to original action ('Magento_Checkout/js/action/set-shipping-information')
return originalAction();
});
};
});
- अपना_मॉड्यूल_नाम / आदि / एक्सटेंशन_एट्टीजे.एक्सएमएल बनाएं
========
<?xml version="1.0"?>
<!--
/**
* @author aakimov
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Quote\Api\Data\AddressInterface">
<attribute code="custom_field" type="string" />
</extension_attributes>
</config>
यह बैकएंड पक्ष पर मॉडल को संबोधित करने के लिए एक एक्सटेंशन विशेषता जोड़ देगा। विस्तार गुण Magento द्वारा प्रदान किए गए विस्तार बिंदुओं में से एक हैं। अपने डेटा का उपयोग बैकएंड पर करने के लिए आप कर सकते हैं:
// Magento will generate interface that includes your custom attribute
$value = $address->getExtensionAttributes()->getCustomField();
आशा है, यह मदद करता है और आधिकारिक प्रलेखन में जोड़ा जाएगा।