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.