Magento 2 में कई शिपिंग विधियों के मामले में डिफ़ॉल्ट शिपिंग विधि कैसे सेट करें?


14

2 शिपिंग विधियां हैं और डिफ़ॉल्ट रूप से कोई भी चयनित नहीं है, उपयोगकर्ता को मैन्युअल रूप से एक का चयन करना होगा, परिणामस्वरूप यह शिपिंग (अपरिभाषित-अपरिभाषित) कहता है। मैं चाहता हूं कि पहले आइटम को स्वचालित रूप से चुना जाना चाहिए अगर कोई नहीं चुना जाता है कि यह कैसे Magento 2 में किया जा सकता है

जवाबों:


22

जैसा कि मैंने आपके प्रश्न से समझा है कि जब आप किसी चेकआउट पृष्ठ पर आते हैं तो आप हमेशा एक शिपिंग विधि का चयन करना चाहते हैं।

इसे प्राप्त करने के लिए, हमें Magento_Checkout मॉड्यूल से एक जावास्क्रिप्ट ओवरराइड करने की आवश्यकता है।

पहली चीजें पहले, हमें एक मॉड्यूल बनाने की आवश्यकता है:

नाम स्थान / मॉड्यूल / registration.php

<?php

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

नाम स्थान / मॉड्यूल / 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>

इसके बाद, हमें उस js को ओवरराइड करने के लिए आवश्यकताएं बनाने की आवश्यकता है।

नाम स्थान / मॉड्यूल / देखें / दृश्यपटल / requirejs-config.js

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

अब हमें अपने मॉड्यूल से उसी पथ checkout-data-resolver.jsसे कॉपी Magento_Checkout/view/frontend/web/js/modelकरना होगाNamespace_Module/view/frontend/web/js/model

उसके बाद, हमें फ़ंक्शन के अंदर एक स्थिति बदलने की आवश्यकता है resolveShippingRates: function (ratesData)

से:

            ...

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

            ...

और यह है, अब आपको बस इतना करना है:

  • मॉड्यूल सक्रिय करें: php bin / magento मॉड्यूल: Namespace_Module सक्षम करें
  • सेटअप अपग्रेड रन करें: php bin / magento सेटअप: अपग्रेड करें
  • एक स्थिर तैनाती करें: php bin / magento सेटअप: स्थिर-सामग्री: परिनियोजित

यदि मैं कॉन्फ़िगरेशन में विकल्प प्रदान करना चाहता हूं, जिसके लिए शिपिंग विधि का चयन किया जाना चाहिए, तो उसके लिए किस प्रकार के परिवर्तनों की आवश्यकता है?
भारतीय

2
यह ठीक से काम नहीं कर रहा है। जब हम फॉर्म भरते हैं तो यह काम नहीं करेगा और फिर जब हम अन्य शिपिंग विधि का चयन करने की कोशिश करेंगे तो हम इसका चयन नहीं कर पाएंगे। यह स्वचालित रूप से फिर से डिफ़ॉल्ट शिपिंग विधि का चयन करेगा।
भारतीय

1
मैंने इसे संशोधित किया और कॉल को selectShippingMethodAction(ratesData[0]);विधि में थोड़ा कम करने के लिए जोड़ा , क्योंकि यह पहले से ही चयनित विधियों की तलाश में है, इसलिए यह उन्हें ओवरराइड नहीं करता है।
thaddeusmt

यह अच्छा काम कर रहा है। लेकिन जब onestepcheckout का उपयोग किया जाता है, तो हम सारांश अपडेट करने के लिए शिपिंग राशि कैसे प्राप्त कर सकते हैं? ऐसा लगता है कि ऑर्डर सारांश में शिपिंग लागत पहले अपडेट हो जाती है जब मैन्युअल रूप से शिपिंग विधि पर क्लिक करना होता है
Magento Learner

यह बहुत अच्छा काम करता है, लेकिन मैं मिक्सिन्स का उपयोग करने की सलाह दूंगा, कुछ उत्तरों को नीचे स्क्रॉल करें कि कैसे उन का उपयोग करें और फिर इस उत्तर से लाइनों का उपयोग करें;)
11:11

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

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

यह किस फाइल में है?
इरफान

@ बैंजामिन, यह अच्छा काम कर रहा है। लेकिन जब onestepcheckout का उपयोग करते हैं, तो हम ऑर्डर को कुल अपडेट कैसे कर सकते हैं? ऐसा लगता है कि कुल ऑर्डर में शिपिंग लागत केवल तभी अपडेट की जाती है जब मैन्युअल रूप से शिपिंग विधि पर क्लिक किया जाता है।
मैग्नेटो लर्नर

1
इसका स्वीकृत उत्तर होना चाहिए
तैत्तिलू

5

इस परिवर्तन को प्राप्त करने के लिए पूरे मॉड्यूल की आवश्यकता नहीं है। आप अपनी थीम में चेकआउट मॉड्यूल को सरल और ओवरराइड कर सकते हैं।

  1. Js फ़ाइल चेकआउट-डेटा-resolver.js कॉपी
    से
    vendor\magento\module-checkout\view\frontend\web\js\model
    करने के लिए
    एप्लिकेशन \ डिजाइन \ दृश्यपटल \ नामस्थान \ THEMENAME \ Magento_Checkout \ वेब \ js \ मॉडल।

  2. निम्नलिखित कोड के साथ लाइन का पता लगाएँ:
    if (ratesData.length == 1) {
    और इसे इसके साथ बदलें:
    if (ratesData.length >= 1 && !selectedShippingRate) {


1
यदि ग्राहक के पास चेकआउट पृष्ठ में पूर्व-आबादी वाला डिफ़ॉल्ट शिपिंग पता है या ज़िप कोड को कार्ट पेज में प्री-पॉप्युलेट किया गया है तो यह उन मूल्यों को बरकरार नहीं रखता है। इस मामले में मूल्यों को बनाए रखने का कोई तरीका है?
सहाना १

यह अच्छा काम कर रहा है। लेकिन हम सारांश अपडेट करने के लिए शिपिंग राशि कैसे प्राप्त कर सकते हैं? ऐसा लगता है कि ऑर्डर सारांश में शिपिंग लागत केवल तब अपडेट की जाती है जब मैन्युअल रूप से शिपिंग विधि पर क्लिक किया जाता है
Magento Learner

धन्यवाद काम ठीक
तीर्थ पटेल

2

जो आप शायद करना चाहते हैं वह डिफ़ॉल्ट रूप से सबसे सस्ती शिपिंग विधि का चयन करना है।

राइड चेकआउट-डेटा-रिज़ॉल्वर पर अपने मॉड्यूल में, वैकल्पिक रूप से आप इसके बजाय मिक्सिन का उपयोग करने में सक्षम हो सकते हैं।

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

नीचे के रूप में संशोधितShippingRates विधि में:

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

यह अच्छा काम कर रहा है। लेकिन हम सारांश अपडेट करने के लिए शिपिंग राशि कैसे प्राप्त कर सकते हैं? ऐसा लगता है कि ऑर्डर सारांश में शिपिंग लागत केवल तभी अपडेट की जाती है जब मैन्युअल रूप से शिपिंग विधि पर क्लिक किया जाता है
Magento Learner

@MagentoLearner आप इस समस्या का हल मिल गया है?
user00247

@ user00247 अभी तक नहीं। यदि आपके पास कोई समाधान है तो कृपया साझा करें
मैजेंटो लर्नर

@MagentoLearner मैं भी एक समाधान के लिए खोज रहा हूँ :(
user00247

2

जबकि उपरोक्त विधियां js फ़ंक्शन को ओवरराइड करने का सुझाव देती हैं, मैं अनावश्यक कोड क्लैश से बचने के लिए मिक्सिन्स का उपयोग करने की सलाह दूंगा:

अपने दृश्यपटल मेंjjs-config.js को निम्नलिखित जोड़ें:

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

आपके चेकआउट-डेटा-रिसॉल्वर में

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

वैकल्पिक रूप से, आप यहां मॉड्यूल डाउनलोड कर सकते हैं जो आपको एक डिफ़ॉल्ट शिपिंग और भुगतान विधि का चयन करने की अनुमति देता है: डिफ़ॉल्ट शिपिंग और भुगतान विधि [एम 2]


0

जो कोई भी onestepcheckout का उपयोग कर रहा है, वह यह कोशिश कर सकता है:

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

मुझे पता है कि यह मूर्खतापूर्ण लग रहा है, लेकिन किसी कारण से उस देरी ने वास्तव में मेरे लिए काम किया। शिपिंग लागत इस तरह से खुद को अपडेट कर रही है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.