如何在送货地址之前重新订购(切换)帐单地址


17

在一页结帐页面上,我需要在送货地址之前重新订购帐单地址。实际上,逻辑应该与现在相反。如果送货地址与帐单地址不同,则应该可以对其进行编辑。现在,您可以修改帐单邮寄地址(如果它与送货地址不同)。另外,帐单邮寄地址应与送货地址显示在同一“页面”上。当前在magento结帐步骤中的步骤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思考并改写位置。不确定
Ankit Shah

1
@AnkitShah那行不通,因为我只需要移动帐单地址,而不是整个帐单步骤。正如Aaron指出的那样,要做的第一步是编写一个覆盖LayoutProcessor的模块。我已经成功完成了此操作,但选择帐单地址与送货地址相同的逻辑仍然不正确。另外,我不确定整个过程是否会奏效。至少我可以继续进行结帐,但目前尚不确定副作用。
steros

Answers:


11

正如Aaron指出的那样,表格被添加了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;吗?
Frank Groot

2
不确定。看来我遇到了缓存问题(还是再次)。有时它行不通,有时却行得通。我重写了模块,现在它一直都在工作。使用很重要aroundProcess。我更新了我的帖子。
steros

感谢您更新的答案,但我得到下面的错误Notice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
弗兰克·格鲁特

嗯,奇怪,我不明白。但是您可以通过调试检查$ jsLayout的结构。我目前没有正在运行的实例。如果我设置另一个,我将尝试找出可能是什么问题。
steros

您是否已经更新了答案?您仍在使用afterProcess,而不是在流程@DarsVaeda周围。我们正在使用您的解决方案,但仍在付款步骤中显示帐单地址
Alex

0

当您将结帐属性“显示开票地址开 ”设置为“ 付款方式 ”而不是“ 付款页面 ” 时Undefined index: billing-address-formLayoutProcessorPlugin.php就会发生错误。

修正:

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

我本来希望将此内容添加到DarsVaedas帖子中(见上文),但我似乎没有许可……


感谢@jaybong添加了sql语句来解决此问题!
digijay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.