как изменить (сменить) адрес выставления счета перед адресом доставки

17

на одной странице оформления заказа мне нужно изменить адрес выставления счета до адреса доставки. на самом деле логика должна быть наоборот, чем сейчас. если адрес доставки отличается от адреса выставления счета, вы сможете изменить его. Теперь вы можете изменить адрес для выставления счета, если он отличается от адреса доставки. также платежный адрес должен отображаться на той же «странице», что и адрес доставки. в настоящее время шаг 1 в шагах проверки magento.

как бы я это сделал? может быть, есть плагин для этого, но я пока не смог его найти.

Я приложил скриншот немецкого магазина, делающего это так:

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

Я нашел файл шаблона .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>

Но это не определенно размещено здесь, и я не могу найти другое место, где это вводится в это место.

steros
источник
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механизм. Поскольку это все еще работает "стандартным" способом.

Дополнительная информация:

Я видел, что в бэкэнде, если вы создаете новый заказ, макет будет именно таким, как хотелось. Форма для выставления счета находится «перед» формой отгрузки, а логика - и наоборот. Если я смогу найти время, я думаю, что было бы полезно взглянуть на код там. Может быть, это можно использовать и в веб-интерфейсе.

steros
источник
Разве пространство имен не должно быть пространством имен <vendor>\ReorderBillingForm\Block\Checkout;?
Фрэнк Гроот
2
Точно сказать не могу. Кажется, я столкнулся с проблемами кеширования (опять же). Иногда это не сработало, иногда это сработало. Я переписал модуль, и теперь он работает все время. Было важно использовать aroundProcess. Я обновил свой пост.
Steros
Спасибо за обновление вашего ответа, но я получаю следующую ошибкуNotice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
Фрэнк Гроот
Хм странно, я не понимаю. Но вы можете проверить, как $ jsLayout структурирован путем отладки. У меня нет работающего экземпляра в настоящее время. Если я настрою другую, я попытаюсь выяснить, в чем может быть проблема.
Steros
Вы уже обновили ответ? вы все еще используете afterProcess, а не вокруг Process @DarsVaeda Мы используем ваше решение, но адрес шага платежа на этапе оплаты все еще отображается
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 (см. Выше), но у меня, похоже, нет разрешения…

digijay
источник
спасибо @jaybong за добавление оператора sql, чтобы это исправить!
Digijay