Magento 2 Dropdown-Liste zur Versandart hinzufügen

16

Ich entwickle eine Versandmethode für ein Logistikunternehmen. Diese Firma hat viele Büros, in denen der Kunde seine Bestellung erhalten kann. Ich kann die Liste der Büros nach Stadt in der API abrufen, aber wie kann ich diesen Schritt jetzt nicht besser darstellen?

Im Moment habe ich \Magento\Quote\Model\Quote\Address\RateResult\Method jedes Büro in der Stadt neu eingerichtet, in der Großstadt sind es mehr als 100, und ich denke, es ist nicht sehr gut, 100 Zeilen in der Kasse einzustellen.

Es wird ein öffentliches Modul für verschiedene Checkout-Designs sein, also wie kann ich eine Dropdown-Liste mit einer Liste von Büros in der Nähe meiner ausgewählten Versandmethode rendern und den Preis und die Methode festlegen, nachdem der Benutzer eine ausgewählt hat.

Jamess Moriarty
quelle
@Zefiryn Ich fand diesen Beitrag sehr interessant, aber ich habe eine Frage, wenn ich in der Auswahl nicht die Büros, sondern die Geschäfte zeigen muss, die sich in Amastys Modul befinden, wie würde ich den zweiten Teil Ihres Beitrags machen? Ich meine: Wo ist der Ort, an dem ich den Helfer von Amasty anrufe, um die XML-Komponente "vendor_carrier_form" auszufüllen? Vielen Dank
maverickk89
Wenn Sie eine neue Frage haben, fragen Sie es bitte durch Klicken Frage stellen Taste. Fügen Sie einen Link zu dieser Frage hinzu, wenn dies zur Bereitstellung des Kontexts beiträgt. - Aus der Bewertung
Jai
Dies ist keine neue Frage, sondern eine Abwandlung der von Zefiryn verwendeten Methode ... weil ich den ersten Teil des Beitrags so verwendet habe, wie er ist
maverickk89

Antworten:

17

Magento Checkout unterstützt keine Formulare für zusätzliche Versandartdaten. Aber es gibt einen shippingAdditionalBlock in der Kasse, der dafür verwendet werden kann. Die folgende Lösung funktioniert für die normale Magento-Kaufabwicklung.

Lassen Sie uns zuerst unseren Container vorbereiten, in den wir eine Form einfügen können. Erstellen Sie dazu eine Datei 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>

Erstellen Sie nun eine Datei, in Vendor/Module/view/frontend/web/js/view/checkout/shipping/form.jsder eine Aussparungsvorlage gerendert wird. Sein Inhalt sieht so aus

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();
        }
    });
});

Diese Datei verwendet eine Aussparungsvorlage, die abgelegt werden sollte 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>

Wir haben jetzt ein Auswahlfeld, das sichtbar ist, wenn unsere (durch ihren Code definierte) Methode in der Versandartentabelle ausgewählt wird. Zeit, es mit einigen Optionen zu füllen. Da die Werte von der Adresse abhängig sind, können Sie am besten einen Ruheendpunkt erstellen, der die verfügbaren Optionen bereitstellt. ImVendor/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>

Definieren Sie nun die Schnittstelle in Vendor/Module/Api/OfficeManagementInterface.phpals

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);
}

Schnittstelle für Bürodaten definieren in Vendor\Module\Api\Data\OfficeInterface.php. Diese Schnittstelle wird vom webapi-Modul verwendet, um Daten für die Ausgabe zu filtern, sodass Sie definieren müssen, was Sie der Antwort hinzufügen möchten.

namespace Vendor\Module\Api\Data;

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

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

Zeit für den eigentlichen Unterricht. Beginnen Sie mit dem Erstellen von Einstellungen für alle Schnittstellen 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>

Erstellen Sie nun eine Vendor\Module\Model\OfficeManagement.phpKlasse, die die Logik zum Abrufen der Daten ausführt.

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;
    }
}

Und zum Schluss Klasse für 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');
    }
}

Dies sollte das Auswahlfeld anzeigen und aktualisieren, wenn die Adresse geändert wird. Es fehlt jedoch noch ein Element für die Frontend-Manipulation. Wir müssen eine Funktion erstellen, die den Endpunkt aufruft. Der Aufruf dazu ist bereits in enthalten Vendor/Module/view/frontend/web/js/view/checkout/shipping/form.jsund es ist eine Vendor_Module/js/view/checkout/shipping/office-serviceKlasse, die Vendor/Module/view/frontend/web/js/view/checkout/shipping/office-service.jsmit dem folgenden Code aufgerufen werden sollte:

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);
                        }
                    );
                }
            }
        };
    }
);

Es werden 2 weitere js-Dateien verwendet. Vendor_Module/js/view/checkout/shipping/model/resource-url-managerErstellt eine URL zum Endpunkt und ist ziemlich einfach

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-registryist eine Möglichkeit, das Ergebnis im lokalen Speicher zu halten. Sein Code lautet:

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, wir sollten also alle am Frontend arbeiten. Aber jetzt gibt es ein anderes Problem zu lösen. Da Checkout nichts über dieses Formular weiß, wird das Auswahlergebnis nicht an das Backend gesendet. Um dies zu erreichen, müssen wir verwendenextension_attributes Funktion verwenden. Dies ist eine Möglichkeit in magento2, das System darüber zu informieren, dass einige zusätzliche Daten in den restlichen Aufrufen erwartet werden. Ohne sie würde Magento diese Daten herausfiltern und sie würden niemals den Code erreichen.

Also zuerst Vendor/Module/etc/extension_attributes.xmldefinieren:

<?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>

Dieser Wert ist form.jsper this.selectedOffice.subscribe()Definition bereits in die Anfrage eingefügt . Die obige Konfiguration wird also nur am Eingang übergeben. Um es in den Code zu holen, erstelle ein PluginVendor/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>

In dieser Klasse

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;
    }
}

Wo Sie den Wert speichern, hängt natürlich ganz von Ihren Anforderungen ab. Für den obigen Code müssten zusätzliche Spalten carrier_officein quote_addressund sales_addressTabellen sowie ein Ereignis (in Vendor/Module/etc/events.xml) erstellt werden.

<?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>

Dadurch würden die in der Angebotsadresse gespeicherten Daten in die Verkaufsadresse kopiert.

Ich habe dies für mein Modul für den polnischen Anbieter InPost geschrieben, sodass ich einige Namen geändert habe, die möglicherweise den Code sprengen, aber ich hoffe, dies wird Ihnen das geben, was Sie brauchen.

[BEARBEITEN]

Carrier-Modell von @sangan gefragt

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;
    }
}
Zefiryn
quelle
Vielen Dank für Ihre erweiterte Antwort. Ich werde versuchen, mein Problem mithilfe Ihrer Methode zu lösen, und werde in diesen Tagen mit dem Ergebnis antworten.
Siarhey Uchukhlebau
@Zefiryn Ich habe eine benutzerdefinierte Versandmethode erstellt. Darunter wird eine Dropdown-Liste mit den Versandkontonummern des Kunden angezeigt (es wurde ein benutzerdefiniertes Kundenattribut erstellt). Wenn ich also diese Dropdown-Liste anzeigen muss, wie viel Prozent Ihres Codes sind hilfreich? Was soll ich aus dem von Ihnen angegebenen Code entnehmen?
Shireen N
@shireen würde ich sagen um die 70%. Sie müssen den Teil, in dem Maschinen abgerufen werden, auf Kontonummern ändern. Also wird die API-Definition ein wenig anders sein und ein Teil davon sein
Zefiryn
Ich habe dieses Modul versucht ... aber es ist keine Änderungen zeigt , so wenden Sie sich bitte die Arbeits module.if jeder teilen
Sangan
Nach dem Hinzufügen des erfolgreichen Moduls ..in der Kasse wird Ajax kontinuierlich geladen .. In der Konsole wird der folgende Fehler angezeigt: require.js: 166 Nicht gefundener Fehler: Skriptfehler für: Vendor_Module / js / view / checkout / shipping / model / office-registry. requirejs.org/docs/errors.html#scripterror
sangan
2

Ich füge eine neue Antwort hinzu, um das bereits Gelieferte zu erweitern, ohne es zu verzerren.

Dies ist die Route, QuoteAddressPlugindie eingehakt wurde:

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() 

Die letzte Methode war das Aufrufen des Magento\Quote\Model\Quote\Address::setShippingMethod()Anrufs, Magento\Quote\Model\Quote\Address::__call()den ich verwendet habe. Im Moment habe ich einen besseren Ort für das Plugin gefunden, es ist eine Magento\Quote\Model\ShippingAssignment::setShipping()Methode. So kann der Plugin-Teil umgeschrieben werden:

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

und Plugin selbst:

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];
    }
}
Zefiryn
quelle
1

@Zefiryn, ich bin auf folgendes Problem gestoßen: quote.shippingAddress().extensionAttributes.carrier_office = office;

Wenn ich zum ersten Mal (neues privates Fenster) als Gast zur Kasse gehe (aber dasselbe gilt für einen registrierten Kunden), wird das Attribut office nach dem ersten "Weiter" nicht in der Datenbank gespeichert. Obwohl ich in der Konsole die korrekte Ausgabe für Folgendes sehe:console.log(quote.shippingAddress().extensionAttributes.carrier_office);

Wenn ich zur ersten Checkout-Seite zurückkehre und erneut Büro auswähle, wird es gespeichert. Was könnte der Grund für dieses Verhalten sein?

Ich habe versucht zu benutzen: address.trigger_reload = new Date().getTime(); rateRegistry.set(address.getKey(), null); rateRegistry.set(address.getCacheKey(), null); quote.shippingAddress(address);

aber ohne Erfolg...

user2089098
quelle
0

@Zefiryn, Kannst du in wenigen Worten erklären, wie dein obiges Plugin funktioniert? Ich bin wenig verwirrt, weil, wie ich weiß, die __call-Methode ausgeführt wird, wenn wir versuchen, eine Methode auszuführen, die für ein bestimmtes Objekt nicht existiert. Es scheint wahr zu sein, denn in app / code / Magento / Quote / Model / Quote / Address.php sehe ich keine solche Methode - nur Kommentar:

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

  1. Warum verwenden Sie das Abfangen, wenn keine Methodenimplementierung vorhanden ist?
  2. Als nächstes sehe ich $subject->setInpostMachineund $subject->getCarrierOffice(null);Bedeutet dies, dass die Methode des obigen Plugins erneut ausgeführt wird, da es in der Adressklasse keine setInpostMachine () - und getCarrierOffice () -Methode gibt? Es sieht aus wie Schleife für mich.
  3. Von wo aus Magento ausführen setShippingMethod()? Wie normal wird diese Methode angewendet? Ich kann keine ähnlichen Interceptions in Magento-Code finden.
user2089098
quelle
Ok, also habe ich die Antwort auf der Grundlage eines Moduls vorbereitet, das ich zum Testen geschrieben habe. Es verwendete das Feld inpost_machine, so dass dieses an dieser Stelle einfach nicht richtig in carrier_office geändert wurde. Zweitens habe ich zu der Zeit, als ich dieses Modul entwickelte, keinen Ort gefunden, an dem ich sowohl einen ausgewählten Netzbetreiber als auch eine ausgewählte Adresse mit Nebenstellenattributen erhalten konnte, außer setShippingMethodCall-on- AddressInterfaceObject setShippingMethodgenannt wurde oder ein anderes magisches Feld. Im Moment habe ich einen besseren Ort gefunden und werde ihn in einer neuen Antwort veröffentlichen.
Zefiryn