Làm cách nào để đặt phương thức vận chuyển mặc định trong trường hợp có nhiều phương thức giao hàng trong magento 2?


14

Có 2 phương thức Vận chuyển và theo mặc định không có ai được chọn, người dùng phải chọn thủ công, do đó, có nghĩa là vận chuyển (không xác định-không xác định). Tôi muốn rằng mục đầu tiên sẽ được tự động chọn nếu không có mục nào được chọn làm thế nào điều này có thể được thực hiện trong magento 2

Câu trả lời:


21

Theo tôi hiểu từ câu hỏi của bạn là bạn muốn luôn có một phương thức giao hàng được chọn khi có ai đó đến trang thanh toán.

Để đạt được điều này, chúng ta cần ghi đè một javascript từ mô-đun Magento_Checkout.

Trước tiên, chúng ta cần tạo một mô-đun:

Không gian tên / Mô-đun / đăng ký.php

<?php

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

Không gian tên / Mô-đun / 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>

Sau này, chúng ta cần tạo các requestjs để ghi đè js đó.

Không gian tên / Mô-đun / chế độ xem / frontend / allowjs-config.js

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

Bây giờ chúng ta phải sao chép checkout-data-resolver.jstừ Magento_Checkout/view/frontend/web/js/modeltrong mô-đun của mình với cùng một đường dẫnNamespace_Module/view/frontend/web/js/model

Sau đó, chúng ta cần thay đổi một điều kiện bên trong hàm resolveShippingRates: function (ratesData)

Từ:

            ...

            if (ratesData.length == 1) {
                //set shipping rate if we have only one available shipping rate
                selectShippingMethodAction(ratesData[0]);

                return;
            }

            ...

Đến:

           ...

            if (ratesData.length >= 1) {
                //set shipping rate if we have only one available shipping rate
                selectShippingMethodAction(ratesData[0]);

                return;
            }

            ...

Và đó là tất cả, tất cả những gì bạn phải làm bây giờ là:

  • Kích hoạt mô-đun: mô-đun php bin / magento: bật Namespace_Module
  • Chạy nâng cấp thiết lập: php bin / magento setup: nâng cấp
  • Thực hiện triển khai tĩnh: php bin / magento setup: static-content: triển khai

Nếu tôi muốn cung cấp tùy chọn trong cấu hình cho phương thức vận chuyển nào sẽ được chọn thì loại thay đổi nào cần phải thực hiện cho điều đó?
Ấn Độ

2
Điều này là không hoạt động đúng. Nó sẽ không hoạt động khi chúng tôi điền vào biểu mẫu và sau đó khi chúng tôi cố gắng chọn phương thức giao hàng khác thì chúng tôi không thể chọn nó. nó sẽ chọn phương thức vận chuyển mặc định một lần nữa tự động.
Ấn Độ

1
Tôi đã sửa đổi điều này và thêm lệnh gọi selectShippingMethodAction(ratesData[0]);xuống thấp hơn một chút trong phương thức, sau khi nó tìm kiếm các phương thức đã được chọn, vì vậy nó không ghi đè lên chúng.
thaddeusmt

nó hoạt động tốt Nhưng khi sử dụng onestepcheckout, làm thế nào chúng ta có thể nhận được số tiền vận chuyển để tóm tắt đơn hàng? Có vẻ như chi phí vận chuyển trong bản tóm tắt đơn hàng được cập nhật trước tiên khi nhấp vào phương thức giao hàng
Magento Learner

Điều này hoạt động rất tốt, nhưng tôi khuyên bạn nên sử dụng mixins, cuộn một vài câu trả lời về cách sử dụng chúng và sau đó sử dụng các dòng từ câu trả lời này;)
Sanne

8
if (ratesData.length >= 1) {
  //set shipping rate if we have only one available shipping rate
  selectShippingMethodAction(ratesData[0]);

  return;
}

Điều này sẽ làm cho không thể chọn bất kỳ tùy chọn vận chuyển khác. Điều này giải quyết vấn đề cho tôi:

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

Trong tập tin này là gì?
Erfan

@Benjamin, nó hoạt động tốt. Nhưng khi sử dụng onestepcheckout, làm thế nào chúng ta có thể nhận được tổng số đơn đặt hàng được cập nhật? có vẻ như chi phí vận chuyển trong tổng đơn hàng chỉ được cập nhật khi nhấp thủ công vào phương thức giao hàng.
Học viên Magento

1
Đây phải là câu trả lời được chấp nhận
Tailtiu 22/11/19

5

Không cần cho toàn bộ mô-đun để đạt được sự thay đổi này. Bạn có thể đơn giản mở rộng mô-đun Checkout và ghi đè trong chủ đề của mình.

  1. Sao chép tập tin js kiểm tra dữ liệu-resolver.js
    từ
    vendor\magento\module-checkout\view\frontend\web\js\model
    để
    ứng dụng \ thiết kế \ frontend \ Namespace \ THEMENAME \ Magento_Checkout \ web \ js \ mô hình.

  2. Định vị dòng bằng mã sau:
    if (ratesData.length == 1) {
    và thay thế bằng:
    if (ratesData.length >= 1 && !selectedShippingRate) {


1
Nó không giữ lại các giá trị nếu khách hàng có địa chỉ giao hàng mặc định được điền trước trong trang thanh toán hoặc mã zip được đặt trước trong trang giỏ hàng. Có cách nào để giữ lại các giá trị trong trường hợp này không?
sahana 18/03/19

nó hoạt động tốt Nhưng làm thế nào chúng ta có thể nhận được số tiền vận chuyển để cập nhật tóm tắt là tốt? có vẻ như chi phí vận chuyển trong bản tóm tắt đơn hàng chỉ được cập nhật khi nhấp thủ công vào phương thức giao hàng
Người học Magento

cảm ơn đã làm việc tốt
Tirth Patel

2

Những gì bạn có thể muốn làm là chọn phương thức vận chuyển rẻ nhất theo mặc định.

Trong mô-đun của bạn qua kiểm tra dữ liệu-giải quyết dữ liệu, tùy chọn bạn có thể sử dụng một mixin thay thế.

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

trong phương thức notifyShippingRates sửa đổi như dưới đây:

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

nó hoạt động tốt Nhưng làm thế nào chúng ta có thể nhận được số tiền vận chuyển để cập nhật tóm tắt là tốt? có vẻ như chi phí vận chuyển trong bản tóm tắt đơn hàng chỉ được cập nhật khi nhấp thủ công vào phương thức giao hàng
Người học Magento

@MagentoLearner bạn đã có giải pháp cho vấn đề này chưa?
dùng00247

@ user00247 chưa. Nếu bạn có một giải pháp xin vui lòng chia sẻ.
Học viên Magento

@MagentoLearner Tôi cũng đang tìm kiếm một giải pháp :(
user00247

2

Mặc dù các phương pháp trên đề xuất ghi đè các hàm js, tôi sẽ khuyên bạn nên sử dụng mixins để tránh xung đột mã không cần thiết:

Trong frontend Yêu cầu của bạn-config.js thêm vào như sau:

var config = {
    config: {
        mixins: {
            'Magento_Checkout/js/model/checkout-data-resolver': {
                '{Vendor}/{Module}/model/checkout-data-resolver': true
            }
        }
    }
};

Trong thanh toán của bạn-data-decver.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
        });
    };
});

Ngoài ra, bạn có thể tải xuống mô-đun tại đây cho phép bạn chọn phương thức thanh toán và vận chuyển mặc định: Phương thức thanh toán và vận chuyển mặc định [M2]


0

Bất cứ ai đang sử dụng onestepcheckout đều có thể thử điều này:

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

Tôi biết nó trông thật ngu ngốc, nhưng vì một số lý do, việc thêm vào đó sự chậm trễ thực sự có hiệu quả với tôi. Chi phí vận chuyển đang tự cập nhật như thế này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.