शिपिंग पते से पहले बिलिंग पते को कैसे पुनः व्यवस्थित करें (स्विच करें)


17

onepage चेकआउट पर मुझे शिपिंग पते से पहले बिलिंग पते को फिर से व्यवस्थित करना होगा। वास्तव में तर्क के चारों ओर दूसरा रास्ता होना चाहिए क्योंकि यह अब है। यदि शिपिंग पता बिलिंग पते से भिन्न होता है तो आपको इसे संपादित करने में सक्षम होना चाहिए। यदि आप शिपिंग पते से अलग हैं तो अब आप बिलिंग पते को संपादित कर सकते हैं। शिपिंग पते को भी शिपिंग पते के समान "पेज" पर दिखाई देना चाहिए। वर्तमान में Magento चेकआउट चरणों में चरण 1।

यह मैं कैसे करूंगा? शायद इसके लिए एक प्लगइन है, लेकिन मुझे अभी तक एक नहीं मिला।

मैंने एक जर्मन दुकान के स्क्रीनशॉट को इस तरह से संलग्न किया:

यहां छवि विवरण दर्ज करें

मुझे बिलिंग फॉर्म के लिए .html टेम्प्लेट फ़ाइल मिली और ऐसा लगता है कि यह वह जगह है जहाँ यह checkout_index_index.xml में समाप्त होती है:

<item name="billing-step" xsi:type="array">
    <item name="component" xsi:type="string">uiComponent</item>
    <item name="sortOrder" xsi:type="string">2</item>
    <item name="children" xsi:type="array">
        <item name="payment" xsi:type="array">
            <item name="component" xsi:type="string">Magento_Checkout/js/view/payment</item>
            <item name="config" xsi:type="array">
                <item name="title" xsi:type="string" translate="true">Payment</item>
            </item>
            <item name="children" xsi:type="array">
                <!-- ... -->
                <!-- merge your payment methods here -->
                <item name="afterMethods" xsi:type="array">
                    <item name="component" xsi:type="string">uiComponent</item>
                    <item name="displayArea" xsi:type="string">afterMethods</item>
                    <item name="children" xsi:type="array">
                        <!-- merge additional data after payment methods here -->

<!-- I think here the billing form ends up -->

                    </item>
                </item>
            </item>
        </item>
    </item>
</item>

लेकिन इसे विशेष रूप से यहां नहीं रखा गया है और मुझे दूसरी जगह नहीं मिल रही है, जहां पर उस स्थान पर इंजेक्शन लगाया गया हो।


2
बिलिंग पता फ़ॉर्म फ़ाइल में जोड़ा जाता है Magento/Checkout/Block/Checkout/LayoutProcessor.php
आरोन एलन

हाँ, यह बात है। वहां मैं कम से कम फिर से सक्रिय हो गया। फिर भी पता तर्क को स्विच करना होगा।
स्टेर

आप कस्टम चेकआउट का उपयोग कर रहे हैं?
अमित बेरा

Magento\Checkout\Block\Checkout\LayoutProcessorजैसा कि मैं सोच रहा हूँ, ओवरराइड और पोज़िशन बदलने की ज़रूरत है । यकीन नहीं होता
अंकित शाह

1
@AnkitShah यह काम नहीं करेगा क्योंकि मुझे बिलिंग पते को स्थानांतरित करने की आवश्यकता है न कि पूरे बिलिंग कदम की। इसके अलावा हारून ने बताया कि ऐसा करने के लिए पहला कदम एक मॉड्यूल है जो लेआउटप्रोसेसर को ओवरराइट करता है। मैंने पहले से ही सफलतापूर्वक किया है, लेकिन फिर भी बिलिंग पते को चुनने का तर्क शिपिंग पते के समान है। और इसके अतिरिक्त मुझे यकीन नहीं है कि पूरी प्रक्रिया काम करेगी। कम से कम मैं चेकआउट में जा सकता हूं लेकिन अभी तक साइड-इफेक्ट के बारे में निश्चित नहीं हूं।
स्टेरोस

जवाबों:


11

जैसा कि हारून ने कहा कि फॉर्म में जोड़ा गया है Magento/Checkout/Block/Checkout/LayoutProcessor.php। इस जानकारी के साथ, मैंने उस प्रोसेसर के हुक के बाद एक प्लगइन के साथ एक मॉड्यूल विकसित किया:

app/code/<vendor>/<module>/Model/Checkout/LayoutProcessorPlugin.php

<?php

namespace <vendor>\ReorderBillingForm\Model\Checkout;

class LayoutProcessorPlugin
{

    /**
     * @param \Magento\Checkout\Block\Checkout\LayoutProcessor $subject
     * @param array $jsLayout
     * @return array
     */

    public function afterProcess(
        \Magento\Checkout\Block\Checkout\LayoutProcessor $subject,
        array $jsLayout
    )
    {
        // get billing address form at billing step
        $billingAddressForm = $jsLayout['components']['checkout']['children']['steps']['children']['billing-step']['children']['payment']['children']['afterMethods']['children']['billing-address-form'];

        // move address form to shipping step
        $jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']['billing-address-form'] = $billingAddressForm;

        // remove form from billing step
        unset($jsLayout['components']['checkout']['children']['steps']['children']['billing-step']['children']['payment']['children']['afterMethods']['children']['billing-address-form']);

        return $jsLayout;
    }
}

app/code/<vendor>/<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="<vendor>_<module>" setup_version="1.0.0"/>
</config>

app/code/<vendor>/<module>/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Checkout\Block\Checkout\LayoutProcessor">
        <plugin name="reorder-billing-form"
                type="<vendor>\<module>\Model\Checkout\LayoutProcessorPlugin" sortOrder="<yourOrder>"/>
    </type>
</config>

app/code/<vendor>/<module>/registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    '<vendor>_<module>',
    __DIR__
);

यह सफलतापूर्वक बिलिंग पता फ़ॉर्म को पुन: व्यवस्थित करता है (और उम्मीद है कि अन्य लोगों के लिए कुछ सिरदर्द बचाता है)। लेकिन अभी भी जावास्क्रिप्ट (?) पर आवश्यक कार्य है जो billing address is the same as shipping addressतंत्र को संभालता है। जैसा कि यह अभी भी "मानक" तरीके से काम करता है।

अतिरिक्त जानकारी:

मैंने देखा कि बैकएंड में यदि आप एक नया ऑर्डर बनाते हैं तो लेआउट बिल्कुल वैसा ही है जैसा चाहता था। शिपिंग फॉर्म शिपिंग फॉर्म "पहले" है और लॉजिक दूसरा तरीका भी है। अगर मुझे लगता है कि मुझे लगता है कि यह समय वहां कोड को देखने के लिए फायदेमंद हो सकता है। हो सकता है कि फ्रंटेंड में भी इसका इस्तेमाल संभव हो।


क्या नामस्थान नामस्थान नहीं होना चाहिए <vendor>\ReorderBillingForm\Block\Checkout;?
फ्रैंक ग्रू

2
निश्चित नहीं। मैं कैशिंग समस्याओं में भाग गया (अभी तक फिर से) ऐसा लगता है। कभी-कभी यह काम नहीं करता था, कभी-कभी यह काम करता था। मैंने मॉड्यूल को फिर से लिखा और अब यह हर समय काम करता है। इसका उपयोग करना महत्वपूर्ण था aroundProcess। मैंने अपनी पोस्ट अपडेट की।
स्टेरोस

आपके उत्तर को अपडेट करने के लिए धन्यवाद, लेकिन मुझे निम्नलिखित त्रुटि मिलती हैNotice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
फ्रैंक ग्रॉट

हम्म अजीब, मुझे वह नहीं मिला। लेकिन आप जाँच सकते हैं कि $ jsLayout कैसे डिबगिंग द्वारा संरचित है। मेरे पास वर्तमान में कोई इंस्टेंस नहीं है। अगर मैं एक और सेटअप करता हूं तो मैं यह पता लगाने की कोशिश करूंगा कि क्या समस्या हो सकती है।
स्टेरोस

क्या आपने पहले ही जवाब अपडेट कर दिया था? आप अभी भी प्रक्रिया के बाद का उपयोग कर रहे हैं, प्रक्रिया @DarsVaeda के आसपास नहीं है हम आपके समाधान का उपयोग कर रहे हैं लेकिन भुगतान चरण पर बिल का पता अभी भी दिखाई दे रहा है
एलेक्स '

0

त्रुटि Undefined index: billing-address-formमें LayoutProcessorPlugin.phpहोता है आप चेकआउट संपत्ति है जब "प्रदर्शन बिलिंग पते के " से "सेट भुगतान की विधि " के बदले " भुगतान पृष्ठ "।

इसके साथ ठीक करें:

UPDATE core_config_data SET VALUE = 1 WHERE path = 'checkout/options/display_billing_address_on';

मैं इसे DarsVaedas पोस्ट के लिए एक टिप्पणी के रूप में जोड़ना पसंद करूंगा (ऊपर देखें), लेकिन मुझे अनुमति नहीं है ...


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