comment réorganiser (changer) l'adresse de facturation avant l'adresse d'expédition


17

à la caisse onepage, je dois réorganiser l'adresse de facturation avant l'adresse de livraison. en fait, la logique devrait être l'inverse de ce qu'elle est maintenant. si l'adresse de livraison diffère de l'adresse de facturation, vous devriez pouvoir la modifier. vous pouvez maintenant modifier l'adresse de facturation si elle diffère de l'adresse de livraison. l'adresse de facturation doit également apparaître sur la même "page" que l'adresse de livraison. actuellement l'étape 1 des étapes de paiement de magento.

comment pourrais-je faire cela? il y a peut-être un plugin pour cela mais je n'en ai pas encore trouvé.

J'ai joint une capture d'écran d'une boutique allemande le faisant comme ceci:

entrez la description de l'image ici

J'ai trouvé le fichier modèle .html pour le formulaire de facturation et il semble que c'est l'endroit où il se retrouve dans le 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>

Mais ce n'est pas spécifiquement placé ici et je n'arrive pas à trouver un autre endroit où il est injecté à cet endroit.


2
Le formulaire d'adresse de facturation est ajouté dans le fichier Magento/Checkout/Block/Checkout/LayoutProcessor.php.
Aaron Allen

Oui c'est ça. Là, j'ai réussi à réorganiser au moins. Je dois quand même changer la logique d'adresse.
steros

vous utilisez la caisse personnalisée?
Amit Bera

Besoin de passer outre Magento\Checkout\Block\Checkout\LayoutProcessoret de changer de position comme je le pense. Pas sûr
Ankit Shah

1
@AnkitShah Cela ne fonctionnera pas car j'ai juste besoin de déplacer l'adresse de facturation et non toute l'étape de facturation. Comme Aaron l'a également souligné, la première étape consiste à écrire un module qui écrase LayoutProcessor. J'ai déjà fait cela avec succès, mais la logique de choisir l'adresse de facturation étant la même que l'adresse de livraison n'est pas correcte. De plus, je ne sais pas si tout le processus fonctionnera. Au moins, je peux continuer à la caisse, mais je ne suis pas sûr des effets secondaires jusqu'à présent.
steros

Réponses:


11

Comme l'a souligné Aaron, le formulaire est ajouté Magento/Checkout/Block/Checkout/LayoutProcessor.php. Avec ces informations, j'ai développé un module avec un plugin after qui se connecte à ce processeur:

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

Cela réorganise avec succès le formulaire d'adresse de facturation (et, espérons-le, évite quelques maux de tête à d'autres personnes). Mais il reste du travail à faire sur le javascript (?) Qui gère le billing address is the same as shipping addressmécanisme. Comme cela fonctionne toujours de la manière "standard".

Information additionnelle:

J'ai vu que dans le backend, si vous créez une nouvelle commande, la mise en page est exactement comme vous le souhaitez. Le formulaire de facturation est "avant" le formulaire d'expédition et la logique est également l'inverse. Si je peux trouver le temps, je pense qu'il pourrait être utile de regarder le code là-bas. Peut-être qu'il est également possible de l'utiliser en frontend.


L'espace de noms ne devrait-il pas être un espace de noms <vendor>\ReorderBillingForm\Block\Checkout;?
Frank Groot

2
Pas certain. J'ai rencontré des problèmes de mise en cache (encore une fois), semble-t-il. Parfois, cela ne fonctionnait pas, parfois cela fonctionnait. J'ai réécrit le module et maintenant ça marche tout le temps. C'était important à utiliser aroundProcess. J'ai mis à jour mon message.
steros

Merci d'avoir mis à jour votre réponse, mais j'obtiens l'erreur suivanteNotice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
Frank Groot

Hmm étrange, je ne comprends pas. Mais vous pouvez vérifier la structure du $ jsLayout en déboguant. Je n'ai pas d'instance en cours d'exécution actuellement. Si j'en configure un autre, j'essaierai de découvrir quel pourrait être le problème.
steros

Avez-vous déjà mis à jour la réponse? vous utilisez toujours afterProcess, pas autour de Process @DarsVaeda Nous utilisons votre solution mais l'adresse de Billign sur l'étape de paiement apparaît toujours
Alex

0

L'erreur Undefined index: billing-address-formen LayoutProcessorPlugin.phpse produit lorsque vous avez la propriété de la caisse « Afficher adresse de facturation » sur « Méthode de paiement » au lieu de « page de paiement ».

Corrigez avec:

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

J'aurais préféré ajouter ceci en tant que commentaire au post de DarsVaedas (voir ci-dessus), mais je ne semble pas avoir la permission…


merci @jaybong d'avoir ajouté l'instruction sql pour résoudre ce problème!
digijay
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.