มี 2 วิธีการจัดส่งและโดยค่าเริ่มต้นไม่มีใครถูกเลือกผู้ใช้จะต้องเลือกด้วยตนเองด้วยเหตุนี้มันบอกว่าการจัดส่ง (ไม่ได้กำหนดไม่ได้กำหนด) ฉันต้องการให้รายการแรกควรถูกเลือกโดยอัตโนมัติหากไม่มีผู้ใดถูกเลือกวิธีการนี้สามารถทำได้ใน magento 2
มี 2 วิธีการจัดส่งและโดยค่าเริ่มต้นไม่มีใครถูกเลือกผู้ใช้จะต้องเลือกด้วยตนเองด้วยเหตุนี้มันบอกว่าการจัดส่ง (ไม่ได้กำหนดไม่ได้กำหนด) ฉันต้องการให้รายการแรกควรถูกเลือกโดยอัตโนมัติหากไม่มีผู้ใดถูกเลือกวิธีการนี้สามารถทำได้ใน magento 2
คำตอบ:
ดังที่ฉันเข้าใจจากคำถามของคุณคือคุณต้องการให้มีวิธีการจัดส่งที่เลือกไว้เสมอเมื่อมีคนเข้ามาในหน้าชำระเงิน
เพื่อให้บรรลุสิ่งนี้เราต้องแทนที่จาวาสคริปต์จากโมดูล Magento_Checkout
สิ่งแรกสิ่งแรกเราต้องสร้างโมดูล:
Namespace / โมดูล / registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Namespace_Module',
__DIR__
);
Namespace / โมดูล / 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
Namespace / โมดูล / view / ส่วนหน้า / 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]);
}
}
ไม่จำเป็นต้องโมดูลทั้งหมดเพื่อให้บรรลุการเปลี่ยนแปลงนี้ คุณสามารถขยายโมดูลการชำระเงินและลบล้างในธีมของคุณได้อย่างง่ายดาย
คัดลอกไฟล์ 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) {
สิ่งที่คุณอาจต้องทำคือเลือกวิธีการจัดส่งที่ถูกที่สุดตามค่าเริ่มต้น
ในโมดูลของคุณเกี่ยวกับการแก้ไขข้อมูลการแก้ไขตัวเลือกคุณอาจเลือกใช้มิกซ์อินแทน
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]);
}
ในขณะที่วิธีการข้างต้นแนะนำให้เอาชนะฟังก์ชั่น 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]
ทุกคนที่ใช้ onestepcheckout สามารถลองทำสิ่งนี้:
if (ratesData.length >= 1) {
setTimeout(function(){
selectShippingMethodAction(ratesData[0]);
}, 500)
return;
}
ฉันรู้ว่ามันดูโง่ แต่ด้วยเหตุผลบางอย่างที่เพิ่มความล่าช้านั้นได้ผลจริงสำหรับฉัน ค่าจัดส่งกำลังอัพเดทตัวเองเช่นนี้