Magento 2'de birden fazla gönderim yöntemi olması durumunda varsayılan gönderim yöntemini nasıl ayarlayabilirim?


14

2 Nakliye yöntemi vardır ve varsayılan olarak hiç kimse seçilmez, kullanıcının manuel olarak seçmesi gerekir, bunun sonucunda nakliye (tanımsız-tanımsız) der. Magento 2'de nasıl yapılacağını hiçbiri seçilmezse İlk öğenin otomatik olarak seçilmesini istiyorum

Yanıtlar:


22

Sorunuzdan anlaşıldığı gibi, birisi ödeme sayfasına geldiğinde her zaman bir gönderim yönteminin seçilmesini istediğinizdir.

Bunu başarmak için Magento_Checkout modülünden bir javascript'i geçersiz kılmamız gerekir.

İlk önce bir modül yaratmamız gerekiyor:

Ad alanı / Modül / registration.php

<?php

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

Ad alanı / Modül / 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>

Bundan sonra, js'yi geçersiz kılmak için requirjs oluşturmamız gerekir.

Ad / modülü / görünüşüdür / ön / requirejs-config.js

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

Şimdi kopyalamak zorunda checkout-data-resolver.jsden Magento_Checkout/view/frontend/web/js/modelaynı yol ile modülündeNamespace_Module/view/frontend/web/js/model

Bundan sonra, fonksiyonun içindeki bir koşulu değiştirmemiz gerekiyor resolveShippingRates: function (ratesData)

Gönderen:

            ...

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

                return;
            }

            ...

Kime:

           ...

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

                return;
            }

            ...

Ve bu, şimdi tek yapmanız gereken:

  • Modülü etkinleştirin: php bin / magento module: enable Namespace_Module
  • Kurulum yükseltmesini çalıştırın: php bin / magento kurulum: yükseltme
  • Statik bir dağıtım yapın: php bin / magento kurulumu: statik-içerik: dağıtma

Hangi gönderim yönteminin seçilmesi gerektiği konusunda yapılandırmada seçenek sağlamak istersem, bunun için ne tür değişiklikler yapılması gerekir?
Hint

2
Bu düzgün çalışmıyor. Formu doldurduğumuzda çalışmaz ve daha sonra başka bir nakliye yöntemi seçmeye çalıştığımızda çalışmaz. varsayılan gönderim yöntemini otomatik olarak tekrar seçecektir.
Hindistan

1
Bunu değiştirdim ve selectShippingMethodAction(ratesData[0]);zaten seçili yöntemleri aradıktan sonra yöntemde biraz daha düşük bir çağrıyı ekledim , bu yüzden onları geçersiz kılmıyor.
thaddeusmt

iyi çalışıyor. Ancak onestepcheckout kullanırken, sipariş özetinin güncellenmesi için gönderim bedelini nasıl alabiliriz? sipariş özetindeki gönderim bedeli, gönderim yöntemine manuel olarak tıklandığında güncellenir
Magento Learner

Bu harika çalışıyor, ama ben mixins kullanmanızı tavsiye ederim, nasıl kullanılacağını birkaç cevap aşağı kaydırın ve sonra bu cevap satırları kullanın;)
Sanne

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

  return;
}

Bu, başka bir nakliye seçeneği seçmeyi imkansız hale getirecektir. Bu benim için sorunu çözüyor:

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

Bu hangi dosyada?
Erfan

@ Benjamin, iyi çalışıyor. Ancak onestepcheckout kullanırken, sipariş toplamını nasıl güncelleyebiliriz? sipariş toplamındaki gönderim bedeli yalnızca gönderim yöntemine manuel olarak tıklandığında güncellenir.
Magento Öğrenci

1
Bu kabul edilen cevap olmalı
Tailtiu

5

Bu değişikliğe ulaşmak için modülün tamamına gerek yoktur. Checkout modülünü basitçe genişletebilir ve temanızda geçersiz kılabilirsiniz.

  1. Js dosyasını çıkış-data-resolver.js Kopya
    gelen
    vendor\magento\module-checkout\view\frontend\web\js\model
    için
    uygulama \ tasarım \ önyüzü \ Namespace \ THEMENAME \ Magento_Checkout \ web \ js \ modeli.

  2. Satırı aşağıdaki kodla bulun
    if (ratesData.length == 1) {
    :
    if (ratesData.length >= 1 && !selectedShippingRate) {


1
Müşterinin ödeme sayfasında önceden doldurulmuş varsayılan posta adresi varsa veya posta kodu alışveriş sepeti sayfasında önceden doldurulmuşsa değerleri korumaz. Bu durumda değerleri korumanın herhangi bir yolu var mı?
sahana

iyi çalışıyor. Ancak, sipariş özetinin güncellenmesi için gönderim bedelini nasıl alabiliriz? sipariş özetindeki gönderim bedeli yalnızca gönderim yöntemine manuel olarak tıklandığında güncellenir
Magento Learner

teşekkürler iyi çalışıyor
Tirth Patel

2

Muhtemelen yapmak istediğiniz şey, varsayılan olarak en ucuz nakliye yöntemini seçmektir.

Modülünüzde sürüş çıkış veri çözümleyicisinde, isteğe bağlı olarak bunun yerine bir mixin kullanabilirsiniz.

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

resolShippingRates yönteminde aşağıdaki gibi değişiklik yapın:

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

iyi çalışıyor. Ancak, sipariş özetinin güncellenmesi için gönderim bedelini nasıl alabiliriz? sipariş özetindeki gönderim bedeli yalnızca gönderim yöntemine manuel olarak tıklandığında güncellenir
Magento Learner

@MagentoLearner bu soruna çözümünüz var mı?
user00247

@ user00247 henüz değil. Eğer bir çözümünüz varsa lütfen paylaşın.
Magento Öğrenci

@MagentoLearner Ayrıca bir çözüm
arıyorum

2

Yukarıdaki yöntemler js işlevlerini geçersiz kılmayı önerirken, gereksiz kod çakışmalarını önlemek için mixins kullanmanızı öneririm:

Kullanıcı arabiriminde gerektirenjs-config.js aşağıdakileri ekleyin:

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

Checkout-data-resolver.js dosyasında

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

Alternatif olarak, varsayılan bir gönderim ve ödeme yöntemi seçmenize olanak tanıyan modülü buradan indirebilirsiniz: Varsayılan Nakliye ve Ödeme Yöntemi [M2]


0

Onestepcheckout kullanan herkes şunu deneyebilir:

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

Aptalca göründüğünü biliyorum, ama nedense bu gecikmeyi eklemek benim için gerçekten işe yaradı. Nakliye maliyeti bu şekilde kendini güncelliyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.