як упорядкувати (переключити) платіжну адресу перед адресою доставки


17

під час замовлення на одній сторінці мені потрібно змінити порядок розрахункової адреси перед адресою доставки. насправді логіка повинна бути навпаки, ніж зараз. якщо адреса доставки відрізняється від платіжної адреси, ви маєте змогу редагувати її. тепер ви можете редагувати платіжну адресу, якщо вона відрізняється від адреси доставки. також платіжна адреса повинна відображатися на тій же "сторінці", що і адреса доставки. на даний момент крок 1 у кроках оформлення замовлення.

як би я це зробив? можливо, для цього є плагін, але я його ще не міг знайти.

Я додав скріншот німецького магазину, роблячи це так:

введіть тут опис зображення

Я знайшов файл шаблону .html для форми виставлення рахунків, і, здається, це місце, де він опиняється у 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>

Але це спеціально не розміщується тут, і я не можу знайти інше місце, куди його вводять у це місце.


2
Форма адреси рахунків додана у файл Magento/Checkout/Block/Checkout/LayoutProcessor.php.
Аарон Аллен

Так, це все. Там мені вдалося принаймні змінити порядок. Але все ж доведеться перемикати логіку адреси.
steros

у вас є користувацький замовлення?
Аміт Бера

Потрібно змінити Magento\Checkout\Block\Checkout\LayoutProcessorта змінити позицію, як я думаю. Не впевнений
Анкіт Шах

1
@AnkitShah Це не спрацює, оскільки мені просто потрібно перемістити адресу виставлення рахунків, а не весь етап виставлення рахунків. Крім того, як Аарон зазначив, перший крок - це написати модуль, який замінить LayoutProcessor. Я вже це зробив успішно, але все ж логіка вибору платіжної адреси такою ж, як адреса доставки, є невірною. І до того ж я не впевнений, чи спрацює весь процес. Принаймні, я можу продовжувати оформлення каси, але поки що не впевнений у побічних ефектах.
стероси

Відповіді:


11

Як зазначав Аарон, форма додається в Magento/Checkout/Block/Checkout/LayoutProcessor.php. За цією інформацією я розробив модуль із плагіном after, який підключається до цього процесора:

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

Це успішно переробляє форму адреси рахунків (і, сподіваємось, заощаджує деякі головні болі для інших). Але є ще робота, необхідна для JavaScript (?), Який обробляє billing address is the same as shipping addressмеханізм. Оскільки це все ще працює "стандартним" способом.

Додаткова інформація:

Я бачив, що в бекенді, якщо ви створюєте новий порядок, макет точно такий, як хотілося. Форма виставлення рахунків "до" форми доставки, а логіка - навпаки. Якщо я можу знайти час, я думаю, що було б корисно подивитися на код там. Можливо, це можливо використовувати і у фронтенді.


Чи не повинен простір імен бути простором імен <vendor>\ReorderBillingForm\Block\Checkout;?
Френк Гроот

2
Не впевнений. Я зіткнувся з проблемами кешування (ще раз), здається. Іноді це не спрацювало б, іноді це було. Я переписав модуль і тепер він працює весь час. Це було важливо використовувати aroundProcess. Я оновив свою публікацію.
стерос

Дякуємо за оновлення вашої відповіді, але я отримую таку помилкуNotice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
Frank Groot

Хм, дивно, я цього не розумію. Але ви можете перевірити, як структурується $ jsLayout шляхом налагодження. Наразі у мене немає запущеного екземпляра. Якщо я налаштую ще одну, я спробую з’ясувати, що може бути проблемою.
steros

Ви вже оновили відповідь? ви все ще використовуєте afterProcess, а не навколо Process @DarsVaeda. Ми використовуємо ваше рішення, але ще є адреса Billign на етапі платежу
Alex

0

Помилка Undefined index: billing-address-formв LayoutProcessorPlugin.phpвідбувається , коли у вас є фотографії нерухомості «Display Billing Address On » на « Спосіб оплати » замість « Оплата сторінки ».

Виправити за допомогою:

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

Я хотів би додати це як коментар до допису DarsVaedas (див. Вище), але я, здається, не маю дозволу ...


дякую @jaybong, що додав заяву sql, щоб виправити це!
digijay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.