有2种运输方式,默认情况下未选择任何一种,用户必须手动选择一种,其结果是运输(未定义-未定义)。我希望如果未选择任何一项,应该自动选择第一项,如何在magento 2中完成
有2种运输方式,默认情况下未选择任何一种,用户必须手动选择一种,其结果是运输(未定义-未定义)。我希望如果未选择任何一项,应该自动选择第一项,如何在magento 2中完成
Answers:
据我从您的问题中了解到,当有人进入结帐页面时,您始终希望选择一种送货方式。
为此,我们需要覆盖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.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;
}
...
就是这样,您现在要做的就是:
selectShippingMethodAction(ratesData[0]);
在查找已经选择的方法之后在该方法中向更低的方向添加了downn 的调用,因此不会覆盖它们。
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]);
}
}
不需要整个模块来实现此更改。您可以简单地扩展Checkout模块并在主题中覆盖。
将js文件checkout-data-resolver.js
从 复制
vendor\magento\module-checkout\view\frontend\web\js\model
到
app \ design \ frontend \ Namespace \ ThemeName \ Magento_Checkout \ web \ js \ model。
用以下代码找到行:
if (ratesData.length == 1) {
并将其替换为:
if (ratesData.length >= 1 && !selectedShippingRate) {
您可能想做的是默认情况下选择最便宜的送货方式。
在模块中的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]);
}
尽管上述方法建议重写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]
使用onestepcheckout的任何人都可以尝试以下操作:
if (ratesData.length >= 1) {
setTimeout(function(){
selectShippingMethodAction(ratesData[0]);
}, 500)
return;
}
我知道这看起来很愚蠢,但是由于某种原因,添加延迟确实对我有用。运费正在这样更新。