มี 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;
}ฉันรู้ว่ามันดูโง่ แต่ด้วยเหตุผลบางอย่างที่เพิ่มความล่าช้านั้นได้ผลจริงสำหรับฉัน ค่าจัดส่งกำลังอัพเดทตัวเองเช่นนี้