cara mengatur ulang (mengganti) alamat penagihan sebelum alamat pengiriman

17

pada checkout di tempat saya harus memesan ulang alamat penagihan sebelum alamat pengiriman. sebenarnya logika harus sebaliknya dari sekarang. jika alamat pengiriman berbeda dari alamat penagihan, Anda harus dapat mengeditnya. sekarang Anda dapat mengedit alamat penagihan jika berbeda dari alamat pengiriman. juga alamat penagihan akan muncul pada "halaman" yang sama dengan alamat pengiriman. Saat ini langkah 1 dalam langkah checkout Magento.

bagaimana saya melakukan ini? mungkin ada plugin untuk ini tetapi saya belum bisa menemukannya.

Saya melampirkan tangkapan layar toko Jerman yang melakukannya seperti ini:

masukkan deskripsi gambar di sini

Saya menemukan file template .html untuk formulir penagihan dan sepertinya ini adalah tempat di mana ia berakhir di 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>

Tapi itu tidak secara khusus ditempatkan di sini dan aku tidak bisa menemukan tempat lain di mana ia disuntikkan ke tempat itu.

steros
sumber
2
Formulir alamat penagihan ditambahkan dalam file Magento/Checkout/Block/Checkout/LayoutProcessor.php.
Aaron Allen
Ya itu saja. Di sana saya berhasil memesan ulang setidaknya. Masih harus mengganti logika alamat.
steros
Anda telah menggunakan checkout khusus?
Amit Bera
Perlu mengganti Magento\Checkout\Block\Checkout\LayoutProcessor& mengubah posisi seperti yang saya pikirkan. Tidak yakin
Ankit Shah
1
@AnkitShah Itu tidak akan berfungsi karena saya hanya perlu memindahkan alamat penagihan bukan seluruh langkah penagihan. Juga ketika Aaron menunjukkan langkah pertama untuk melakukannya adalah menulis modul yang menimpa LayoutProcessor. Saya sudah berhasil melakukannya tetapi tetap saja logika memilih alamat penagihan sama dengan alamat pengiriman tidak benar. Dan juga saya tidak yakin apakah seluruh proses akan berhasil. Setidaknya saya bisa pergi di kasir tetapi saya tidak yakin tentang efek samping sejauh ini.
steros

Jawaban:

11

Seperti yang ditunjukkan Harun formulir ditambahkan Magento/Checkout/Block/Checkout/LayoutProcessor.php. Dengan informasi ini saya mengembangkan modul dengan plugin setelah yang menghubungkan ke prosesor itu:

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

Ini berhasil mengatur ulang formulir alamat penagihan (dan mudah-mudahan menghemat beberapa sakit kepala untuk orang lain). Tetapi masih ada pekerjaan yang diperlukan pada javascript (?) Yang menangani billing address is the same as shipping addressmekanisme. Karena ini masih bekerja dengan cara "standar".

Informasi tambahan:

Saya melihat bahwa di backend jika Anda membuat tata letak baru persis seperti yang diinginkan. Bentuk penagihan adalah "sebelum" bentuk pengiriman dan logikanya juga sebaliknya. Jika saya dapat menemukan waktu saya pikir mungkin bermanfaat untuk melihat kode di sana. Mungkin dimungkinkan untuk menggunakannya di frontend juga.

steros
sumber
Bukankah seharusnya namespace menjadi namespace <vendor>\ReorderBillingForm\Block\Checkout;?
Frank Groot
2
Tidak yakin. Saya mengalami masalah caching (lagi-lagi) tampaknya. Terkadang itu tidak berhasil, terkadang berhasil. Saya menulis ulang modul dan sekarang berfungsi setiap saat. Itu penting untuk digunakan aroundProcess. Saya memperbarui posting saya.
steros
Terima kasih telah memperbarui jawaban Anda tetapi saya mendapatkan kesalahan berikutNotice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
Frank Groot
Hmm aneh, saya tidak mengerti. Tetapi Anda dapat memeriksa bagaimana $ jsLayout disusun dengan debugging. Saya tidak memiliki instance yang berjalan saat ini. Jika saya mengatur yang lain saya akan mencoba mencari tahu apa yang mungkin menjadi masalah.
steros
Apakah Anda sudah memperbarui jawabannya? Anda masih menggunakan AfterProcess, tidak di sekitar Process @DarsVaeda Kami menggunakan solusi Anda tetapi memiliki Alamat Billign pada Langkah Pembayaran masih muncul
Alex
0

Kesalahan Undefined index: billing-address-formdalam LayoutProcessorPlugin.phpterjadi ketika Anda memiliki checkout properti "Alamat Tampilan Billing Pada " set ke " Cara Pembayaran " bukan " Pembayaran Halaman ".

Perbaiki dengan:

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

Saya lebih suka menambahkan ini sebagai komentar untuk posting DarsVaedas (lihat di atas), tetapi saya sepertinya tidak memiliki izin ...

digijay
sumber
terima kasih @jaybong untuk menambahkan pernyataan sql untuk memperbaikinya!
digijay