Jak ustawić domyślną metodę wysyłki w przypadku wielu metod wysyłki w Magento 2?

14

Istnieją 2 metody wysyłki i domyślnie nikt nie jest zaznaczony, użytkownik musi ręcznie wybrać jedną, w wyniku czego mówi o wysyłce (niezdefiniowana-niezdefiniowana). Chcę, aby Pierwszy element był automatycznie wybierany, jeśli żaden nie zostanie wybrany, jak można to zrobić w Magento 2

Arun Karnawat
źródło

Odpowiedzi:

22

Z twojego pytania wynika, że ​​chcesz zawsze mieć wybraną metodę wysyłki, gdy ktoś wejdzie na stronę kasy.

Aby to osiągnąć, musimy przesłonić javascript z modułu Magento_Checkout.

Po pierwsze, musimy stworzyć moduł:

Przestrzeń nazw / moduł / rejestracja.php

<?php

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

Przestrzeń nazw / moduł / 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>

Następnie musimy utworzyć wymagane pliki do zastąpienia tego pliku.

Przestrzeń nazw / moduł / widok / frontend / Requjs-config.js

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

Teraz musimy skopiować checkout-data-resolver.jsz Magento_Checkout/view/frontend/web/js/modelnaszego modułu tą samą ścieżkąNamespace_Module/view/frontend/web/js/model

Następnie musimy zmienić warunek wewnątrz funkcji resolveShippingRates: function (ratesData)

Od:

            ...

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

                return;
            }

            ...

Do:

           ...

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

                return;
            }

            ...

I to wszystko, wszystko, co musisz teraz zrobić, to:

  • Aktywuj moduł: moduł bin / magento: włącz moduł przestrzeni nazw
  • Uruchom aktualizację instalacji: php bin / magento setup: aktualizacja
  • Wykonaj wdrożenie statyczne: konfiguracja php bin / magento: zawartość statyczna: wdrożenie
Catalin Ionita
źródło
Jeśli chcę podać opcję konfiguracji, dla której metody wysyłki należy wybrać, jakie rodzaje zmian należy w tym celu zrobić?
Indian
2
To nie działa poprawnie. Nie będzie działać, gdy wypełnimy formularz, a następnie, gdy spróbujemy wybrać inną metodę wysyłki, nie będziemy mogli go wybrać. automatycznie wybierze domyślną metodę wysyłki.
Indianin
1
Zmodyfikowałem to i dodałem wywołanie do selectShippingMethodAction(ratesData[0]);downn nieco w metodzie, po tym jak szuka już wybranych metod, więc nie zastępuje ich.
thaddeusmt
działa dobrze. Ale kiedy korzystamy z opcji onestepcheckout, w jaki sposób możemy również zaktualizować kwotę wysyłki do podsumowania zamówienia? wydaje się, że koszt wysyłki w podsumowaniu zamówienia jest najpierw aktualizowany po ręcznym kliknięciu metody wysyłki
Magento Learner
Działa to świetnie, ale polecam używanie mixin, przewiń kilka odpowiedzi w dół, jak ich używać, a następnie użyj wierszy z tej odpowiedzi;)
Sanne
8
if (ratesData.length >= 1) {
  //set shipping rate if we have only one available shipping rate
  selectShippingMethodAction(ratesData[0]);

  return;
}

Uniemożliwi to wybranie innej opcji wysyłki. To rozwiązuje problem dla mnie:

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]);
    }
}
Benzoes
źródło
W którym to jest pliku?
Erfan
@Benjamin, działa dobrze. Ale kiedy korzystamy z narzędzia onestepcheckout, w jaki sposób możemy również zaktualizować sumę zamówienia? wydaje się, że koszt wysyłki w całości zamówienia jest aktualizowany tylko po ręcznym kliknięciu metody wysyłki.
Magento Learner
1
To powinna być zaakceptowana odpowiedź
Tailtiu
5

Nie ma potrzeby, aby cały moduł osiągnął tę zmianę. Możesz po prostu rozszerzyć moduł kasy i zastąpić w swoim motywie.

  1. Skopiuj plik js checkout-data-resolver.js
    z
    vendor\magento\module-checkout\view\frontend\web\js\model
    do
    app \ design \ frontend \ Namespace \ ThemeName \ Magento_Checkout \ web \ js \ model.

  2. Znajdź wiersz z następującym kodem:
    if (ratesData.length == 1) {
    i zamień go na:
    if (ratesData.length >= 1 && !selectedShippingRate) {

Constantin C.
źródło
1
Nie zachowuje wartości, jeśli klient ma domyślny adres wysyłki wstępnie wypełniony na stronie kasy lub kod pocztowy jest wstępnie wypełniony na stronie koszyka. Czy istnieje jakiś sposób na zachowanie wartości w tym przypadku?
sahana,
działa dobrze. Ale w jaki sposób możemy zaktualizować kwotę wysyłki do podsumowania zamówienia? wydaje się, że koszt wysyłki w podsumowaniu zamówienia jest aktualizowany tylko po ręcznym kliknięciu metody wysyłki
Magento Learner
dzięki działa dobrze
Tirth Patel
2

To, co prawdopodobnie chcesz zrobić, to domyślnie wybrać najtańszą metodę wysyłki.

W twoim module over drive checkout-data-resolver, opcjonalnie możesz zamiast tego użyć mixinu.

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

w metodzie resolShippingRates zmodyfikuj jak poniżej:

        /**
         * @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
źródło
działa dobrze. Ale w jaki sposób możemy zaktualizować kwotę wysyłki do podsumowania zamówienia? wydaje się, że koszt wysyłki w podsumowaniu zamówienia jest aktualizowany tylko po ręcznym kliknięciu metody wysyłki
Magento Learner
@MagentoLearner, czy masz rozwiązanie tego problemu?
user00247
@ user00247 jeszcze nie. jeśli masz rozwiązanie, udostępnij je.
Magento Learner
@MagentoLearner Szukam również rozwiązania :(
user00247
2

Podczas gdy powyższe metody sugerują przesłonięcie funkcji js, polecam użycie mixin, aby uniknąć niepotrzebnych kolizji kodu:

W swoim interfejsie wymagajjs-config.js dodaj następujące elementy:

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

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

Możesz też pobrać moduł tutaj, który pozwala wybrać domyślną metodę wysyłki i płatności: Domyślna metoda wysyłki i płatności [M2]

Hungersoft
źródło
0

Każdy, kto korzysta z narzędzia onestepcheckout, może spróbować:

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

Wiem, że to wygląda głupio, ale z jakiegoś powodu dodanie tego opóźnienia naprawdę mi pomogło. Koszt wysyłki sam się aktualizuje.

Mirko Zovko
źródło