วิธีการตั้งค่าวิธีการจัดส่งเริ่มต้นในกรณีที่มีวิธีการจัดส่งหลายวิธีใน magento 2


14

มี 2 ​​วิธีการจัดส่งและโดยค่าเริ่มต้นไม่มีใครถูกเลือกผู้ใช้จะต้องเลือกด้วยตนเองด้วยเหตุนี้มันบอกว่าการจัดส่ง (ไม่ได้กำหนดไม่ได้กำหนด) ฉันต้องการให้รายการแรกควรถูกเลือกโดยอัตโนมัติหากไม่มีผู้ใดถูกเลือกวิธีการนี้สามารถทำได้ใน magento 2

คำตอบ:


22

ดังที่ฉันเข้าใจจากคำถามของคุณคือคุณต้องการให้มีวิธีการจัดส่งที่เลือกไว้เสมอเมื่อมีคนเข้ามาในหน้าชำระเงิน

เพื่อให้บรรลุสิ่งนี้เราต้องแทนที่จาวาสคริปต์จากโมดูล 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;
            }

            ...

และนั่นคือทั้งหมดที่คุณต้องทำตอนนี้คือ:

  • เปิดใช้งานโมดูล: โมดูล php bin / magento: เปิดใช้งาน Namespace_Module
  • เรียกใช้การอัพเกรดการติดตั้ง: การตั้งค่า php bin / magento: อัพเกรด
  • ทำการปรับใช้แบบคงที่: การตั้งค่า php bin / magento: เนื้อหาคงที่: ปรับใช้

หากฉันต้องการให้ตัวเลือกในการกำหนดค่าที่ควรเลือกวิธีการจัดส่งการเปลี่ยนแปลงประเภทใดที่จำเป็นต้องทำ
ชาวอินเดีย

2
สิ่งนี้ทำงานไม่ถูกต้อง มันจะไม่ทำงานเมื่อเรากรอกแบบฟอร์มแล้วเมื่อเราพยายามเลือกวิธีการจัดส่งอื่น ๆ แล้วเราจะไม่สามารถเลือกได้ มันจะเลือกวิธีการจัดส่งเริ่มต้นอีกครั้งโดยอัตโนมัติ
อินเดีย

1
ฉันแก้ไขสิ่งนี้และเพิ่มการเรียกไปยังselectShippingMethodAction(ratesData[0]);downn ในระดับล่างในวิธีการหลังจากค้นหาวิธีที่เลือกไว้แล้วดังนั้นจึงไม่แทนที่พวกเขา
thaddeusmt

มันใช้งานได้ดี แต่เมื่อใช้งานการตรวจเช็คชำระเงินเราจะรับจำนวนการจัดส่งเพื่อสรุปการสั่งซื้อได้อย่างไร? ดูเหมือนว่าค่าขนส่งในสรุปการสั่งซื้อครั้งแรกจะได้รับการอัพเดทเมื่อทำการคลิกวิธีการจัดส่งด้วยตนเอง
Magento Learner

นี้ทำงานได้ดี แต่ผมจะแนะนำให้ใช้ mixins เลื่อนคำตอบไม่กี่ลงวิธีการใช้งานเหล่านั้นและจากนั้นใช้เส้นจากคำตอบนี้;)
ซานน์

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

@Benjamin มันทำงานได้ดี แต่เมื่อใช้งานการตรวจเช็คชำระเงินแล้วเราจะรับการสั่งซื้อทั้งหมดที่อัพเดทได้อย่างไร? ดูเหมือนว่าต้นทุนการจัดส่งในยอดรวมการสั่งซื้อจะได้รับการอัปเดตเมื่อคลิกวิธีการจัดส่งด้วยตนเองเท่านั้น
วีโอไอพีเรียนที่

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Tailtiu

5

ไม่จำเป็นต้องโมดูลทั้งหมดเพื่อให้บรรลุการเปลี่ยนแปลงนี้ คุณสามารถขยายโมดูลการชำระเงินและลบล้างในธีมของคุณได้อย่างง่ายดาย

  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

สิ่งที่คุณอาจต้องทำคือเลือกวิธีการจัดส่งที่ถูกที่สุดตามค่าเริ่มต้น

ในโมดูลของคุณเกี่ยวกับการแก้ไขข้อมูลการแก้ไขตัวเลือกคุณอาจเลือกใช้มิกซ์อินแทน

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]);
            }

มันใช้งานได้ดี แต่เราจะทราบจำนวนการจัดส่งเพื่อสรุปการสั่งซื้อได้อย่างไร ดูเหมือนว่าค่าขนส่งในสรุปการสั่งซื้อจะอัพเดทเฉพาะเมื่อทำการคลิกวิธีการจัดส่งด้วยตนเอง
Magento Learner

@MagentoLearner คุณมีวิธีแก้ไขปัญหานี้หรือไม่?
user00247

@ user00247 ยังไม่ หากคุณมีวิธีการแก้ปัญหาโปรดแบ่งปัน
Magento Learner

@MagentoLearner ฉันกำลังค้นหาวิธีแก้ปัญหาด้วย :(
user00247

2

ในขณะที่วิธีการข้างต้นแนะนำให้เอาชนะฟังก์ชั่น 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]


0

ทุกคนที่ใช้ onestepcheckout สามารถลองทำสิ่งนี้:

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

ฉันรู้ว่ามันดูโง่ แต่ด้วยเหตุผลบางอย่างที่เพิ่มความล่าช้านั้นได้ผลจริงสำหรับฉัน ค่าจัดส่งกำลังอัพเดทตัวเองเช่นนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.