come riordinare (cambiare) l'indirizzo di fatturazione prima dell'indirizzo di spedizione


17

al momento del pagamento onepage devo riordinare l'indirizzo di fatturazione prima dell'indirizzo di spedizione. in effetti la logica dovrebbe essere al contrario di quanto non sia ora. se l'indirizzo di spedizione è diverso dall'indirizzo di fatturazione, dovresti essere in grado di modificarlo. ora puoi modificare l'indirizzo di fatturazione se differisce dall'indirizzo di spedizione. anche l'indirizzo di fatturazione dovrebbe apparire sulla stessa "pagina" dell'indirizzo di spedizione. attualmente passaggio 1 nei passaggi di checkout magento.

come lo farei? forse c'è un plugin per questo ma non sono ancora riuscito a trovarne uno.

Ho allegato uno screenshot di un negozio tedesco facendolo così:

inserisci qui la descrizione dell'immagine

Ho trovato il file modello .html per il modulo di fatturazione e sembra che questo sia il luogo in cui finisce nel 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>

Ma non è collocato specificamente qui e non riesco a trovare un altro posto dove viene iniettato in quel posto.


2
Il modulo dell'indirizzo di fatturazione viene aggiunto nel file Magento/Checkout/Block/Checkout/LayoutProcessor.php.
Aaron Allen,

Sì, è tutto. Lì sono riuscito a riordinare almeno. Devo comunque cambiare la logica dell'indirizzo.
steros,

hai utilizzato il checkout personalizzato?
Amit Bera

Magento\Checkout\Block\Checkout\LayoutProcessorHo bisogno di scavalcare e cambiare posizione come sto pensando. Non sono sicuro
Ankit Shah,

1
@AnkitShah Non funzionerà perché devo solo spostare l'indirizzo di fatturazione non l'intero passaggio di fatturazione. Inoltre, come ha sottolineato Aaron, il primo passo da fare è scrivere un modulo che sovrascrive LayoutProcessor. L'ho già fatto con successo, ma la logica della scelta dell'indirizzo di fatturazione è la stessa dell'indirizzo di spedizione non è corretta. Inoltre, non sono sicuro che l'intero processo funzionerà. Almeno posso andare alla cassa ma finora non sono sicuro degli effetti collaterali.
steros,

Risposte:


11

Come sottolineato da Aaron, il modulo viene aggiunto Magento/Checkout/Block/Checkout/LayoutProcessor.php. Con queste informazioni ho sviluppato un modulo con un plugin after che si aggancia a quel processore:

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

Questo riordina con successo il modulo dell'indirizzo di fatturazione (e si spera di risparmiare qualche mal di testa per altre persone). Ma c'è ancora del lavoro necessario sul javascript (?) Che gestisce il billing address is the same as shipping addressmeccanismo. Dato che funziona ancora nel modo "standard".

Informazioni addizionali:

Ho visto che nel backend se si crea un nuovo ordine il layout è esattamente come desiderato. Il modulo di fatturazione è "prima" del modulo di spedizione e la logica è anche il contrario. Se riesco a trovare il tempo, penso che potrebbe essere utile guardare il codice lì. Forse è possibile usarlo anche in frontend.


Lo spazio dei nomi non dovrebbe essere lo spazio dei nomi <vendor>\ReorderBillingForm\Block\Checkout;?
Frank Groot,

2
Non sono sicuro. Mi sono imbattuto in problemi di memorizzazione nella cache (ancora una volta), a quanto pare. A volte non funzionava, a volte funzionava. Ho riscritto il modulo e ora funziona sempre. Era importante da usare aroundProcess. Ho aggiornato il mio post.
steros,

Grazie per aver aggiornato la tua risposta, ma ricevo il seguente erroreNotice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
Frank Groot

Hmm strano, non capisco. Ma puoi controllare come è strutturato $ jsLayout eseguendo il debug. Non ho un'istanza corrente al momento. Se ne installo un altro, proverò a scoprire quale potrebbe essere il problema.
steros,

Hai già aggiornato la risposta? stai ancora usando afterProcess, non in giro Process @DarsVaeda Stiamo usando la tua soluzione ma abbiamo ancora l'indirizzo di fatturazione nella fase di pagamento
Alex

0

L'errore Undefined index: billing-address-formnella LayoutProcessorPlugin.phpverifica quando si dispone alla cassa proprietà "Visualizzazione indirizzo di fatturazione On " insieme a " Metodo di pagamento " invece di " pagina di pagamento ".

Risolvi con:

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

Avrei preferito aggiungere questo come commento al post di DarsVaedas (vedi sopra), ma non sembra avere il permesso ...


grazie @jaybong per aver aggiunto l'istruzione sql per risolvere questo problema!
digijay,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.