jak zmienić kolejność (zmienić) adres rozliczeniowy przed adresem wysyłki

17

na kasie na stronie muszę zmienić kolejność adresu rozliczeniowego przed adresem wysyłki. w rzeczywistości logika powinna być odwrotna niż obecnie. jeśli adres wysyłki różni się od adresu rozliczeniowego, możesz go edytować. teraz możesz edytować adres rozliczeniowy, jeśli różni się on od adresu wysyłki. również adres rozliczeniowy powinien pojawić się na tej samej „stronie” co adres wysyłki. obecnie krok 1 w krokach kasy Magento.

jak mam to zrobić? może jest do tego wtyczka, ale jeszcze jej nie znalazłem.

Dołączyłem zrzut ekranu z niemieckiego sklepu, który robi to w ten sposób:

wprowadź opis zdjęcia tutaj

Znalazłem plik szablonu .html dla formularza rozliczeniowego i wydaje się, że jest to miejsce, w którym kończy się on w 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>

Ale to nie jest specjalnie umieszczone tutaj i nie mogę znaleźć innego miejsca, w które zostanie wstrzyknięte w to miejsce.

steros
źródło
2
Formularz adresu rozliczeniowego jest dodawany do pliku Magento/Checkout/Block/Checkout/LayoutProcessor.php.
Aaron Allen
Tak to jest to. Tam udało mi się przynajmniej zmienić kolejność. Nadal jednak muszę zmienić logikę adresu.
Steros
korzystasz z niestandardowej kasy?
Amit Bera
Muszę zastąpić Magento\Checkout\Block\Checkout\LayoutProcessori zmienić pozycję, tak jak myślę. Nie jestem pewien
Ankit Shah,
1
@AnkitShah To nie zadziała, bo muszę tylko przenieść adres rozliczeniowy, a nie cały krok rozliczeniowy. Również, jak zauważył Aaron, pierwszym krokiem do tego jest napisanie modułu, który zastąpi LayoutProcessor. Zrobiłem to już pomyślnie, ale logika wyboru adresu rozliczeniowego, który jest taki sam jak adres wysyłki, jest nieprawidłowa. I dodatkowo nie jestem pewien, czy cały proces zadziała. Przynajmniej mogę przejść do kasy, ale nie jestem pewien co do skutków ubocznych.
steros 19.04.17

Odpowiedzi:

11

Jak zauważył Aaron, formularz jest dodawany Magento/Checkout/Block/Checkout/LayoutProcessor.php. Dzięki tym informacjom opracowałem moduł z wtyczką końcową, która łączy się z tym procesorem:

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

To z powodzeniem zmienia kolejność formularza adresu rozliczeniowego (i mam nadzieję, że zaoszczędzi trochę bólu innym osobom). Nadal jednak potrzebne są prace nad javascript (?), Który obsługuje ten billing address is the same as shipping addressmechanizm. Ponieważ nadal działa to w sposób „standardowy”.

Dodatkowe informacje:

Widziałem, że w backend, jeśli tworzysz nowe zamówienie, układ jest dokładnie taki, jak chcesz. Formularz rozliczeniowy znajduje się „przed” formularzem wysyłkowym, a logika jest odwrotna. Jeśli znajdę czas, myślę, że warto spojrzeć na kod tam. Być może można go również użyć w interfejsie użytkownika.

steros
źródło
Czy przestrzeń nazw nie powinna być przestrzenią nazw <vendor>\ReorderBillingForm\Block\Checkout;?
Frank Groot
2
Niepewny. Wydaje mi się, że napotkałem problemy z buforowaniem (po raz kolejny). Czasami to nie działało, a czasem działało. Przepisałem moduł i teraz działa cały czas. Ważne było użycie aroundProcess. Zaktualizowałem swój post.
steros
Dziękujemy za aktualizację odpowiedzi, ale pojawia się następujący błądNotice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
Frank Groot
Hmm dziwne, nie rozumiem tego. Ale możesz sprawdzić strukturę $ jsLayout poprzez debugowanie. Obecnie nie mam uruchomionej instancji. Jeśli skonfiguruję inny, spróbuję dowiedzieć się, co może być przyczyną problemu.
steros
Czy zaktualizowałeś już odpowiedź? nadal korzystasz z AfterProcess, a nie w pobliżu Process @DarsVaeda Korzystamy z Twojego rozwiązania, ale nadal widnieje adres Billign na etapie płatności
Alex
0

Błąd Undefined index: billing-address-formw LayoutProcessorPlugin.phppojawia się, gdy masz kasy właściwość „Adres Wyświetlacz rozliczeniowy ” ustawiony na „ Payment Method ” zamiast „ płatność Page ”.

Napraw za pomocą:

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

Wolałbym dodać to jako komentarz do postu DarsVaedas (patrz wyżej), ale wydaje mi się, że nie mam pozwolenia…

digijay
źródło
dzięki @jaybong za dodanie instrukcji sql, aby to naprawić!
digijay