Magento 2: получение атрибутов расширения в ShippingInformation

#magento2 #shipping

#javascript #php #magento #magento2

Вопрос:

Я хочу отобразить мои пользовательские атрибуты расширения, которые сохранены в quote на боковой панели ShippingInformation (под методом доставки).

Мне удалось успешно сохранить мои атрибуты расширения в моей цитате, но не удалось получить их в заголовке метода доставки () или в цитатах JS objects. Как я могу получить атрибуты расширения для отображения в разделе «способ доставки».

etc/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="MagentoCheckoutBlockCheckoutLayoutProcessor">
       <plugin name="checkout_customshipping_fields" type="VendorNameModuleNamePluginCheckoutLayoutProcessorPlugin" sortOrder="10"/>
   </type>
   <type name="MagentoCheckoutModelShippingInformationManagement">
      <plugin name="save_customshipping_to_quote" type="VendorNameModuleNamePluginQuoteSaveToQuote" sortOrder="10"/>
   </type>
</config>
  

etc/extensions_attributes.xml

 <?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
   <extension_attributes for="MagentoCheckoutApiDataShippingInformationInterface">
       <attribute code="customfield1" type="string" />
       <attribute code="customfield2" type="string" />
   </extension_attributes>
</config>
  

Plugin/SaveToQuote.php

 <?php

namespace VendorNameModuleNamePluginQuote;

use MagentoQuoteModelQuoteRepository;

class SaveToQuote
{
   protected $quoteRepository;
   protected $logger;

   public function __construct(
       QuoteRepository $quoteRepository,
       PsrLogLoggerInterface $logger
   ) {
       $this->quoteRepository = $quoteRepository;
       $this->logger = $logger;
   }

   public function beforeSaveAddressInformation(
       MagentoCheckoutModelShippingInformationManagement $subject,
       $cartId,
       MagentoCheckoutApiDataShippingInformationInterface $addressInformation
   ) {
       if(!$extAttributes = $addressInformation->getExtensionAttributes())
           return;

       $quote = $this->quoteRepository->getActive($cartId);

       $quote->setCustomfield1($extAttributes->getCustomfield1());
       $quote->setCustomfield2($extAttributes->getCustomfield2());

   }
}
  

view/frontend/requirejs-config.js

 var config = {
    config: {
        mixins: {
            'Magento_Checkout/js/view/shipping': {
                'VendorName_ModuleName/js/view/shipping': true
            },
            'Magento_Checkout/js/view/shipping-information': {
                'VendorName_ModuleName/js/view/shipping-information': true
            }
        }
    },
    "map": {
        "*": {
            'Magento_Checkout/js/model/shipping-save-processor/payload-extender': 'VendorName_ModuleName/js/model/shipping-save-processor/payload-extender-override'
        }
    }
 };
  

view/frontend/web/js/view/shipping.js

 define(
    [
        'jquery',
        'underscore',
        'Magento_Ui/js/form/form',
        'ko',
        'Magento_Customer/js/model/customer',
        'Magento_Customer/js/model/address-list',
        'Magento_Checkout/js/model/address-converter',
        'Magento_Checkout/js/model/quote',
        'Magento_Checkout/js/action/create-shipping-address',
        'Magento_Checkout/js/action/select-shipping-address',
        'Magento_Checkout/js/model/shipping-rates-validator',
        'Magento_Checkout/js/model/shipping-address/form-popup-state',
        'Magento_Checkout/js/model/shipping-service',
        'Magento_Checkout/js/action/select-shipping-method',
        'Magento_Checkout/js/model/shipping-rate-registry',
        'Magento_Checkout/js/action/set-shipping-information',
        'Magento_Checkout/js/model/step-navigator',
        'Magento_Ui/js/modal/modal',
        'Magento_Checkout/js/model/checkout-data-resolver',
        'Magento_Checkout/js/checkout-data',
        'uiRegistry',
        'mage/translate',
        'Magento_Checkout/js/model/shipping-rate-service'
    ],function (
        $,
        _,
        Component,
        ko,
        customer,
        addressList,
        addressConverter,
        quote,
        createShippingAddress,
        selectShippingAddress,
        shippingRatesValidator,
        formPopUpState,
        shippingService,
        selectShippingMethodAction,
        rateRegistry,
        setShippingInformationAction,
        stepNavigator,
        modal,
        checkoutDataResolver,
        checkoutData,
        registry,
        $t
    ) {
    'use strict';

    var mixin = {

        initObservable: function () {
            this._super();

            this.selectedMethod = ko.computed(function() {
                var method = quote.shippingMethod();
                var selectedMethod = method != null ? method.carrier_code   '_'   method.method_code : null;
                return selectedMethod;
            }, this);

            return this;
        },

        /**
         * Set shipping information handler
         */
        setShippingInformation: function () {
            if (this.validateMyShipping() amp;amp; this.validateShippingInformation()) {
                setShippingInformationAction().done(
                    function () {
                        stepNavigator.next();
                    }
                );
            }
        },

        validateMyShipping: function () {

            var shippingMethod = quote.shippingMethod().method_code '_' quote.shippingMethod().carrier_code;

            if (this.source.get('customfields') amp;amp; shippingMethod == "customshipping_customshipping") {
                this.source.set('params.invalid', false);
                this.source.trigger('customfields.data.validate');
                if(this.source.get('params.invalid')) {
                    return false;
                }
            }
            return true;
        }
    };

    return function (target) {
        return target.extend(mixin);
    };
 });
  

view/frontend/web/js/model/shipping-save-processor/payload-extender-override.js

 define([
    'jquery',
], function ($) {
    'use strict';
    return function (payloadExtender) {

        payloadExtender.addressInformation['extension_attributes'] = {
            customfield1: $('[name="customfields[customfield1]"]').val(),
            customfield2: $('[name="customfields[customfield2]"]').val()
        };
        console.log('payloadExtender:', payloadExtender.addressInformation); // working, shows extensionattributes

        return payloadExtender;
    };
});
  

view/frontend/web/js/view/shipping-information.js

 define([
    'jquery',
    'uiComponent',
    'Magento_Checkout/js/model/quote',
    'Magento_Checkout/js/model/step-navigator',
    'Magento_Checkout/js/model/sidebar'
], function ($, Component, quote, stepNavigator, sidebarModel) {
    'use strict';


    var mixin = {

        /**
         * @return {String}
         */
        getShippingMethodTitle: function () {
            var shippingMethod = quote.shippingMethod();

            if(shippingMethod) {
                var shippingMethodContent = shippingMethod['carrier_title']   ' - '   shippingMethod['method_title'];

                var shippingMethodCode = shippingMethod['carrier_code']   '_'   shippingMethod['method_code'];
                if(shippingMethodCode === 'customshipping_customshipping') {

                    console.log("SHIPPING METHOD", shippingMethod, quote);
                    // EXTENSION ATTRIBUTES NOT AVAILABLE HERE, I want to change shipping method content
                }

                return shippingMethodContent;
            }
            return '';
        }
    };

    return function (target) {
        return target.extend(mixin);
    };
});
  

Внутри shipping-information.js Смешивание getshippingmethod Title(), я ожидал увидеть
цитата[‘extensionattributes’][‘customfield1’]
цитата[‘extensionattributes’][‘customfield2’]

Я не могу найти, где я могу получить доступ к пользовательским атрибутам расширения из этой функции. Как вы можете видеть, я использовал консоль.войдите, чтобы напечатать объект цитаты, но эти атрибуты нигде не существуют.

Атрибуты были успешно сохранены в моей таблице базы данных ‘quote’.

Что мне нужно сделать, чтобы получить доступ к этим новым атрибутам расширения в mixin для getshippingmethod Title?