在magento 2中有多种送货方式的情况下,如何设置默认送货方式?


Answers:


22

据我从您的问题中了解到,当有人进入结帐页面时,您始终希望选择一种送货方式。

为此,我们需要覆盖Magento_Checkout模块中的javascript。

首先,我们需要创建一个模块:

命名空间/模块/registration.php

<?php

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

命名空间/模块/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>

之后,我们需要创建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.jsMagento_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模块:启用Namespace_Module
  • 运行安装程序升级:php bin / magento setup:upgrade
  • 进行静态部署:php bin / magento setup:static-content:deploy

如果我想在配置中提供选择应该选择哪种运输方式的选项,那么需要为此进行哪些类型的更改?
印度“

2
这不能正常工作。填写表格后,当我们尝试选择其他送货方式时,我们将无法选择它。它将自动再次选择默认的运输方式。
印度

1
我对此进行了修改,并selectShippingMethodAction(ratesData[0]);在查找已经选择的方法之后在该方法中向更低的方向添加了downn 的调用,因此不会覆盖它们。
thaddeusmt

运行良好。但是,在使用onestepcheckout时,如何获取订单摘要的发货金额呢?手动单击送货方式时,订单摘要中的送货费用似乎首先得到更新
Magento Learner

这很好用,但是我建议使用mixins,向下滚动一些答案以使用这些答案,然后使用此答案中的内容;)
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]);
    }
}

这是哪个文件?
Erfan '18

@Benjamin,运作良好。但是,当使用onestepcheckout时,我们如何也可以更新订单总数?似乎仅在手动单击送货方式时,才会更新订单总额中的送货费用。
Magento Learner

1
这应该是公认的答案
Tailtiu

5

不需要整个模块来实现此更改。您可以简单地扩展Checkout模块并在主题中覆盖。

  1. 将js文件checkout-data-resolver.js
    复制
    vendor\magento\module-checkout\view\frontend\web\js\model

    app \ design \ frontend \ Namespace \ ThemeName \ Magento_Checkout \ web \ js \ model。

  2. 用以下代码找到行:
    if (ratesData.length == 1) {
    并将其替换为:
    if (ratesData.length >= 1 && !selectedShippingRate) {


1
如果客户在结帐页面中预先填充了默认的送货地址或购物车页面中预先填充了邮政编码,则它不会保留这些值。在这种情况下,有什么方法可以保留这些值?
sahana

运行良好。但是,如何才能更新订单摘要的运费呢?订单摘要中的运费似乎只有在手动单击运费方式时才会更新
Magento Learner

感谢工作正常
Tirth Patel

2

您可能想做的是默认情况下选择最便宜的送货方式。

在模块中的checkout-data-resolver模块中,可以选择使用mixin。

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

在resolveShippingRates方法中进行如下修改:

        /**
         * @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 '19

@ user00247尚未。如果您有解决方案,请分享。
Magento Learner

@MagentoLearner我也在寻找解决方案:(
user00247 '19

2

尽管上述方法建议重写js函数,但我还是建议使用mixins以避免不必要的代码冲突:

在您的前端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]


0

使用onestepcheckout的任何人都可以尝试以下操作:

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

我知道这看起来很愚蠢,但是由于某种原因,添加延迟确实对我有用。运费正在这样更新。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.