magento 2で複数の配送方法がある場合、デフォルトの配送方法を設定するにはどうすればよいですか?


14

配送方法は2つあり、デフォルトでは誰も選択されていないため、ユーザーは手動で選択する必要があります。その結果、配送と表示されます(未定義-未定義)。何も選択されていない場合は、最初の項目が自動的に選択されるようにしたい

回答:


21

私はあなたの質問から理解したように、誰かがチェックアウトページに来たときに常に配送方法を選択してもらいたいということです。

これを実現するには、Magento_CheckoutモジュールのJavaScriptをオーバーライドする必要があります。

まず最初に、モジュールを作成する必要があります。

名前空間/モジュール/registration.php

<?php

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

名前空間/モジュール/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>

この後、そのjsをオーバーライドするrequirejsを作成する必要があります。

名前空間/モジュール/view/frontend/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 module:enable Namespace_Module
  • セットアップアップグレードを実行します。phpbin / magento setup:upgrade
  • 静的デプロイを実行します。phpbin / magento setup:static-content:deploy

配送方法を選択する必要がある構成のオプションを提供する場合、そのためにどのような種類の変更を行う必要がありますか?
インドの

2
これは正常に機能していません。フォームに入力しても機能せず、他の配送方法を選択しようとすると選択できません。デフォルトの配送方法が自動的に再度選択されます。
インドの

1
これを変更selectShippingMethodAction(ratesData[0]);し、すでに選択されているメソッドを探した後、メソッドの少し下に呼び出しを追加して、それらをオーバーライドしないようにしました。
thaddeusmt 2018年

うまくいきます。しかし、onestepcheckoutを使用する場合、注文概要の配送金額も更新するにはどうすればよいですか?配送方法を手動でクリックすると、最初に注文概要の配送料が更新されるようです
Magento Learner

これはうまく機能しますが、ミックスインを使用し、いくつかの回答をスクロールして使用方法を示し、この回答の行を使用することをお勧めします;)
サンネ

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

@ベンジャミン、それはうまく機能しています。しかし、onestepcheckoutを使用する場合、注文の合計もどのように更新できますか?注文方法の送料は、配送方法を手動でクリックしたときにのみ更新されるようです。
Magento Learner

1
これは受け入れられる答えになるはずです
Tailtiu

5

この変更を実現するためにモジュール全体が必要になることはありません。Checkoutモジュールを単純に拡張して、テーマでオーバーライドできます。

  1. JSファイルのチェックアウト・データ・resolver.jsをコピーして
    から
    vendor\magento\module-checkout\view\frontend\web\js\model

    アプリ\設計\フロントエンド\名前空間\ THEMENAME \ Magento_Checkout \ウェブ\ JS \モデル。

  2. 次のコードを含む行を見つけて、次のコードに
    if (ratesData.length == 1) {
    置き換えます。
    if (ratesData.length >= 1 && !selectedShippingRate) {


1
顧客がチェックアウトページに事前に入力されたデフォルトの配送先住所を持っている場合、または郵便番号がカートページに事前に入力されている場合、値は保持されません。この場合、値を保持する方法はありますか?
sahana

うまくいきます。しかし、どうすれば注文サマリーの配送金額も更新できますか?注文概要の送料は、配送方法を手動でクリックしたときにのみ更新されるようです
Magento Learner

細かい作業のおかげで
Tirthパテル

2

あなたがおそらくやりたいことは、デフォルトで最も安い配送方法を選択することです。

モジュールオーバーライドのcheckout-data-resolverでは、オプションで代わりにミックスインを使用できる場合があります。

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

resolveShippingRatesメソッドで、次のように変更します。

        /**
         * @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.