Magento 2 Aggiungi l'elenco a discesa al metodo di spedizione


16

Sviluppo metodi di spedizione per alcune aziende di logistica. Questa società ha molti uffici in cui il cliente può ottenere il suo ordine. Posso ottenere l'elenco degli uffici per ity in API ma ora non rappresento meglio questo passaggio?

Per ora ho appena impostato nuovi \Magento\Quote\Model\Quote\Address\RateResult\Method uffici in ogni città, nelle grandi città conta> 100 e penso che non sia molto buono impostare 100 linee in cassa.

Sarà un modulo pubblico per la progettazione di diversi checkout, quindi come posso rendere vicino al mio metodo di spedizione selezionato un elenco a discesa con un elenco di uffici e impostare prezzo e metodo dopo che l'utente lo ha selezionato.


@Zefiryn Ho trovato questo post molto interessante, ma ho una domanda, se devo mostrare nella selezione non gli uffici ma i negozi che si trovano all'interno del modulo di Amasty, come farei la seconda parte del tuo post? Voglio dire: dov'è il posto in cui chiamo l'helper di Amasty per riempire il componente XML "vendor_carrier_form"? Grazie
maverickk89,

Se hai una nuova domanda, chiedila facendo clic sul pulsante Poni domanda . Includere un collegamento a questa domanda se aiuta a fornire un contesto. - Dalla recensione
Jai,

questa non è una nuova domanda ma una variante del modo in cui Zefiryn ha usato ... perché ho usato la prima parte del post così com'è
maverickk89

Risposte:


17

Il checkout Magento non supporta alcun tipo di modulo per dati aggiuntivi sul metodo di spedizione. Ma fornisce un shippingAdditionalblocco nel checkout che può essere utilizzato per questo. La seguente soluzione funzionerà per il checkout magento standard.

Per prima cosa prepariamo il nostro contenitore dove possiamo mettere un po 'di modulo. Per fare ciò, creare un file inview/frontend/layout/checkout_index_index.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="checkout.root">
            <arguments>
                <argument name="jsLayout" xsi:type="array">
                    <item name="components" xsi:type="array">
                        <item name="checkout" xsi:type="array">
                            <item name="children" xsi:type="array">
                                <item name="steps" xsi:type="array">
                                    <item name="children" xsi:type="array">
                                        <item name="shipping-step" xsi:type="array">
                                            <item name="children" xsi:type="array">
                                                <item name="shippingAddress" xsi:type="array">
                                                    <item name="children" xsi:type="array">
                                                        <item name="shippingAdditional" xsi:type="array">
                                                            <item name="component" xsi:type="string">uiComponent</item>
                                                            <item name="displayArea" xsi:type="string">shippingAdditional</item>
                                                            <item name="children" xsi:type="array">
                                                                <item name="vendor_carrier_form" xsi:type="array">
                                                                    <item name="component" xsi:type="string">Vendor_Module/js/view/checkout/shipping/form</item>
                                                                </item>
                                                            </item>
                                                        </item>
                                                    </item>
                                                </item>
                                            </item>
                                        </item>
                                    </item>
                                </item>
                            </item>
                        </item>
                    </item>
                </argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

Ora crea un file in Vendor/Module/view/frontend/web/js/view/checkout/shipping/form.jscui verrà visualizzato un modello knockout. Il suo contenuto è simile al seguente

define([
    'jquery',
    'ko',
    'uiComponent',
    'Magento_Checkout/js/model/quote',
    'Magento_Checkout/js/model/shipping-service',
    'Vendor_Module/js/view/checkout/shipping/office-service',
    'mage/translate',
], function ($, ko, Component, quote, shippingService, officeService, t) {
    'use strict';

    return Component.extend({
        defaults: {
            template: 'Vendor_Module/checkout/shipping/form'
        },

        initialize: function (config) {
            this.offices = ko.observableArray();
            this.selectedOffice = ko.observable();
            this._super();
        },

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

            this.showOfficeSelection = ko.computed(function() {
                return this.ofices().length != 0
            }, this);

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

            quote.shippingMethod.subscribe(function(method) {
                var selectedMethod = method != null ? method.carrier_code + '_' + method.method_code : null;
                if (selectedMethod == 'carrier_method') {
                    this.reloadOffices();
                }
            }, this);

            this.selectedOffice.subscribe(function(office) {
                if (quote.shippingAddress().extensionAttributes == undefined) {
                    quote.shippingAddress().extensionAttributes = {};
                }
                quote.shippingAddress().extensionAttributes.carrier_office = office;
            });


            return this;
        },

        setOfficeList: function(list) {
            this.offices(list);
        },

        reloadOffices: function() {
            officeService.getOfficeList(quote.shippingAddress(), this);
            var defaultOffice = this.offices()[0];
            if (defaultOffice) {
                this.selectedOffice(defaultOffice);
            }
        },

        getOffice: function() {
            var office;
            if (this.selectedOffice()) {
                for (var i in this.offices()) {
                    var m = this.offices()[i];
                    if (m.name == this.selectedOffice()) {
                        office = m;
                    }
                }
            }
            else {
                office = this.offices()[0];
            }

            return office;
        },

        initSelector: function() {
            var startOffice = this.getOffice();
        }
    });
});

Questo file utilizza un modello knockout che dovrebbe essere inserito Vendor/Module/view/frontend/web/template/checkout/shipping/form.html

<div id="carrier-office-list-wrapper" data-bind="visible: selectedMethod() == 'carrier_method'">
    <p data-bind="visible: !showOfficeSelection(), i18n: 'Please provide postcode to see nearest offices'"></p>
    <div data-bind="visible: showOfficeSelection()">
        <p>
            <span data-bind="i18n: 'Select pickup office.'"></span>
        </p>
        <select id="carrier-office-list" data-bind="options: offices(),
                                            value: selectedOffice,
                                            optionsValue: 'name',
                                            optionsText: function(item){return item.location + ' (' + item.name +')';}">
        </select>
    </div>
</div>

Ora abbiamo un campo selezionato che sarà visibile quando il nostro metodo (definito dal suo codice) sarà selezionato nella tabella dei metodi di spedizione. È ora di riempirlo con alcune opzioni. Poiché i valori dipendono dall'indirizzo, il modo migliore è creare un endpoint di riposo che fornirà le opzioni disponibili. NelVendor/Module/etc/webapi.xml

<?xml version="1.0"?>

<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">

    <!-- Managing Office List on Checkout page -->
    <route url="/V1/module/get-office-list/:postcode/:city" method="GET">
        <service class="Vendor\Module\Api\OfficeManagementInterface" method="fetchOffices"/>
        <resources>
            <resource ref="anonymous" />
        </resources>
    </route>
</routes>

Ora definisci l'interfaccia in Vendor/Module/Api/OfficeManagementInterface.phpas

namespace Vendor\Module\Api;

interface OfficeManagementInterface
{

    /**
     * Find offices for the customer
     *
     * @param string $postcode
     * @param string $city
     * @return \Vendor\Module\Api\Data\OfficeInterface[]
     */
    public function fetchOffices($postcode, $city);
}

Definire l'interfaccia per i dati dell'ufficio in Vendor\Module\Api\Data\OfficeInterface.php . Questa interfaccia verrà utilizzata dal modulo webapi per filtrare i dati per l'output, quindi è necessario definire tutto ciò che è necessario aggiungere nella risposta.

namespace Vendor\Module\Api\Data;

/**
 * Office Interface
 */
interface OfficeInterface
{
    /**
     * @return string
     */
    public function getName();

    /**
     * @return string
     */
    public function getLocation();
}

Tempo per le lezioni reali. Inizia con la creazione di preferenze per tutte le interfacce inVendor/Module/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">
    <preference for="Vendor\Module\Api\OfficeManagementInterface" type="Vendor\Module\Model\OfficeManagement" />
    <preference for="Vendor\Module\Api\Data\OfficeInterface" type="Vendor\Module\Model\Office" />
</config>

Ora crea Vendor\Module\Model\OfficeManagement.php classe che farà effettivamente la logica del recupero dei dati.

namespace Vednor\Module\Model;

use Vednor\Module\Api\OfficeManagementInterface;
use Vednor\Module\Api\Data\OfficeInterfaceFactory;

class OfficeManagement implements OfficeManagementInterface
{
    protected $officeFactory;

    /**
     * OfficeManagement constructor.
     * @param OfficeInterfaceFactory $officeInterfaceFactory
     */
    public function __construct(OfficeInterfaceFactory $officeInterfaceFactory)
    {
        $this->officeFactory = $officeInterfaceFactory;
    }

    /**
     * Get offices for the given postcode and city
     *
     * @param string $postcode
     * @param string $limit
     * @return \Vendor\Module\Api\Data\OfficeInterface[]
     */
    public function fetchOffices($postcode, $city)
    {
        $result = [];
        for($i = 0, $i < 4;$i++) {
            $office = $this->officeFactory->create();
            $office->setName("Office {$i}");
            $office->setLocation("Address {$i}");
            $result[] = $office;
        }

        return $result;
    }
}

E infine lezione per OfficeInterfaceinVendor/Module/Model/Office.php

namespace Vendor\Module\Model;

use Magento\Framework\DataObject;
use Vendor\Module\Api\Data\OfficeInterface;

class Office extends DataObject implements OfficeInterface
{
    /**
     * @return string
     */
    public function getName()
    {
        return (string)$this->_getData('name');
    }

    /**
     * @return string
     */
    public function getLocation()
    {
        return (string)$this->_getData('location');
    }
}

Questo dovrebbe mostrare il campo di selezione e aggiornarlo quando l'indirizzo viene cambiato. Ma ci manca un altro elemento per la manipolazione del frontend. Dobbiamo creare una funzione che chiamerà l'endpoint. Call to it è già incluso in Vendor/Module/view/frontend/web/js/view/checkout/shipping/form.jsed è Vendor_Module/js/view/checkout/shipping/office-serviceclass che dovrebbe andare Vendor/Module/view/frontend/web/js/view/checkout/shipping/office-service.jscon il seguente codice:

define(
    [
        'Vendor_Module/js/view/checkout/shipping/model/resource-url-manager',
        'Magento_Checkout/js/model/quote',
        'Magento_Customer/js/model/customer',
        'mage/storage',
        'Magento_Checkout/js/model/shipping-service',
        'Vendor_Module/js/view/checkout/shipping/model/office-registry',
        'Magento_Checkout/js/model/error-processor'
    ],
    function (resourceUrlManager, quote, customer, storage, shippingService, officeRegistry, errorProcessor) {
        'use strict';

        return {
            /**
             * Get nearest machine list for specified address
             * @param {Object} address
             */
            getOfficeList: function (address, form) {
                shippingService.isLoading(true);
                var cacheKey = address.getCacheKey(),
                    cache = officeRegistry.get(cacheKey),
                    serviceUrl = resourceUrlManager.getUrlForOfficeList(quote);

                if (cache) {
                    form.setOfficeList(cache);
                    shippingService.isLoading(false);
                } else {
                    storage.get(
                        serviceUrl, false
                    ).done(
                        function (result) {
                            officeRegistry.set(cacheKey, result);
                            form.setOfficeList(result);
                        }
                    ).fail(
                        function (response) {
                            errorProcessor.process(response);
                        }
                    ).always(
                        function () {
                            shippingService.isLoading(false);
                        }
                    );
                }
            }
        };
    }
);

Utilizza altri 2 file js. Vendor_Module/js/view/checkout/shipping/model/resource-url-managercrea un URL per l'endpoint ed è piuttosto semplice

define(
    [
        'Magento_Customer/js/model/customer',
        'Magento_Checkout/js/model/quote',
        'Magento_Checkout/js/model/url-builder',
        'mageUtils'
    ],
    function(customer, quote, urlBuilder, utils) {
        "use strict";
        return {
            getUrlForOfficeList: function(quote, limit) {
                var params = {postcode: quote.shippingAddress().postcode, city: quote.shippingAddress().city};
                var urls = {
                    'default': '/module/get-office-list/:postcode/:city'
                };
                return this.getUrl(urls, params);
            },

            /** Get url for service */
            getUrl: function(urls, urlParams) {
                var url;

                if (utils.isEmpty(urls)) {
                    return 'Provided service call does not exist.';
                }

                if (!utils.isEmpty(urls['default'])) {
                    url = urls['default'];
                } else {
                    url = urls[this.getCheckoutMethod()];
                }
                return urlBuilder.createUrl(url, urlParams);
            },

            getCheckoutMethod: function() {
                return customer.isLoggedIn() ? 'customer' : 'guest';
            }
        };
    }
);

Vendor_Module/js/view/checkout/shipping/model/office-registryè un modo per mantenere il risultato nella memoria locale. Il suo codice è:

define(
    [],
    function() {
        "use strict";
        var cache = [];
        return {
            get: function(addressKey) {
                if (cache[addressKey]) {
                    return cache[addressKey];
                }
                return false;
            },
            set: function(addressKey, data) {
                cache[addressKey] = data;
            }
        };
    }
);

Ok, quindi dovremmo lavorare tutti sul frontend. Ma ora c'è un altro problema da risolvere. Poiché il checkout non è a conoscenza di questo modulo, non invierà il risultato della selezione al back-end. Per far sì che ciò accada, dobbiamo utilizzare la extension_attributesfunzione. Questo è un modo in magento2 di informare il sistema che alcuni dati aggiuntivi dovrebbero essere inclusi nelle chiamate rimanenti. Senza di essa il magento filtrerebbe quei dati e non raggiungerebbero mai il codice.

Quindi prima di tutto Vendor/Module/etc/extension_attributes.xmldefinisci:

<?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\Quote\Api\Data\AddressInterface">
        <attribute code="carrier_office" type="string"/>
    </extension_attributes>
</config>

Questo valore è già inserito nella richiesta form.jsper this.selectedOffice.subscribe()definizione. Quindi la configurazione sopra passerà solo all'ingresso. Per recuperarlo nel codice, crea un plug-inVendor/Module/etc/di.xml

<type name="Magento\Quote\Model\Quote\Address">
    <plugin name="inpost-address" type="Vendor\Module\Quote\AddressPlugin" sortOrder="1" disabled="false"/>
</type>

All'interno di quella classe

namespace Vendor\Module\Plugin\Quote;

use Magento\Quote\Model\Quote\Address;
use Vendor\Module\Model\Carrier;

class AddressPlugin
{
    /**
     * Hook into setShippingMethod.
     * As this is magic function processed by __call method we need to hook around __call
     * to get the name of the called method. after__call does not provide this information.
     *
     * @param Address $subject
     * @param callable $proceed
     * @param string $method
     * @param mixed $vars
     * @return Address
     */
    public function around__call($subject, $proceed, $method, $vars)
    {
        $result = $proceed($method, $vars);
        if ($method == 'setShippingMethod'
            && $vars[0] == Carrier::CARRIER_CODE.'_'.Carrier::METHOD_CODE
            && $subject->getExtensionAttributes()
            && $subject->getExtensionAttributes()->getCarrierOffice()
        ) {
            $subject->setCarrierOffice($subject->getExtensionAttributes()->getCarrierOffice());
        }
        elseif (
            $method == 'setShippingMethod'
            && $vars[0] != Carrier::CARRIER_CODE.'_'.Carrier::METHOD_CODE
        ) {
            //reset office when changing shipping method
            $subject->getCarrierOffice(null);
        }
        return $result;
    }
}

Ovviamente dove risparmierai il valore dipende interamente dalle tue esigenze. Il codice sopra richiederebbe creando ulteriore colonna carrier_officein quote_addresse sales_addresstabelle e un evento (in Vendor/Module/etc/events.xml)

<?xml version="1.0"?>

<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="copy_carrier_office" instance="Vendor\Module\Observer\Model\Order" />
    </event>
</config>

Ciò copierebbe i dati salvati nell'indirizzo del preventivo all'indirizzo di vendita.

Ho scritto questo per il mio modulo per il corriere polacco InPost, quindi ho cambiato alcuni nomi che potrebbero violare il codice, ma spero che questo ti dia ciò di cui hai bisogno.

[MODIFICARE]

Modello Carrier richiesto da @sangan

namespace Vendor\Module\Model;

use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\Phrase;
use Magento\Quote\Model\Quote\Address\RateRequest;
use Magento\Shipping\Model\Carrier\AbstractCarrier;
use Magento\Shipping\Model\Carrier\CarrierInterface;
use Magento\Shipping\Model\Simplexml\ElementFactory;

class Carrier extends AbstractCarrier implements CarrierInterface
{
    const CARRIER_CODE = 'mycarier';

    const METHOD_CODE = 'mymethod';

    /** @var string */
    protected $_code = self::CARRIER_CODE;

    /** @var bool */
    protected $_isFixed = true;

    /**
     * Prepare stores to show on frontend
     *
     * @param RateRequest $request
     * @return \Magento\Framework\DataObject|bool|null
     */
    public function collectRates(RateRequest $request)
    {
        if (!$this->getConfigData('active')) {
            return false;
        }

        /** @var \Magento\Shipping\Model\Rate\Result $result */
        $result = $this->_rateFactory->create();

        /** @var \Magento\Quote\Model\Quote\Address\RateResult\Method $method */
        $method = $this->_rateMethodFactory->create();
        $method->setCarrier($this->_code);
        $method->setCarrierTitle($this->getConfigData('title'));

        $price = $this->getFinalPriceWithHandlingFee(0);
        $method->setMethod(self::METHOD_CODE);
        $method->setMethodTitle(new Phrase('MyMethod'));
        $method->setPrice($price);
        $method->setCost($price);
        $result->append($method);;

        return $result;
    }


    /**
     * @return array
     */
    public function getAllowedMethods()
    {
        $methods = [
            'mymethod' => new Phrase('MyMethod')
        ];
        return $methods;
    }
}

Grazie per la tua risposta estesa, cercherò di risolvere il mio problema usando il tuo metodo e risponderò con il risultato in questi giorni.
Siarhey Uchukhlebau,

@Zefiryn Ho creato un metodo di spedizione personalizzato, di seguito verrà visualizzato un menu a discesa con i numeri di conto di spedizione del cliente (è stato creato un attributo cliente personalizzato), quindi se devo visualizzare questo menu a discesa quanta percentuale del tuo codice sarà utile? Cosa devo prelevare dal codice che hai fornito?
Shireen N,

@shireen direi circa il 70%. È necessario modificare la parte in cui recupera le macchine in numeri di conto. Quindi la definizione di api sarà leggermente diversa e parte di essa
Zefiryn,

Ho provato questo modulo ... ma la sua non mostrando alcuna modifica in modo si prega di condividere il lavoro module.if qualsiasi
Sangan

dopo aver aggiunto correttamente il modulo ..in checkout ajax caricando continuamente .. nell'errore console che mostra come di seguito: request.js: 166 Errore non rilevato: errore di script per: Vendor_Module / js / view / checkout / shipping / model / office-register. requirejs.org/docs/errors.html#scripterror
sangan

2

Sto aggiungendo una nuova risposta per espandere ciò che era già stato fornito in precedenza ma senza distorcerlo.

Questa è la rotta che si QuoteAddressPluginstava agganciando a:

1. Magento\Checkout\Api\ShippingInformationManagementInterface::saveAddressInformation()
2. Magento\Quote\Model\QuoteRepository::save() 
3. Magento\Quote\Model\QuoteRepository\SaveHandler::save() 
4. Magento\Quote\Model\QuoteRepository\SaveHandler::processShippingAssignment() 
5. Magento\Quote\Model\Quote\ShippingAssignment\ShippingAssignmentPersister::save()
6. Magento\Quote\Model\Quote\ShippingAssignment\ShippingAssignmentProcessor::save()
7. Magento\Quote\Model\Quote\ShippingAssignment\ShippingProcessor::save()
8. Magento\Quote\Model\ShippingMethodManagement::apply() 

L'ultimo metodo è stato chiamare Magento\Quote\Model\Quote\Address::setShippingMethod()che era in realtà chiamata per Magento\Quote\Model\Quote\Address::__call()cui ho usato. In questo momento ho trovato un posto migliore per il plugin, è un Magento\Quote\Model\ShippingAssignment::setShipping()metodo. Quindi la parte del plugin può essere riscritta in:

<type name="Magento\Quote\Model\ShippingAssignment">
    <plugin name="carrier-office-plugin" type="Vendor\Module\Plugin\Quote\ShippingAssignmentPlugin" sortOrder="1" disabled="false"/>
</type>

e plug-in stesso:

namespace Vednor\Module\Plugin\Quote;

use Magento\Quote\Api\Data\AddressInterface;
use Magento\Quote\Api\Data\ShippingInterface;
use Magento\Quote\Model\ShippingAssignment;
use Vendor\Module\Model\Carrier;

/**
 * ShippingAssignmentPlugin
 */
class ShippingAssignmentPlugin
{
    /**
     * Hook into setShipping.
     *
     * @param ShippingAssignment $subject
     * @param ShippingInterface $value
     * @return Address
     */
    public function beforeSetShipping($subject, ShippingInterface $value)
    {
        $method = $value->getMethod();
        /** @var AddressInterface $address */
        $address = $value->getAddress();
        if ($method === Carrier::CARRIER_CODE.'_'.Carrier::METHOD_CODE
            && $address->getExtensionAttributes()
            && $address->getExtensionAttributes()->getCarrierOffice()
        ) {
            $address->setCarrierOffice($address->getExtensionAttributes()->getCarrierOffice());
        }
        elseif ($method !== Carrier::CARRIER_CODE.'_'.Carrier::METHOD_CODE) {
            //reset inpost machine when changing shipping method
            $address->setCarrierOffice(null);
        }
        return [$value];
    }
}

1

@Zefiryn, ho riscontrato il problema con: quote.shippingAddress().extensionAttributes.carrier_office = office;

Quando arrivo alla cassa per la prima volta (nuova finestra privata) come ospite (ma lo stesso accade con il client registrato), l'attributo office non viene salvato nel database dopo il primo "Avanti". Anche se nella console vedo l'output corretto per:console.log(quote.shippingAddress().extensionAttributes.carrier_office);

Quando torno alla prima pagina di checkout e seleziono di nuovo l'ufficio, viene salvato. Quale potrebbe essere la ragione di questo comportamento?

Ho provato ad usare: address.trigger_reload = new Date().getTime(); rateRegistry.set(address.getKey(), null); rateRegistry.set(address.getCacheKey(), null); quote.shippingAddress(address);

ma senza successo ...


0

@Zefiryn, puoi spiegare in poche parole come funziona il tuo plugin sopra? Sono un po 'confuso perché, come so, il metodo __call viene eseguito se proviamo a eseguire un metodo che non esiste per un particolare oggetto. Sembra essere vero perché in app / code / Magento / Quote / Model / Quote / Address.php non vedo questo metodo - solo commento:

/** * Sales Quote address model ... * @method Address setShippingMethod(string $value)

  1. Perché usi l'intercettazione quando non esiste l'implementazione del metodo?
  2. Poi vedo $subject->setInpostMachinee $subject->getCarrierOffice(null);Significa che il metodo del plugin sopra verrà eseguito di nuovo in quanto non esiste un metodo setInpostMachine () e getCarrierOffice () nella classe Adress? Mi sembra loop.
  3. Da dove viene eseguito Magento setShippingMethod()? Come viene normalmente utilizzato questo metodo? Non riesco a trovare intercettazioni simili nel codice Magento.

Ok, quindi ho preparato la risposta in base a un modulo che ho scritto per i test, ha usato il campo inpost_machine, quindi questo non è stato correttamente modificato in carrier_office in questo posto. In secondo luogo, al momento in cui stavo sviluppando questo modulo non ho trovato un posto dove poter ottenere sia il corriere selezionato che l'indirizzo con gli attributi di estensione inviati tranne la setShippingMethodchiamata AddressInterfacesull'oggetto e poiché non esiste un metodo simile, ho dovuto usare around__call per vedere se setShippingMethodè stato chiamato o qualche altro campo magico. In questo momento ho trovato un posto migliore e lo posterò in una nuova risposta.
Zefiryn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.