Wie stelle ich die Standardversandmethode für mehrere Versandmethoden in Magento 2 ein?

13

Es gibt 2 Versandmethoden und standardmäßig ist niemand ausgewählt. Der Benutzer muss manuell eine auswählen. Infolgedessen wird Versand (undefiniert-undefiniert) angezeigt. Ich möchte, dass das erste Element automatisch ausgewählt wird, wenn keines ausgewählt ist, wie dies in Magento 2 durchgeführt werden kann

Arun Karnawat
quelle

Antworten:

20

Wie ich aus Ihrer Frage verstanden habe, möchten Sie immer eine Versandart auswählen, wenn jemand auf die Checkout-Seite kommt.

Um dies zu erreichen, müssen wir ein Javascript aus dem Magento_Checkout-Modul überschreiben.

Zuerst müssen wir ein Modul erstellen:

Namespace / Module / register.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Namespace_Module',
    __DIR__
);

Namespace / Module / etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Namespace_Module" setup_version="1.0.0">
        <sequence>
            <module name="Magento_Checkout"/>
        </sequence>
    </module>
</config>

Danach müssen wir die requirejs erstellen, um diese js zu überschreiben.

Namespace / Module / view / frontend / requirejs-config.js

var config = {
    map: {
        '*': {
            'Magento_Checkout/js/model/checkout-data-resolver': 'Namespace_Module/js/model/checkout-data-resolver'
        }
    }
};

Jetzt müssen wir kopieren checkout-data-resolver.jsvon Magento_Checkout/view/frontend/web/js/modelin unserem Modul mit dem gleichen PfadNamespace_Module/view/frontend/web/js/model

Danach müssen wir eine Bedingung innerhalb der Funktion ändern resolveShippingRates: function (ratesData)

Von:

            ...

            if (ratesData.length == 1) {
                //set shipping rate if we have only one available shipping rate
                selectShippingMethodAction(ratesData[0]);

                return;
            }

            ...

Zu:

           ...

            if (ratesData.length >= 1) {
                //set shipping rate if we have only one available shipping rate
                selectShippingMethodAction(ratesData[0]);

                return;
            }

            ...

Und das ist alles, was Sie jetzt tun müssen, ist:

  • Aktivieren Sie das Modul: php bin / magento module: enable Namespace_Module
  • Führen Sie ein Setup-Upgrade durch: PHP Bin / Magento Setup: Upgrade
  • Führen Sie eine statische Bereitstellung durch: php bin / magento setup: static-content: deploy
Catalin Ionita
quelle
Wenn ich in der Konfiguration eine Option angeben möchte, für die die Versandart ausgewählt werden soll, welche Arten von Änderungen müssen dann dafür vorgenommen werden?
Indianer
2
Dies funktioniert nicht richtig. Es funktioniert nicht, wenn wir das Formular ausfüllen und wenn wir versuchen, eine andere Versandart auszuwählen, können wir es nicht auswählen. Die Standardversandmethode wird automatisch erneut ausgewählt.
Indianer
1
Ich habe dies geändert und den Aufruf selectShippingMethodAction(ratesData[0]);hinzugefügt, um in der Methode etwas niedriger zu sein, nachdem nach den bereits ausgewählten Methoden gesucht wurde, damit sie nicht überschrieben werden.
thaddeusmt
es funktioniert gut Aber wie können wir bei Verwendung von onestepcheckout auch die Versandmenge für die Bestellübersicht aktualisieren? Es scheint, dass die Versandkosten in der Bestellübersicht zuerst aktualisiert werden, wenn Sie manuell auf die Versandart klicken
Magento Learner
Das funktioniert gut, aber ich würde empfehlen, Mixins zu verwenden, ein paar Antworten nach unten zu scrollen und dann die Zeilen aus dieser Antwort zu verwenden;)
Sanne
7
if (ratesData.length >= 1) {
  //set shipping rate if we have only one available shipping rate
  selectShippingMethodAction(ratesData[0]);

  return;
}

Dadurch ist es unmöglich, eine andere Versandoption auszuwählen. Dies löst das Problem für mich:

if (ratesData.length == 1) {
    //set shipping rate if we have only one available shipping rate;
    selectShippingMethodAction(ratesData[0]);

    return;
}

if (ratesData.length >= 1) {
    //set shipping rate if we have only one available shipping rate
    if(!selectedShippingRate) {
        selectShippingMethodAction(ratesData[0]);
    }
}
Benjamin
quelle
In welcher Datei befindet sich das?
Erfan
@ Benjamin, es funktioniert gut. Aber wie können wir bei Verwendung von onestepcheckout auch die Bestellsumme aktualisieren? Es scheint, dass die Versandkosten in der Bestellsumme nur aktualisiert werden, wenn Sie manuell auf die Versandart klicken.
Magento Learner
1
Dies sollte die akzeptierte Antwort sein
Tailtiu
4

Es ist nicht erforderlich, dass das gesamte Modul diese Änderung erreicht. Sie können das Checkout-Modul einfach erweitern und in Ihrem Thema überschreiben.

  1. Kopieren Sie die js-Datei checkout-data-resolver.js
    von
    vendor\magento\module-checkout\view\frontend\web\js\model
    nach
    app \ design \ frontend \ Namespace \ ThemeName \ Magento_Checkout \ web \ js \ model.

  2. Suchen Sie die Zeile mit dem folgenden Code:
    if (ratesData.length == 1) {
    und ersetzen Sie sie durch:
    if (ratesData.length >= 1 && !selectedShippingRate) {

Constantin C.
quelle
1
Die Werte werden nicht beibehalten, wenn die Standardversandadresse des Kunden auf der Checkout-Seite vorab ausgefüllt ist oder die Postleitzahl auf der Warenkorbseite vorab ausgefüllt ist. Gibt es in diesem Fall eine Möglichkeit, die Werte beizubehalten?
Sahana
es funktioniert gut Aber wie können wir auch die Versandmenge zur Bestellübersicht aktualisieren? Es scheint, dass die Versandkosten in der Bestellübersicht nur aktualisiert werden, wenn Sie manuell auf die Versandart klicken
Magento Learner
danke funktioniert gut
Tirth Patel
2

Was Sie wahrscheinlich tun möchten, ist standardmäßig die günstigste Versandart auszuwählen.

Optional können Sie in Ihrem Modul-Over-Ride-Checkout-Daten-Resolver möglicherweise stattdessen ein Mixin verwenden.

var config = {
    map: {
        '*': {
            'Magento_Checkout/js/model/checkout-data-resolver':'MyModule_Checkout/js/view/checkout-data-resolver'
        }
    }
}

Ändern Sie in der resolveShippingRates-Methode Folgendes:

        /**
         * @param {Object} ratesData
         */
        resolveShippingRates: function (ratesData) {
            var selectedShippingRate = checkoutData.getSelectedShippingRate(),
                availableRate = false;
            //Added to find the cheapest rate
            var lowestRateId = _.min(_.keys(ratesData), function(k) { return ratesData[k].amount; });

            if (ratesData.length === 1) {
                //set shipping rate if we have only one available shipping rate
                selectShippingMethodAction(ratesData[0]);

                return;
            }

            // added to select the cheapest rate if no method selected

            if(lowestRateId && !selectedShippingRate && ratesData.length > 0) {
                selectShippingMethodAction(ratesData[lowestRateId]);
            }
Joel Davey
quelle
es funktioniert gut Aber wie können wir auch die Versandmenge zur Bestellübersicht aktualisieren? Es scheint, dass die Versandkosten in der Bestellübersicht nur aktualisiert werden, wenn Sie manuell auf die Versandart klicken
Magento Learner
@MagentoLearner Hast du eine Lösung für dieses Problem?
user00247
@ user00247 noch nicht. Wenn Sie eine Lösung haben, teilen Sie diese bitte mit.
Magento Learner
@MagentoLearner Ich suche auch nach einer Lösung :(
user00247
1

Während die oben genannten Methoden vorschlagen, die js-Funktionen zu überschreiben, würde ich die Verwendung von Mixins empfehlen, um unnötige Codekonflikte zu vermeiden:

Fügen Sie in Ihrem Frontend requirejs-config.js Folgendes hinzu:

var config = {
    config: {
        mixins: {
            'Magento_Checkout/js/model/checkout-data-resolver': {
                '{Vendor}/{Module}/model/checkout-data-resolver': true
            }
        }
    }
};

In Ihrer checkout-data-resolver.js

define([
    'underscore',
    'mage/utils/wrapper',
    'Magento_Checkout/js/checkout-data',
    'Magento_Checkout/js/action/select-shipping-method',
    'Magento_Checkout/js/action/select-payment-method'
],function (_, wrapper, checkoutData, selectShippingMethodAction) {
    'use strict';

    return function (checkoutDataResolver) {

        var resolveShippingRates = wrapper.wrap(
            checkoutDataResolver.resolveShippingRates,
            function (originalResolveShippingRates, ratesData) {
                // select your shipping method here using the ratesData and selectShippingMethodAction
                return originalResolveShippingRates(ratesData);
            }
        );

        return _.extend(checkoutDataResolver, {
            resolveShippingRates: resolveShippingRates
        });
    };
});

Alternativ können Sie das Modul hier herunterladen, mit dem Sie eine Standardversand- und Zahlungsmethode auswählen können: Standardversand- und Zahlungsmethode [M2]

hungersoft
quelle
0

Jeder, der onestepcheckout verwendet, kann dies versuchen:

if (ratesData.length >= 1) {
  setTimeout(function(){
     selectShippingMethodAction(ratesData[0]);
  }, 500)
  return;
}

Ich weiß, dass es dumm aussieht, aber aus irgendeinem Grund hat das Hinzufügen dieser Verzögerung wirklich für mich funktioniert. Die Versandkosten aktualisieren sich so.

Mirko Zovko
quelle