Як встановити метод доставки за замовчуванням у випадку декількох способів доставки в magento 2?


14

Існує 2 способи доставки, і за замовчуванням ніхто не обраний, користувачеві потрібно вручну вибрати його, в результаті він каже, що доставка (невизначена-невизначена). Я хочу, щоб перший пункт був автоматично вибраний, якщо не вибрано жодного, як це можна зробити в 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>

Після цього нам потрібно створити Requjs для переосмислення цього js.

Простір імен / Модуль / view / frontend / Requjs-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: статичний контент: розгортання

Якщо я хочу надати параметр у конфігурації, для якого способу доставки слід вибрати, то які типи змін потрібно зробити для цього?
Індійський

2
Це не працює належним чином. Він не працює, коли ми заповнюємо форму, а потім, коли ми намагаємось вибрати інший спосіб доставки, ми не можемо її вибрати. він знову автоматично вибере спосіб доставки за замовчуванням.
Індійський

1
Я змінив це і додав виклик, щоб selectShippingMethodAction(ratesData[0]);знизити трохи нижче методу, після того, як він буде шукати вже вибрані методи, щоб він не перекривав їх.
thaddeusmt

це працює добре. Але при використанні onestepcheckout, як ми можемо отримати суму доставки, щоб оновити підсумок замовлення? Здається, вартість доставки в підсумковій
Magento Learner

Це чудово, але я рекомендую використовувати комбінації, прокручуйте кілька відповідей вниз, як їх використовувати, а потім використовувати рядки з цієї відповіді;)
Sanne,

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

У якому файлі це?
Ерфан

@ Бенджамін, це працює добре. Але при використанні onestepcheckout, як ми можемо також оновити замовлення? здається, вартість доставки в загальній кількості замовлень оновлюється лише при натисканні на спосіб доставки вручну.
Magento Learner

1
Це має бути прийнята відповідь
Tailtiu

5

Для досягнення цієї зміни не потрібен цілий модуль. Ви можете просто розширити модуль оформлення замовлення та змінити свою тему.

  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

дякую працюю чудово
Tirth Patel

2

Можливо, ви хочете зробити це вибрати за замовчуванням найдешевший спосіб доставки.

У вашому модулі, призначений для вирішення даних для перевірки їзди, можливо, ви можете замість цього використовувати міксин.

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

у методі resolutionShippingRates модифікуйте, як показано нижче:

        /**
         * @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 Learner

@MagentoLearner Я також шукаю рішення :(
user00247

2

Хоча вищезазначені методи пропонують переосмислити функції js, я б рекомендував використовувати mixins, щоб уникнути зайвих зіткнень з кодом:

У свій frontend Requjs-config.js додайте наступне:

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

У вашій реєстрації-data-resolutionver.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]


0

Кожен, хто використовує onestepcheckout, може спробувати це:

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

Я знаю, що це виглядає нерозумно, але чомусь додаю, що затримка справді спрацювала для мене. Вартість доставки оновлюється саме так.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.