Как установить метод доставки по умолчанию в случае нескольких методов доставки в magento 2?

14

Существует 2 способа доставки, и по умолчанию никто не выбран, пользователь должен выбрать один вручную, в результате он скажет, что доставка (undefined-undefined). Я хочу, чтобы первый элемент автоматически выбирался, если ни один не выбран, как это можно сделать в magento 2

Арун Карнават
источник

Ответы:

22

Как я понял из вашего вопроса, вы хотите всегда выбирать способ доставки, когда кто-то заходит на страницу оформления заказа.

Чтобы добиться этого, нам нужно переопределить JavaScript из модуля Magento_Checkout.

Перво-наперво, нам нужно создать модуль:

Пространство имен / модуль / registration.php

<?php

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

Пространство имен / модуль / и т.д. / 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>

После этого нам нужно создать requirejs для переопределения этого js.

Пространство имен / модуль / просмотр / интерфейс / requirejs-config.js

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

Теперь мы должны скопировать checkout-data-resolver.jsиз Magento_Checkout/view/frontend/web/js/modelнашего модуля с тем же путемNamespace_Module/view/frontend/web/js/model

После этого нам нужно изменить условие внутри функции resolveShippingRates: function (ratesData)

От:

            ...

            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
                selectShippingMethodAction(ratesData[0]);

                return;
            }

            ...

И это все, что вам нужно сделать сейчас:

  • Активируйте модуль: php bin / magento module: включите Namespace_Module
  • Запустите обновление установки: php bin / magento setup: обновление
  • Выполните статическое развертывание: php bin / magento setup: static-content: deploy
Каталин Ионита
источник
Если я хочу указать в конфигурации, какой метод доставки следует выбрать, то какие типы изменений нужно сделать для этого?
индийский
2
Это не работает должным образом. Он не будет работать, когда мы заполняем форму, а затем, когда мы пытаемся выбрать другой способ доставки, мы не можем выбрать его. Он автоматически выберет способ доставки по умолчанию.
индийский
1
Я изменил это и добавил вызов selectShippingMethodAction(ratesData[0]);метода downn немного ниже в методе, после того как он ищет уже выбранные методы, поэтому он не переопределяет их.
thaddeusmt
это работает хорошо. Но при использовании onetepcheckout, как мы можем также обновить сумму доставки в сводку заказа? кажется, что стоимость доставки в сводке заказа сначала обновляется при ручном нажатии на способ доставки
Magento Learner
Это прекрасно работает, но я бы порекомендовал использовать миксины, прокрутить несколько ответов вниз, как их использовать, а затем использовать строки из этого ответа;)
Санне,
8
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;
    selectShippingMethodAction(ratesData[0]);

    return;
}

if (ratesData.length >= 1) {
    //set shipping rate if we have only one available shipping rate
    if(!selectedShippingRate) {
        selectShippingMethodAction(ratesData[0]);
    }
}
Вениамин
источник
В каком файле это?
Эрфан
@ Бенджамин, все работает хорошо. Но при использовании onetepcheckout, как мы можем также обновить общую сумму заказа? кажется, что стоимость доставки в сумме заказа обновляется только при ручном нажатии на способ доставки.
Magento Learner
1
Это должен быть принятый ответ
Tailtiu
5

Нет необходимости в полном модуле для достижения этого изменения. Вы можете просто расширить модуль Checkout и переопределить его в своей теме.

  1. Скопируйте файл JS Кассовые-данных-resolver.js
    из
    vendor\magento\module-checkout\view\frontend\web\js\model
    для
    приложения \ дизайн \ оболочка \ Пространство имен \ THEMENAME \ Magento_Checkout \ Web \ JS \ модели.

  2. Найдите строку со следующим кодом:
    if (ratesData.length == 1) {
    и замените ее на:
    if (ratesData.length >= 1 && !selectedShippingRate) {

Константин С
источник
1
Значения не сохраняются, если у клиента предварительно указан адрес доставки по умолчанию на странице оформления заказа или почтовый индекс предварительно заполнен на странице корзины. Есть ли способ сохранить значения в этом случае?
Сахана,
это работает хорошо. Но как мы можем обновить сумму доставки в сводке заказа? кажется, что стоимость доставки в сводке заказа обновляется только при ручном нажатии на способ доставки
Magento Learner
спасибо работает отлично
Тирт Патель
2

Что вы, вероятно, хотите сделать, это выбрать самый дешевый способ доставки по умолчанию.

В вашем модуле over-checkout-data-resolver вы можете вместо этого использовать миксин.

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

в методе resolShippingRates измените, как показано ниже:

        /**
         * @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]);
            }
Джоэл Дэйви
источник
это работает хорошо. Но как мы можем обновить сумму доставки в сводке заказа? кажется, что стоимость доставки в сводке заказа обновляется только при ручном нажатии на способ доставки
Magento Learner
@MagentoLearner у вас есть решение этой проблемы?
user00247
@ user00247 еще нет. если у вас есть решение, пожалуйста, поделитесь.
Magento
@MagentoLearner Я также ищу решение :(
user00247
2

Хотя приведенные выше методы предлагают переопределить функции js, я бы рекомендовал использовать миксины, чтобы избежать ненужных конфликтов кода:

В вашем интерфейсе requirejs-config.js добавьте следующее:

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

В вашем 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
        });
    };
});

Кроме того, вы можете скачать модуль здесь, который позволяет выбрать способ доставки и оплаты по умолчанию : Способ доставки и оплаты по умолчанию [M2]

hungersoft
источник
0

Любой, кто использует onestepcheckout, может попробовать это:

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

Я знаю, это выглядит глупо, но по какой-то причине добавив, что задержка действительно сработала для меня. Стоимость доставки обновляется сама по себе.

Мирко Зовко
источник