配送方法は2つあり、デフォルトでは誰も選択されていないため、ユーザーは手動で選択する必要があります。その結果、配送と表示されます(未定義-未定義)。何も選択されていない場合は、最初の項目が自動的に選択されるようにしたい
配送方法は2つあり、デフォルトでは誰も選択されていないため、ユーザーは手動で選択する必要があります。その結果、配送と表示されます(未定義-未定義)。何も選択されていない場合は、最初の項目が自動的に選択されるようにしたい
回答:
私はあなたの質問から理解したように、誰かがチェックアウトページに来たときに常に配送方法を選択してもらいたいということです。
これを実現するには、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;
}
...
そして、それだけです。あなたが今しなければならないのは、
selectShippingMethodAction(ratesData[0]);
し、すでに選択されているメソッドを探した後、メソッドの少し下に呼び出しを追加して、それらをオーバーライドしないようにしました。
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]);
}
}
この変更を実現するためにモジュール全体が必要になることはありません。Checkoutモジュールを単純に拡張して、テーマでオーバーライドできます。
JSファイルのチェックアウト・データ・resolver.jsをコピーして
から
vendor\magento\module-checkout\view\frontend\web\js\model
の
アプリ\設計\フロントエンド\名前空間\ THEMENAME \ Magento_Checkout \ウェブ\ JS \モデル。
次のコードを含む行を見つけて、次のコードに
if (ratesData.length == 1) {
置き換えます。
if (ratesData.length >= 1 && !selectedShippingRate) {
あなたがおそらくやりたいことは、デフォルトで最も安い配送方法を選択することです。
モジュールオーバーライドの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]);
}
上記の方法は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]