Magento 2: Получение атрибутов расширения в ShippingInformation - PullRequest
0 голосов
/ 29 марта 2019

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

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

и т.д. / 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\Block\Checkout\LayoutProcessor">
       <plugin name="checkout_customshipping_fields" type="VendorName\ModuleName\Plugin\Checkout\LayoutProcessorPlugin" sortOrder="10"/>
   </type>
   <type name="Magento\Checkout\Model\ShippingInformationManagement">
      <plugin name="save_customshipping_to_quote" type="VendorName\ModuleName\Plugin\Quote\SaveToQuote" sortOrder="10"/>
   </type>
</config>

и т.д. / 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="Magento\Checkout\Api\Data\ShippingInformationInterface">
       <attribute code="customfield1" type="string" />
       <attribute code="customfield2" type="string" />
   </extension_attributes>
</config>

Plugin / SaveToQuote.php

<?php

namespace VendorName\ModuleName\Plugin\Quote;

use Magento\Quote\Model\QuoteRepository;

class SaveToQuote
{
   protected $quoteRepository;
   protected $logger;

   public function __construct(
       QuoteRepository $quoteRepository,
       \Psr\Log\LoggerInterface $logger
   ) {
       $this->quoteRepository = $quoteRepository;
       $this->logger = $logger;
   }

   public function beforeSaveAddressInformation(
       \Magento\Checkout\Model\ShippingInformationManagement $subject,
       $cartId,
       \Magento\Checkout\Api\Data\ShippingInformationInterface $addressInformation
   ) {
       if(!$extAttributes = $addressInformation->getExtensionAttributes())
           return;

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

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

   }
}

просмотр / интерфейс / 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'
        }
    }
 };

вид / интерфейс / веб / JS / просмотр / 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() && this.validateShippingInformation()) {
                setShippingInformationAction().done(
                    function () {
                        stepNavigator.next();
                    }
                );
            }
        },

        validateMyShipping: function () {

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

            if (this.source.get('customfields') && 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);
    };
 });

вид / интерфейс / веб / JS / модель / доставка-копи-процессор / полезный расширитель-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;
    };
});

вид / интерфейс / веб / JS / просмотр / доставка-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);
    };
});

Внутри mixin-файла shipping-information.js getShippingMethodTitle () я ожидал увидеть цитата [ 'extensionattributes'] [ 'СпециальноеПоле1'] цитата [ 'extensionattributes'] [ 'customfield2']

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

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

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

...