Sur la base de votre question, je suppose que vos attributs d'extension sont déjà configurés. J'ai effectué une modification similaire et j'espère que ma réponse vous aidera.
Dans votre module personnalisé, créez un fichier requirejs-config pour étendre le processeur d'expédition par défaut / default
Espace de noms / CustomModule / view / frontend / requirejs-config.js
var config = {
"carte": {
"*": {
'Magento_Checkout / js / model / shipping-save-processor / default': 'Namespace_CustomModule / js / model / shipping-save-processor / default'
}
}
};
Ajoutez votre attribut d'extension à la charge utile.
/ * définition globale, alerte * /
définir(
[
«jquery»,
«ko»,
'Magento_Checkout / js / model / quote',
'Magento_Checkout / js / model / resource-url-manager',
«mage / stockage»,
«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'
],
une fonction (
$,
ko,
citation,
resourceUrlManager,
espace de rangement,
paymentService,
methodConverter,
errorProcessor,
fullScreenLoader,
selectBillingAddressAction
) {
«utiliser strictement»;
revenir {
saveShippingInformation: function () {
var charge utile;
if (! quote.billingAddress ()) {
selectBillingAddressAction (quote.shippingAddress ());
}
// Ajout des attributs d'extension à votre adresse de livraison
charge utile = {
addressInformation: {
shipping_address: 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 ();
return storage.post (
resourceUrlManager.getUrlForSetShippingInformation (devis),
JSON.stringify (charge utile)
).terminé(
fonction (réponse) {
quote.setTotals (response.totals);
paymentService.setPaymentMethods (methodConverter (response.payment_methods));
fullScreenLoader.stopLoader ();
}
).échouer(
fonction (réponse) {
errorProcessor.process (réponse);
fullScreenLoader.stopLoader ();
}
);
}
};
}
);
Enregistrez l'attribut dans votre devis avec un plugin (je ne sais pas si vous pouvez utiliser un observateur ici, je n'ai pas vérifié).
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
classe SaveAddressInformation
{
$ quoteRepository protégé;
fonction publique __construct (
\ Magento \ Quote \ Model \ QuoteRepository $ quoteRepository
) {
$ this-> quoteRepository = $ quoteRepository;
}
/ **
* @param \ Magento \ Checkout \ Model \ ShippingInformationManagement $ subject
* @param $ cartId
* @param \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface $ addressInformation
* /
fonction publique beforeSaveAddressInformation (
\ Magento \ Checkout \ Model \ ShippingInformationManagement $ subject,
$ cartId,
\ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface $ addressInformation
) {
$ extensionAttributes = $ addressInformation-> getExtensionAttributes ();
$ customField = $ extensionAttributes-> getCustomField ();
$ quote = $ this-> quoteRepository-> getActive ($ cartId);
$ quote-> setCustomField ($ customField);
}
}
Enregistrez l'attribut dans votre commande avec un observateur 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
La classe SaveCustomFieldToOrder implémente ObserverInterface
{
/ **
* @var \ Magento \ Framework \ ObjectManagerInterface
* /
protected $ _objectManager;
/ **
* @param \ Magento \ Framework \ ObjectManagerInterface $ objectmanager
* /
fonction publique __construct (\ Magento \ Framework \ ObjectManagerInterface $ objectmanager)
{
$ this -> _ objectManager = $ objectmanager;
}
fonction publique exécuter (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 ());
retourner $ this;
}
}