Na podstawie twojego pytania zakładam, że masz już skonfigurowane atrybuty rozszerzenia. Przeprowadziłem podobną modyfikację i mam nadzieję, że moja odpowiedź pomoże.
W swoim module niestandardowym utwórz plik config-wymagany, aby rozszerzyć domyślny procesor wysyłający / domyślny
Przestrzeń nazw / CustomModule / view / frontend / Requjs-config.js
var config = {
„mapa”: {
„*”: {
„Magento_Checkout / js / model / shipping-save-processor / default”: „Namespace_CustomModule / js / model / shipping-save-processor / default”
}
}
};
Dodaj swój atrybut rozszerzenia do ładunku.
/ * globalne definiowanie, alert * /
definiować(
[
„jquery”,
„ko”,
„Magento_Checkout / js / model / quote”,
„Magento_Checkout / js / model / resource-url-manager”,
„mag / magazyn”,
„Magento_Checkout / js / model / payment-service”,
„Magento_Checkout / js / model / payment / method-converter”,
„Magento_Checkout / js / model / error-processor”,
„Magento_Checkout / js / model / full-screen-loader”,
„Magento_Checkout / js / action / select-billing-address”
],
funkcja (
$,
ko
zacytować,
resourceUrlManager,
przechowywanie,
paymentService,
methodConverter,
errorProcessor,
fullScreenLoader,
selectBillingAddressAction
) {
„stosować ścisłe”;
powrót {
saveShippingInformation: function () {
zmienna ładowność;
if (! quote.billingAddress ()) {
selectBillingAddressAction (quote.shippingAddress ());
}
// Dodanie atrybutów rozszerzenia do adresu wysyłki
ładunek = {
addressInformation: {
shipping_address: quote.shippingAddress (),
billing_address: quote.billingAddress (),
shipping_method_code: quote.shippingMethod (). code_code,
shipping_carrier_code: quote.shippingMethod (). przewoźnik_kod,
extension_attributes: {
custom_field: $ ('# custom_field'). val (),
}
}
};
fullScreenLoader.startLoader ();
return storage.post (
resourceUrlManager.getUrlForSetShippingInformation (wycena),
JSON.stringify (ładunek)
).gotowy(
funkcja (odpowiedź) {
quote.setTotals (response.totals);
paymentService.setPaymentMethods (methodConverter (response.payment_methods));
fullScreenLoader.stopLoader ();
}
).zawieść(
funkcja (odpowiedź) {
errorProcessor.process (odpowiedź);
fullScreenLoader.stopLoader ();
}
);
}
};
}
);
Zapisz atrybut do swojego cytatu za pomocą wtyczki (Nie jestem pewien, czy mógłbyś użyć obserwatora tutaj Nie sprawdziłem).
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
klasa SaveAddressInformation
{
chroniony $ quoteRepository;
funkcja publiczna __construct (
\ Magento \ Quote \ Model \ QuoteRepository $ quoteRepository
) {
$ this-> quoteRepository = $ quoteRepository;
}
/ **
* @param \ Magento \ Checkout \ Model \ ShippingInformationManagement $ Temat
* @param $ cartId
* @param \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface $ addressInformation
* /
funkcja publiczna beforeSaveAddressInformation (
\ Magento \ Checkout \ Model \ ShippingInformationManagement $ Temat,
$ cartId,
\ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface $ addressInformation
) {
$ extensionAttributes = $ addressInformation-> getExtensionAttributes ();
$ customField = $ extensionAttributes-> getCustomField ();
$ quote = $ this-> quoteRepository-> getActive ($ cartId);
$ quote-> setCustomField ($ customField);
}
}
Zapisz atrybut do swojego zamówienia za pomocą 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
klasa SaveCustomFieldToOrder implementuje ObserverInterface
{
/ **
* @var \ Magento \ Framework \ ObjectManagerInterface
* /
chroniony $ _objectManager;
/ **
* @param \ Magento \ Framework \ ObjectManagerInterface $ objectmanager
* /
funkcja publiczna __construct (\ Magento \ Framework \ ObjectManagerInterface $ objectmanager)
{
$ this -> _ objectManager = $ objectmanager;
}
wykonanie funkcji publicznej (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 ());
zwróć $ to;
}
}