Como definir o método de envio padrão no caso de vários métodos de envio no magento 2?

14

Existem 2 métodos de envio e, por padrão, ninguém é selecionado, o usuário precisa selecionar um manualmente, como resultado, envio (indefinido-indefinido). Eu quero que o primeiro item seja selecionado automaticamente se não estiver selecionado como isso pode ser feito no magento 2

Arun Karnawat
fonte

Respostas:

21

Como entendi da sua pergunta, você deseja sempre ter um método de envio selecionado quando alguém entrar na página de checkout.

Para conseguir isso, precisamos substituir um javascript do módulo Magento_Checkout.

Primeiramente, precisamos criar um módulo:

Namespace / Module / registration.php

<?php

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

Namespace / 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>

Depois disso, precisamos criar os requirejs para substituir esses js.

Namespace / Module / view / frontend / requirejs-config.js

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

Agora temos que copiar checkout-data-resolver.jsa partir Magento_Checkout/view/frontend/web/js/modeldo nosso módulo com o mesmo caminhoNamespace_Module/view/frontend/web/js/model

Depois disso, precisamos alterar uma condição dentro da função resolveShippingRates: function (ratesData)

De:

            ...

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

                return;
            }

            ...

Para:

           ...

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

                return;
            }

            ...

E é isso, tudo o que você precisa fazer agora é:

  • Ative o módulo: php bin / magento module: enable Namespace_Module
  • Execute uma atualização de instalação: php bin / magento setup: upgrade
  • Faça uma implementação estática: php bin / magento setup: static-content: deploy
Catalin Ionita
fonte
Se eu quiser fornecer uma opção na configuração para qual método de envio deve ser selecionado, que tipos de alterações precisam ser feitos para isso?
Indiana
2
Isso não está funcionando corretamente. Ele não funcionará quando preenchermos o formulário e, quando tentarmos selecionar outro método de envio, não poderemos selecioná-lo. ele selecionará o método de envio padrão novamente automaticamente.
Indiana
11
selectShippingMethodAction(ratesData[0]);Modifiquei isso e adicionei a chamada ao downn um pouco mais baixo no método, depois de procurar os métodos já selecionados, para que não os substitua.
Thaddeusmt
está funcionando bem. Mas, ao usar uma verificação geral, como também podemos atualizar o valor do frete para o resumo do pedido? parece que o custo de remessa no resumo do pedido é atualizado primeiro ao clicar manualmente no método de remessa
Magento Learner
Isso funciona muito bem, mas eu recomendaria o uso de mixins, role algumas respostas para baixo como usá-las e use as linhas desta resposta;)
Sanne
8
if (ratesData.length >= 1) {
  //set shipping rate if we have only one available shipping rate
  selectShippingMethodAction(ratesData[0]);

  return;
}

Isso tornará impossível selecionar qualquer outra opção de envio. Isso resolve o problema para mim:

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
fonte
Em qual arquivo é esse?
Erfan
@ Benjamin, está funcionando bem. Mas, ao usar uma verificação final, como também podemos atualizar o total do pedido? parece que o custo de remessa no total do pedido é atualizado apenas ao clicar manualmente no método de remessa.
Magento Learner
11
Esta deve ser a resposta aceita
Tailtiu
5

Não há necessidade de todo o módulo alcançar essa alteração. Você pode estender o módulo do Google Checkout e substituir seu tema.

  1. Copie o arquivo js checkout-data-resolver.js
    de
    vendor\magento\module-checkout\view\frontend\web\js\model
    para
    app \ design \ frontend \ Namespace \ ThemeName \ Magento_Checkout \ web \ js \ model.

  2. Localize a linha com o seguinte código:
    if (ratesData.length == 1) {
    e substitua-o por:
    if (ratesData.length >= 1 && !selectedShippingRate) {

Constantin C
fonte
11
Ele não retém os valores se o cliente tiver o endereço de entrega padrão pré-preenchido na página de check-out ou o código postal for pré-preenchido na página do carrinho. Existe alguma maneira de manter os valores nesse caso?
sahana
está funcionando bem. Mas como também podemos atualizar o valor do frete para o resumo do pedido? parece que o custo de remessa no resumo do pedido é atualizado apenas ao clicar manualmente no método de remessa
Magento Learner
obrigado trabalhando bem
Tirth Patel 20/02
2

O que você provavelmente deseja fazer é selecionar o método de envio mais barato por padrão.

No seu módulo durante a execução do checkout-resolvedor de dados, opcionalmente, você poderá usar um mixin.

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

no método resolveShippingRates, modifique conforme abaixo:

        /**
         * @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
fonte
está funcionando bem. Mas como também podemos atualizar o valor do frete para o resumo do pedido? parece que o custo de transporte no resumo do pedido só é atualizado quando clicar manualmente no método de envio
Magento Learner
@ MagentoLearner você tem solução para este problema?
user00247
@ user00247 ainda não. Se você tiver uma solução, por favor, compartilhe.
Magento Learner
@MagentoLearner Também estou procurando uma solução :( #
user00247
2

Enquanto os métodos acima sugerem substituir as funções js, eu recomendaria o uso de mixins para evitar conflitos de código desnecessários:

No seu frontend requirejs-config.js, adicione o seguinte:

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

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

Como alternativa, você pode fazer o download do módulo aqui, que permite selecionar um método de envio e pagamento padrão : Método de envio e pagamento padrão [M2]

hungersoft
fonte
0

Qualquer pessoa que esteja usando o onestepcheckout pode tentar o seguinte:

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

Eu sei que está parecendo estúpido, mas por algum motivo, adicionar esse atraso realmente funcionou para mim. Os custos de envio estão se atualizando assim.

Mirko Zovko
fonte