Spróbuję odpowiedzieć na twoje pytanie / pytania.
Nie . To nie jest poprawny sposób dodawania niestandardowych atrybutów do formularza adresu wysyłki. Nie musisz edytować new-customer-address.js
. Rzeczywiście, ten plik JS zawiera wszystkie predefiniowane atrybuty adresu i odpowiada odpowiadającemu interfejsowi backendu, \Magento\Quote\Api\Data\AddressInterface
ale Magento zapewnia możliwość przekazywania dowolnych niestandardowych atrybutów do backendu bez modyfikacji komponentów backend / frontendu .
Wspomniany komponent JS ma customAttributes
właściwość. Twoje niestandardowe atrybuty zostaną automatycznie obsłużone, jeśli $dataScopePrefix
mają wartość „ shippindAddress.custom_attributes
”.
Jeśli poprawnie zrozumiałem twoje pytanie, masz dane, które nie są częścią adresu klienta, ale musisz wysłać je również do zaplecza. Odpowiedź na to pytanie brzmi:
To zależy . Na przykład możesz wybrać następujące podejście: dodaj niestandardowy formularz do strony kasy, który zawiera wszystkie dodatkowe pola (like comment, invoice request etc)
, dodaj logikę JS, która będzie obsługiwać ten formularz w oparciu o niektóre zdarzenia, i zapewni niestandardową usługę, która odbierze dane z interfejsu użytkownika i sklepu gdzieś do wykorzystania w przyszłości.
Cała oficjalna dokumentacja związana z kasą znajduje się na stronie http://devdocs.magento.com/guides/v2.1/howdoi/checkout/checkout_overview.html . Termin statyczny odnosi się do formularzy, w których wszystkie pola są już znane / predefiniowane (na przykład: formularz zawsze będzie zawierał 2 pola tekstowe ze wstępnie zdefiniowanymi etykietami) i nie może się zmienić w zależności od niektórych ustawień w backendu.
Takie formularze można zadeklarować za pomocą layout XML configuration
. Z drugiej strony termin dynamiczny odnosi się do formularzy, których zestaw pól może ulec zmianie (na przykład: formularz zamówienia może mieć więcej / mniej pól w zależności od ustawień konfiguracji).
W takim przypadku jedynym sposobem na zadeklarowanie takiej formy jest użycie LayoutProcessor
wtyczki.
:) Magento stara się objąć jak najwięcej przypadków użycia, które mogą być znaczące dla handlowców podczas korzystania / dostosowywania Magento. Czasami prowadzi to do sytuacji, gdy niektóre proste przypadki użycia stają się bardziej złożone.
Mam nadzieję że to pomoże.
================================================== =======================
OK ... Napiszmy kod;)
- Kod PHP, który wstawia dodatkowe pole w LayoutProcessor
========
/**
* @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;
Jak już wspomniałem, doda to twoje pole do customAttributes
właściwości obiektu adresu JS. Ta właściwość została zaprojektowana tak, aby zawierała niestandardowe atrybuty adresu EAV i jest związana z \Magento\Quote\Model\Quote\Address\CustomAttributeListInterface::getAttributes
metodą.
Powyższy kod automatycznie obsłuży lokalną trwałość pamięci w interfejsie użytkownika. Możesz uzyskać wartość pola z pamięci lokalnej za pomocą checkoutData.getShippingAddressFromData()
(gdzie checkoutData
jest Magento_Checkout/js/checkout-data
).
- Dodaj mixin, aby zmienić zachowanie „Magento_Checkout / js / action / set-shipping-information” (ten komponent jest odpowiedzialny za przesyłanie danych między etapem wysyłki a rozliczeniem)
========
2.1 Stwórzyour_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 Utwórz swoją nazwę modułu / view / frontend / web / js / action / set-shipping-information-mixin.js
/**
* @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();
});
};
});
- Utwórz swoją nazwę_modułu / etc / extension_attributes.xml
========
<?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>
Spowoduje to dodanie atrybutu rozszerzenia do modelu adresu po stronie zaplecza. Atrybuty rozszerzenia są jednym z punktów rozszerzenia, które zapewnia Magento. Aby uzyskać dostęp do swoich danych na zapleczu, możesz użyć:
// Magento will generate interface that includes your custom attribute
$value = $address->getExtensionAttributes()->getCustomField();
Mam nadzieję, że to pomaga i zostanie dodane do oficjalnej dokumentacji.