Come impostare il metodo di spedizione predefinito in caso di più metodi di spedizione in Magento 2?


14

Esistono 2 metodi di spedizione e per impostazione predefinita nessuno è selezionato, l'utente deve selezionarne uno manualmente, di conseguenza dice spedizione (undefined-undefined). Voglio che il primo articolo venga automaticamente selezionato se non viene selezionato nessuno di come ciò possa essere fatto in Magento 2

Risposte:


21

Come ho capito dalla tua domanda è che vuoi sempre avere un metodo di spedizione selezionato quando qualcuno entra nella pagina di checkout.

Per raggiungere questo obiettivo, dobbiamo sovrascrivere un javascript dal modulo Magento_Checkout.

Per prima cosa, dobbiamo creare un modulo:

Namespace / modulo / registration.php

<?php

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

Spazio dei nomi / modulo / 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>

Dopodiché, dobbiamo creare i requestjs per sovrascrivere quel js.

Namespace / modulo / immagine / frontend / requirejs-config.js

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

Ora dobbiamo copiare checkout-data-resolver.jsdal Magento_Checkout/view/frontend/web/js/modelnostro modulo con lo stesso percorsoNamespace_Module/view/frontend/web/js/model

Successivamente, è necessario modificare una condizione all'interno della funzione resolveShippingRates: function (ratesData)

A partire dal:

            ...

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

                return;
            }

            ...

Per:

           ...

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

                return;
            }

            ...

E questo è tutto, tutto ciò che devi fare ora è:

  • Attiva il modulo: php bin / magento module: abilita Namespace_Module
  • Esegui un aggiornamento dell'installazione: php bin / magento setup: upgrade
  • Esegui una distribuzione statica: php bin / magento setup: static-content: deploy

Se voglio fornire un'opzione nella configurazione per quale metodo di spedizione debba essere selezionato, quali tipi di modifiche devono essere apportate a tale scopo?
Indiano

2
Questo non funziona correttamente. Non funzionerà quando compileremo il modulo e quindi quando proveremo a selezionare un altro metodo di spedizione, non saremo in grado di selezionarlo. selezionerà di nuovo automaticamente il metodo di spedizione predefinito.
Indiano

1
Ho modificato questo e ho aggiunto la chiamata a selectShippingMethodAction(ratesData[0]);downn un po 'più in basso nel metodo, dopo aver cercato i metodi già selezionati, quindi non li sovrascrive.
Thaddeusmt,

funziona bene. Ma quando si utilizza onestepcheckout, come possiamo aggiornare anche l'importo della spedizione per il riepilogo dell'ordine? sembra che i costi di spedizione nel riepilogo dell'ordine vengano prima aggiornati quando si fa clic manualmente sul metodo di spedizione
Magento Learner

Funziona benissimo, ma consiglierei di usare i mixin, scorrere alcune risposte verso il basso su come usarle e quindi usare le righe di questa risposta;)
Sanne

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

  return;
}

Ciò renderà impossibile selezionare qualsiasi altra opzione di spedizione. Questo risolve il problema per me:

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

In quale file è questo?
Erfan,

@ Benjamin, funziona bene. Ma quando si utilizza onestepcheckout, come possiamo aggiornare anche il totale dell'ordine? sembra che il costo di spedizione nel totale dell'ordine sia aggiornato solo quando si fa clic manualmente sul metodo di spedizione.
Magento Learner,

1
Questa dovrebbe essere la risposta accettata
Tailtiu,

5

Non è necessario che l'intero modulo realizzi questo cambiamento. Puoi semplicemente estendere il modulo di pagamento e sovrascrivere il tuo tema.

  1. Copia il file js checkout-data-resolver.js
    da
    vendor\magento\module-checkout\view\frontend\web\js\model
    in
    app \ design \ frontend \ Namespace \ ThemeName \ Magento_Checkout \ web \ js \ model.

  2. Individua la riga con il seguente codice:
    if (ratesData.length == 1) {
    e sostituiscila con:
    if (ratesData.length >= 1 && !selectedShippingRate) {


1
Non mantiene i valori se il cliente ha un indirizzo di spedizione predefinito precompilato nella pagina di pagamento o il codice postale è prepopolato nella pagina del carrello. Esiste un modo per conservare i valori in questo caso?
Sahana,

funziona bene. Ma come possiamo aggiornare anche l'importo di spedizione per il riepilogo dell'ordine? sembra che il costo di spedizione nel riepilogo dell'ordine sia aggiornato solo quando si fa clic manualmente sul metodo di spedizione
Magento Learner

grazie funzionando bene
Tirth Patel,

2

Quello che probabilmente vuoi fare è selezionare il metodo di spedizione più economico per impostazione predefinita.

Nel modulo over ride checkout-data-resolver, facoltativamente potresti invece utilizzare un mixin.

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

nel metodo resolShippingRates modificare come di seguito:

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

funziona bene. Ma come possiamo aggiornare anche l'importo di spedizione per il riepilogo dell'ordine? sembra che il costo di spedizione nel riepilogo dell'ordine sia aggiornato solo quando si fa clic manualmente sul metodo di spedizione
Magento Learner

@MagentoLearner hai una soluzione a questo problema?
user00247

@ user00247 non ancora. se hai una soluzione per favore condividi.
Magento Learner,

@MagentoLearner Sto anche cercando una soluzione :(
user00247

2

Mentre i metodi sopra suggeriti suggeriscono di ignorare le funzioni js, consiglierei di usare i mixin per evitare inutili scontri di codice:

Nel tuo frontend requestjs-config.js aggiungi quanto segue:

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

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

In alternativa, è possibile scaricare qui il modulo che consente di selezionare un metodo di spedizione e pagamento predefinito : Metodo di spedizione e pagamento predefinito [M2]


0

Chiunque stia usando onestepcheckout può provare questo:

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

So che sembra stupido, ma per qualche motivo l'aggiunta di quel ritardo ha funzionato davvero per me. Le spese di spedizione si stanno aggiornando in questo modo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.