magento 2에서 여러 배송 방법의 경우 기본 배송 방법을 설정하는 방법은 무엇입니까?


14

배송 방법에는 2 가지가 있으며 기본적으로 아무도 선택하지 않으므로 사용자는 배송 방법 (정의되지 않음)으로 하나를 직접 선택해야합니다. magento 2 에서이 작업을 수행 할 수있는 방법을 선택하지 않으면 첫 번째 항목이 자동으로 선택되도록하고 싶습니다.

답변:


22

귀하의 질문에서 알 수 있듯이 누군가가 결제 페이지에 올 때 항상 배송 방법을 선택하고 싶다는 것입니다.

이를 위해서는 Magento_Checkout 모듈에서 자바 스크립트를 재정의해야합니다.

먼저, 모듈을 만들어야합니다 :

네임 스페이스 / 모듈 /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>

그런 다음 j를 재정의하기 위해 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
  • 설정 업그레이드 실행 : PHP bin / magento setup : upgrade
  • 정적 배포 수행 : PHP bin / magento setup : static-content : deploy

어떤 운송 방법을 선택해야하는지 구성에 옵션을 제공하려면 어떤 유형의 변경을 수행해야합니까?
Indian

2
제대로 작동하지 않습니다. 양식을 채울 때 작동하지 않으며 다른 운송 방법을 선택하려고하면 선택할 수 없습니다. 기본 배송 방법이 자동으로 다시 선택됩니다.
Indian

1
나는 이것을 수정 selectShippingMethodAction(ratesData[0]);하고 이미 선택된 메소드를 찾은 후에 메소드에서 조금 더 낮추는 호출을 추가하여 메소드를 무시하지 않습니다.
thaddeusmt

잘 작동합니다. 그러나 onestepcheckout을 사용할 때 주문 요약에 대한 배송비도 어떻게 업데이트 할 수 있습니까? 배송 방법을 수동으로 클릭하면 주문 요약의 배송 비용이 먼저 업데이트되는 것 같습니다.
Magento Learner

이것은 훌륭하게 작동하지만 mixins 사용을 권장하고 몇 가지 답변을 사용하는 방법을 아래로 스크롤 한 다음이 답변의 줄을 사용하십시오.)
Sanne

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, 잘 작동합니다. 그러나 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 Patel

2

아마도 가장 저렴한 배송 방법은 기본적으로 선택하는 것입니다.

모듈 오버라이드 체크 아웃 데이터 리졸버에서 옵션으로 믹스 인을 대신 사용할 수 있습니다.

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는 아직 없습니다. 해결책이 있다면 공유하십시오.
젠토 학습자

@MagentoLearner 또한 해결책을 찾고 있습니다 :(
user00247

2

위의 방법으로 js 함수를 재정의하는 것이 좋지만 불필요한 코드 충돌을 피하기 위해 mixin을 사용하는 것이 좋습니다.

프론트 엔드 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.