Comment définir la méthode d'expédition par défaut en cas de plusieurs méthodes d'expédition dans Magento 2?

14

Il y a 2 méthodes d'expédition et par défaut, personne n'est sélectionné, l'utilisateur doit en sélectionner une manuellement, par conséquent, il dit expédition (non défini-non défini). Je veux que le premier élément soit automatiquement sélectionné si aucun n'est sélectionné comment cela peut être fait dans magento 2

Arun Karnawat
la source

Réponses:

21

Si j'ai bien compris votre question, vous voulez toujours avoir une méthode d'expédition sélectionnée lorsque quelqu'un vient sur la page de paiement.

Pour ce faire, nous devons remplacer un javascript du module Magento_Checkout.

Tout d'abord, nous devons créer un module:

Espace de noms / Module / registration.php

<?php

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

Espace de noms / Module / 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>

Après cela, nous devons créer les requirejs pour remplacer ce js.

Espace de noms / Module / view / frontend / requirejs-config.js

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

Maintenant , nous devons copier checkout-data-resolver.jsde Magento_Checkout/view/frontend/web/js/modelnotre module avec le même cheminNamespace_Module/view/frontend/web/js/model

Après cela, nous devons changer une condition à l'intérieur de la fonction resolveShippingRates: function (ratesData)

De:

            ...

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

            ...

Et c'est tout, il ne vous reste plus qu'à:

  • Activer le module: module php bin / magento: activer Namespace_Module
  • Exécutez une mise à niveau de configuration: configuration de php bin / magento: mise à niveau
  • Faites un déploiement statique: configuration de php bin / magento: contenu statique: déploiement
Catalin Ionita
la source
Si je veux fournir une option de configuration pour quelle méthode d'expédition doit être sélectionnée, alors quels types de changements devez-vous faire pour cela?
Indian
2
Cela ne fonctionne pas correctement. Cela ne fonctionnera pas lorsque nous remplissons le formulaire, puis lorsque nous essayons de sélectionner une autre méthode d'expédition, nous ne pouvons pas le sélectionner. il sélectionnera automatiquement la méthode d'expédition par défaut.
Indian
1
J'ai modifié cela et ajouté l'appel à selectShippingMethodAction(ratesData[0]);downn un peu plus bas dans la méthode, après avoir recherché les méthodes déjà sélectionnées, donc il ne les remplace pas.
thaddeusmt le
ça marche bien. Mais lorsque vous utilisez onestepcheckout, comment pouvons-nous également mettre à jour le montant de l'expédition pour le résumé de la commande? il semble que les frais de port dans le résumé de la commande soient d'abord mis à jour en cliquant manuellement sur le mode de livraison
Magento Learner
Cela fonctionne très bien, mais je recommanderais d'utiliser des mixins, faites défiler quelques réponses vers le bas pour les utiliser, puis utilisez les lignes de cette réponse;)
Sanne
8
if (ratesData.length >= 1) {
  //set shipping rate if we have only one available shipping rate
  selectShippingMethodAction(ratesData[0]);

  return;
}

Cela rendra impossible la sélection d'une autre option d'expédition. Cela résout le problème pour moi:

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]);
    }
}
Benjamin
la source
Dans quel dossier est-ce?
Erfan
@Benjamin, ça marche bien. Mais lorsque vous utilisez onestepcheckout, comment pouvons-nous également mettre à jour le total de la commande? il semble que les frais de port dans le total de la commande ne soient mis à jour qu'en cliquant manuellement sur le mode d'expédition.
Magento Learner
1
Cela devrait être la réponse acceptée
Tailtiu
5

Il n'y a pas besoin de module entier pour réaliser ce changement. Vous pouvez simplement étendre le module Checkout et le remplacer dans votre thème.

  1. Copiez le fichier js données de caisse-resolver.js-
    de
    vendor\magento\module-checkout\view\frontend\web\js\model
    à
    l' application \ conception \ frontend \ Namespace \ ThemeName \ Magento_Checkout \ web \ modèle \ js.

  2. Localisez la ligne avec le code suivant:
    if (ratesData.length == 1) {
    et remplacez-la par:
    if (ratesData.length >= 1 && !selectedShippingRate) {

Constantin C
la source
1
Il ne conserve pas les valeurs si le client a une adresse de livraison par défaut préremplie dans la page de paiement ou si le code postal est prérempli dans la page du panier. Existe-t-il un moyen de conserver les valeurs dans ce cas?
sahana
ça marche bien. Mais comment pouvons-nous également mettre à jour le montant de l'expédition du résumé de la commande? il semble que les frais de port dans le résumé de la commande ne soient mis à jour qu'en cliquant manuellement sur le mode de livraison
Magento Learner
merci de bien travailler
Tirth Patel
2

Ce que vous voulez probablement faire, c'est sélectionner la méthode d'expédition la moins chère par défaut.

Dans votre module over ride checkout-data-resolver, vous pouvez éventuellement utiliser un mixin à la place.

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

dans la méthode resolShippingRates, modifiez comme suit:

        /**
         * @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]);
            }
Joel Davey
la source
ça marche bien. Mais comment pouvons-nous également mettre à jour le montant de l'expédition du résumé de la commande? il semble que les frais de port dans le résumé de la commande ne soient mis à jour qu'en cliquant manuellement sur le mode de livraison
Magento Learner
@MagentoLearner avez-vous une solution à ce problème?
user00247
@ user00247 pas encore. si vous avez une solution, partagez-la.
Magento Learner
@MagentoLearner Je recherche également une solution :(
user00247
2

Bien que les méthodes ci-dessus suggèrent de remplacer les fonctions js, je recommanderais d'utiliser des mixins pour éviter les conflits de code inutiles:

Dans votre frontend requirejs-config.js ajoutez les éléments suivants:

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

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

Alternativement, vous pouvez télécharger le module ici qui vous permet de sélectionner une méthode d'expédition et de paiement par défaut : Méthode d'expédition et de paiement par défaut [M2]

Hungersoft
la source
0

Quiconque utilise onestepcheckout peut essayer ceci:

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

Je sais que ça a l'air stupide, mais pour une raison quelconque, l'ajout de ce délai a vraiment fonctionné pour moi. Le coût d'expédition se met à jour comme ceci.

Mirko Zovko
la source