귀하의 질문에 따라 귀하는 이미 확장 속성이 설정되어 있다고 가정합니다. 나는 비슷한 수정을했으며 희망적으로 내 대답이 도움이되기를 바랍니다.
사용자 정의 모듈에서 requirejs-config 파일을 작성하여 기본 운송 프로세서 / 기본을 확장하십시오.
네임 스페이스 /CustomModule/view/frontend/requirejs-config.js
var config = {
"지도": {
"*": {
'Magento_Checkout / js / model / shipping-save-processor / default': 'Namespace_CustomModule / js / model / shipping-save-processor / default'
}
}
};
페이로드에 확장 속성을 추가하십시오.
/ * 전역 정의, 경고 * /
밝히다(
[
'jquery',
'ko',
'Magento_Checkout / js / model / quote',
'Magento_Checkout / js / model / resource-url-manager',
'마법사 / 보관',
'Magento_Checkout / js / model / payment-service',
'Magento_Checkout / js / model / payment / method-converter',
'Magento_Checkout / js / model / error-processor',
'Magento_Checkout / js / model / 전체 화면 로더',
'Magento_Checkout / js / action / select-billing-address'
],
기능
$,
ko,
인용문,
resourceUrlManager,
저장,
paymentService,
methodConverter,
errorProcessor,
fullScreenLoader,
selectBillingAddressAction
) {
'엄격한 사용';
{
saveShippingInformation : 함수 () {
var 페이로드;
if (! quote.billingAddress ()) {
selectBillingAddressAction (quote.shippingAddress ());
}
// 배송 주소에 확장 속성 추가
페이로드 = {
주소 정보 : {
배송 _ 주소 : quote.shippingAddress (),
billing_address : quote.billingAddress (),
shipping_method_code : quote.shippingMethod (). method_code,
shipping_carrier_code : quote.shippingMethod (). carrier_code,
extension_attributes : {
custom_field : $ ( '# custom_field'). val (),
}
}
};
fullScreenLoader.startLoader ();
반품 저장
resourceUrlManager.getUrlForSetShippingInformation (quote),
JSON.stringify (페이로드)
).끝난(
기능 (응답) {
quote.setTotals (응답. 총계);
paymentService.setPaymentMethods (methodConverter (response.payment_methods));
fullScreenLoader.stopLoader ();
}
).실패(
기능 (응답) {
errorProcessor.process (응답);
fullScreenLoader.stopLoader ();
}
);
}
};
}
);
플러그인을 사용하여 견적에 속성을 저장하십시오 (여기서 관찰자를 사용할 수 있는지 확실하지 않습니다).
di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Checkout\Model\ShippingInformationManagement">
<plugin name="Namespace_CustomModule_save_delivery_date_in_quote" type="Namespace\CustomModule\Plugin\Checkout\SaveAddressInformation" />
</type>
</config>
SaveAddressInformation.php
SaveAddressInformation 클래스
{
보호 된 $ quoteRepository;
공공 함수 __construct (
\ Magento \ Quote \ Model \ QuoteRepository $ quoteRepository
) {
$ this-> quoteRepository = $ quoteRepository;
}
/ **
* @param \ Magento \ Checkout \ Model \ ShippingInformationManagement $ 제목
* @param $ cartId
* @param \ Magento \ Checkout \ Api \ Data \ ShippingInformation 인터페이스 $ addressInformation
* /
beforeAddressAddressInformation 공용 함수 (
\ 마 젠토 \ 체크 아웃 \ 모델 \ 배송 정보 관리 $ 제목,
$ cartId,
\ 마 젠토 \ 체크 아웃 \ Api \ 데이터 \ 배송 정보 인터페이스 $ addressInformation
) {
$ extensionAttributes = $ addressInformation-> getExtensionAttributes ();
$ customField = $ extensionAttributes-> getCustomField ();
$ quote = $ this-> quoteRepository-> getActive ($ cartId);
$ quote-> setCustomField ($ customField);
}
}
Observer events.xml을 사용하여 주문에 속성을 저장하십시오.
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="sales_model_service_quote_submit_before">
<observer name="unique_observer_name" instance="Namespace\CustomModule\Observer\SaveCustomFieldToOrder"/>
</event>
</config>
SaveCustomFieldToOrder.php
SaveCustomFieldToOrder 클래스는 ObserverInterface를 구현합니다.
{
/ **
* @var \ Magento \ Framework \ ObjectManagerInterface
* /
보호 된 $ _objectManager;
/ **
* @param \ Magento \ Framework \ ObjectManager 인터페이스 $ objectmanager
* /
공용 함수 __construct (\ Magento \ Framework \ ObjectManagerInterface $ objectmanager)
{
$ this-> _ objectManager = $ objectmanager;
}
공용 함수 실행 (EventObserver $ observer)
{
$ order = $ observer-> getOrder ();
$ quoteRepository = $ this-> _ objectManager-> create ( 'Magento \ Quote \ Model \ QuoteRepository');
/ ** @var \ Magento \ Quote \ Model \ Quote $ quote * /
$ quote = $ quoteRepository-> get ($ order-> getQuoteId ());
$ order-> setCustomField ($ quote-> getCustomField ());
$ this를 반환;
}
}