Bagaimana cara menetapkan metode pengiriman default jika ada beberapa metode pengiriman di magento 2?

14

Ada 2 metode Pengiriman dan secara default tidak ada yang dipilih, pengguna harus memilih secara manual, sebagai hasilnya dikatakan pengiriman (undefined-undefined). Saya ingin item pertama harus dipilih secara otomatis jika tidak ada yang dipilih bagaimana hal ini dapat dilakukan di magento 2

Arun Karnawat
sumber

Jawaban:

21

Seperti yang saya mengerti dari pertanyaan Anda adalah bahwa Anda ingin selalu memiliki metode pengiriman yang dipilih ketika seseorang datang pada halaman checkout.

Untuk mencapai ini, kita perlu mengganti javascript dari modul Magento_Checkout.

Hal pertama yang pertama, kita perlu membuat modul:

Namespace / Module / registration.php

<?php

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

Namespace / Module / 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>

Setelah ini, kita perlu membuat requirejs untuk menimpa js itu.

Namespace / Module / view / frontend / requireejs-config.js

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

Sekarang kita harus menyalin checkout-data-resolver.jsdari Magento_Checkout/view/frontend/web/js/modeldalam modul kita dengan jalur yang samaNamespace_Module/view/frontend/web/js/model

Setelah itu, kita perlu mengubah kondisi di dalam fungsi resolveShippingRates: function (ratesData)

Dari:

            ...

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

                return;
            }

            ...

Untuk:

           ...

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

                return;
            }

            ...

Dan hanya itu, yang harus Anda lakukan sekarang adalah:

  • Aktifkan modul: modul php bin / magento: aktifkan Namespace_Module
  • Jalankan upgrade pengaturan: php bin / magento setup: upgrade
  • Lakukan penyebaran statis: setup bin bin / magento: static-content: deploy
Catalin Ionita
sumber
Jika saya ingin memberikan opsi dalam konfigurasi untuk metode pengiriman mana yang harus dipilih maka jenis perubahan apa yang perlu dilakukan untuk itu?
India
2
Ini tidak berfungsi dengan baik. Ini tidak akan berfungsi ketika kami mengisi formulir dan kemudian ketika kami mencoba memilih metode pengiriman lain maka kami tidak dapat memilihnya. itu akan memilih metode pengiriman default lagi secara otomatis.
India
1
Saya memodifikasi ini dan menambahkan panggilan untuk selectShippingMethodAction(ratesData[0]);turun sedikit lebih rendah dalam metode ini, setelah mencari metode yang sudah dipilih, sehingga tidak menimpa mereka.
thaddeusmt
itu bekerja dengan baik. Tetapi ketika menggunakan onestepcheckout, bagaimana kita bisa mendapatkan jumlah pengiriman untuk memesan ringkasan yang diperbarui juga? tampaknya biaya pengiriman dalam ringkasan pesanan pertama kali diperbarui ketika secara manual mengklik metode pengiriman
Magento Learner
Ini berfungsi dengan baik, tetapi saya akan merekomendasikan menggunakan mixin, gulirkan beberapa jawaban ke bawah bagaimana cara menggunakannya dan kemudian gunakan baris dari jawaban ini;)
Sanne
8
if (ratesData.length >= 1) {
  //set shipping rate if we have only one available shipping rate
  selectShippingMethodAction(ratesData[0]);

  return;
}

Ini akan membuat tidak mungkin untuk memilih opsi pengiriman lainnya. Ini memecahkan masalah bagi saya:

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]);
    }
}
Benjamin
sumber
Di file mana ini?
Erfan
@ Benjamin, ini bekerja dengan baik. Tetapi ketika menggunakan onestepcheckout, bagaimana kami bisa mendapatkan total pesanan juga diperbarui? tampaknya biaya pengiriman dalam total pesanan hanya diperbarui ketika mengklik metode pengiriman secara manual.
Magento Learner
1
Ini seharusnya jawaban yang diterima
Tailtiu
5

Tidak perlu seluruh modul untuk mencapai perubahan ini. Anda dapat dengan mudah memperluas modul Checkout dan menimpa di dalam tema Anda.

  1. Salin file js checkout-data-resolver.js
    dari
    vendor\magento\module-checkout\view\frontend\web\js\model
    ke
    app \ design \ frontend \ Namespace \ ThemeName \ Magento_Checkout \ web \ js \ model.

  2. Temukan baris dengan kode berikut:
    if (ratesData.length == 1) {
    dan ganti dengan:
    if (ratesData.length >= 1 && !selectedShippingRate) {

Konstantin C
sumber
1
Itu tidak mempertahankan nilai-nilai jika pelanggan memiliki alamat pengiriman default yang sudah diisi sebelumnya di halaman checkout atau kode pos sudah terisi sebelumnya di halaman keranjang. Apakah ada cara untuk mempertahankan nilai-nilai dalam kasus ini?
sahana
itu bekerja dengan baik. Tetapi bagaimana kita bisa mendapatkan jumlah pengiriman untuk memesan ringkasan juga diperbarui? tampaknya biaya pengiriman dalam ringkasan pesanan hanya diperbarui ketika secara manual mengklik metode pengiriman
Magento Learner
terima kasih bekerja dengan baik
Tirth Patel
2

Yang mungkin ingin Anda lakukan adalah memilih metode pengiriman termurah secara default.

Dalam modul Anda sambil naik checkout-data-resolver, secara opsional Anda mungkin bisa menggunakan mixin sebagai gantinya.

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

dalam metode resolShippingRates ubah seperti di bawah ini:

        /**
         * @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]);
            }
Joel Davey
sumber
itu bekerja dengan baik. Tetapi bagaimana kita bisa mendapatkan jumlah pengiriman untuk memesan ringkasan juga diperbarui? tampaknya biaya pengiriman dalam ringkasan pesanan hanya diperbarui ketika mengklik secara manual pada metode pengiriman
Magento Learner
@ MagentoLearner apakah Anda punya solusi untuk masalah ini?
user00247
@ user00247 belum. jika Anda punya solusi, silakan berbagi.
Magento Learner
@ MagentoLearner Saya juga mencari solusi :(
user00247
2

Sementara metode di atas menyarankan mengesampingkan fungsi js, saya akan merekomendasikan menggunakan mixins untuk menghindari bentrokan kode yang tidak perlu:

Di frontend Anda, needejs-config.js tambahkan yang berikut:

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

Di checkout-data-resolver.js Anda

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

Atau, Anda dapat mengunduh modul di sini yang memungkinkan Anda memilih metode pengiriman dan pembayaran default : Metode Pengiriman & Pembayaran Default [M2]

Hungersoft
sumber
0

Siapa pun yang menggunakan onestepcheckout dapat mencoba ini:

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

Saya tahu itu terlihat bodoh, tetapi karena alasan tertentu menambahkan bahwa penundaan benar-benar berhasil untuk saya. Biaya pengiriman memperbarui sendiri seperti ini.

Mirko Zovko
sumber