나는 당신의 질문에 대답하려고 노력할 것입니다.
없음 . 이는 운송 주소 양식에 사용자 정의 속성을 추가하는 올바른 방법이 아닙니다. 편집 할 필요는 없습니다 new-customer-address.js
. 실제로이 JS 파일은 모든 사전 정의 된 주소 속성을 나열하고 해당 백엔드 인터페이스와 일치 \Magento\Quote\Api\Data\AddressInterface
하지만 Magento는 백엔드 / 프론트 엔드 구성 요소를 수정하지 않고 모든 사용자 정의 속성을 백엔드에 전달하는 기능을 제공합니다 .
언급 된 JS 컴포넌트에는 customAttributes
특성 이 있습니다. $dataScopePrefix
' shippindAddress.custom_attributes
'인 경우 사용자 정의 속성이 자동으로 처리됩니다 .
질문을 올바르게 이해했다면 고객 주소의 일부가 아닌 백엔드에도 데이터를 보내야합니다. 이 질문에 대한 답은 다음과 같습니다.
그것은 달려있다 . 예를 들어, 다음과 같은 접근 방식을 선택할 수 있습니다. 모든 추가 필드를 포함하는 체크 아웃 페이지에 사용자 정의 양식 추가 (like comment, invoice request etc)
, 일부 이벤트를 기반으로이 양식을 처리 할 JS 논리 추가 및 프론트 엔드 및 상점에서 데이터를 수신하는 사용자 정의 서비스 제공 나중에 사용하기 위해 어딘가에.
결제와 관련된 모든 공식 문서는 http://devdocs.magento.com/guides/v2.1/howdoi/checkout/checkout_overview.html에 있습니다. static이라는 용어는 모든 필드가 이미 알려진 / 사전 정의 된 양식을 나타냅니다 (예 : 양식에는 항상 사전 정의 된 레이블이있는 두 개의 텍스트 필드가 있음). 백엔드의 일부 설정에 따라 변경할 수 없습니다.
이러한 형식은을 사용하여 선언 할 수 있습니다 layout XML configuration
. 반면, 동적이라는 용어 는 필드 세트가 변경 될 수있는 양식을 나타냅니다 (예 : 구성 설정에 따라 체크 아웃 양식에 더 많거나 적은 필드가있을 수 있음).
이 경우 이러한 형식을 선언하는 유일한 방법은 LayoutProcessor
플러그인 을 사용하는 것 입니다.
:) Magento는 가능한 한 Magento 사용 / 사용자 지정 중에 판매자에게 중요한 가능한 사용 사례를 최대한 많이 다루려고합니다. 때로는 간단한 사용 사례가 더 복잡 해지는 상황이 발생할 수 있습니다.
도움이 되었기를 바랍니다.
===================================================== ========================
OK ... 코드를 작성할 수 있습니다.)
- LayoutProcessor에 추가 필드를 삽입하는 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
JS 주소 객체의 속성에 필드가 추가됩니다 . 이 특성은 사용자 정의 EAV 주소 속성을 포함하도록 설계되었으며 \Magento\Quote\Model\Quote\Address\CustomAttributeListInterface::getAttributes
메소드 와 관련이 있습니다.
위 코드는 프론트 엔드에서 로컬 스토리지 지속성을 자동으로 처리합니다. checkoutData.getShippingAddressFromData()
(where checkoutData
is Magento_Checkout/js/checkout-data
)를 사용하여 로컬 스토리지에서 필드 값을 얻을 수 있습니다 .
- 'Magento_Checkout / js / action / set-shipping-information'의 동작을 변경하려면 mixin을 추가하십시오 (이 구성 요소는 운송 및 청구 체크 아웃 단계 사이의 데이터 제출을 담당합니다)
========
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. your_module_name / 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();
});
};
});
- your_module_name / 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>
백엔드 측의 모델 주소 지정에 확장 속성을 추가합니다. 확장 속성은 Magento가 제공하는 확장 지점 중 하나입니다. 백엔드에서 데이터에 액세스하려면 다음을 사용할 수 있습니다.
// Magento will generate interface that includes your custom attribute
$value = $address->getExtensionAttributes()->getCustomField();
희망, 이것은 공식 문서에 도움이되고 추가 될 것입니다.