wie die Rechnungsadresse vor der Lieferadresse nachbestellt (gewechselt) wird

17

an der onepage kasse muss ich die rechnungsadresse vor der versandadresse nachbestellen. Tatsächlich sollte die Logik umgekehrt sein als jetzt. Wenn die Lieferadresse von der Rechnungsadresse abweicht, sollten Sie sie bearbeiten können. Jetzt können Sie die Rechnungsadresse bearbeiten, wenn sie von der Lieferadresse abweicht. außerdem sollte die Rechnungsadresse auf derselben "Seite" wie die Lieferadresse erscheinen. Derzeit Schritt 1 in den Magento Checkout-Schritten.

wie würde ich das machen Vielleicht gibt es ein Plugin dafür, aber ich konnte noch kein finden.

Ich habe einen Screenshot eines deutschen Shops angehängt, der das so macht:

Bildbeschreibung hier eingeben

Ich habe die HTML-Vorlagendatei für das Abrechnungsformular gefunden und es scheint, dass dies der Ort ist, an dem sie in der Datei checkout_index_index.xml endet:

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

Aber es ist nicht speziell hier platziert und ich kann anscheinend keinen anderen Ort finden, an dem es an diesen Ort injiziert wird.

Steros
quelle
2
Das Formular für die Rechnungsadresse wird in die Datei eingefügt Magento/Checkout/Block/Checkout/LayoutProcessor.php.
Aaron Allen
Ja, das ist es. Dort konnte ich zumindest nachbestellen. Trotzdem muss die Adresslogik umgeschaltet werden.
Steros
Sie haben eine benutzerdefinierte Kaufabwicklung?
Amit Bera
Müssen Sie die Magento\Checkout\Block\Checkout\LayoutProcessorPosition überschreiben und ändern, wie ich denke. Nicht sicher
Ankit Shah
1
@AnkitShah Das funktioniert nicht, da ich nur die Rechnungsadresse und nicht den gesamten Rechnungsschritt verschieben muss. Wie Aaron auch betonte, besteht der erste Schritt darin, ein Modul zu schreiben, das LayoutProcessor überschreibt. Das habe ich bereits erfolgreich gemacht, aber die Logik, dass die Rechnungsadresse mit der Lieferadresse übereinstimmt, stimmt nicht. Und außerdem bin ich mir nicht sicher, ob der ganze Prozess funktionieren wird. Zumindest kann ich an der Kasse weitermachen, aber ich bin mir nicht sicher, was die Nebenwirkungen angeht.
Steros

Antworten:

11

Wie Aaron betonte, wird das Formular hinzugefügt Magento/Checkout/Block/Checkout/LayoutProcessor.php. Mit diesen Informationen entwickelte ich ein Modul mit einem After-Plugin, das sich an diesen Prozessor anschließt:

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

Dadurch wird das Formular für die Rechnungsadresse erfolgreich neu angeordnet (und hoffentlich werden einige Probleme für andere Personen vermieden). Das Javascript (?), Das den billing address is the same as shipping addressMechanismus handhabt, muss noch bearbeitet werden . Da dies immer noch der "Standard" Weg funktioniert.

Zusätzliche Information:

Ich habe gesehen, dass im Backend, wenn Sie einen neuen Auftrag erstellen, das Layout genau so ist, wie es gewünscht wird. Das Rechnungsformular steht "vor" dem Versandformular und die Logik ist auch umgekehrt. Wenn ich die Zeit finde, denke ich, kann es nützlich sein, den Code dort anzusehen. Möglicherweise kann es auch im Frontend verwendet werden.

Steros
quelle
Sollte der Namespace nicht Namespace sein <vendor>\ReorderBillingForm\Block\Checkout;?
Frank Groot
2
Nicht sicher. Es scheint, dass ich (noch einmal) auf Cache-Probleme gestoßen bin. Manchmal würde es nicht funktionieren, manchmal tat es. Ich habe das Modul umgeschrieben und jetzt funktioniert es die ganze Zeit. Es war wichtig zu benutzen aroundProcess. Ich habe meinen Beitrag aktualisiert.
Steros
Vielen Dank für die Aktualisierung Ihrer Antwort, aber ich erhalte den folgenden FehlerNotice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
Frank Groot
Hmm komisch, das verstehe ich nicht. Sie können jedoch überprüfen, wie das $ jsLayout durch Debuggen strukturiert ist. Ich habe derzeit keine laufende Instanz. Wenn ich einen anderen einrichte, versuche ich herauszufinden, wo das Problem liegen könnte.
Steros
Haben Sie die Antwort bereits aktualisiert? Sie verwenden immer noch afterProcess, nicht etwa Process @DarsVaeda. Wir verwenden Ihre Lösung, aber die Rechnungsadresse im Zahlungsschritt wird immer noch angezeigt
Alex
0

Der Fehler Undefined index: billing-address-formin LayoutProcessorPlugin.phptritt auf, wenn Sie die Kasse Eigenschaft haben , „Display Rechnungsadresse On “ auf „ Zahlungsmethode “ statt „ Payment Page “.

Fix mit:

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

Ich hätte es vorgezogen, dies als Kommentar zu DarsVaedas Post hinzuzufügen (siehe oben), aber ich scheine nicht die Erlaubnis zu haben ...

digijay
quelle
danke @jaybong für das Hinzufügen der SQL-Anweisung, um dies zu beheben!
Digijay