Як встановити метод доставки за замовчуванням у випадку декількох способів доставки в 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.