Cách sắp xếp lại (chuyển đổi) địa chỉ thanh toán trước địa chỉ giao hàng


17

trên thanh toán onepage tôi cần sắp xếp lại địa chỉ thanh toán trước địa chỉ giao hàng. trong thực tế, logic phải là cách khác hơn bây giờ. nếu địa chỉ giao hàng khác với địa chỉ thanh toán, bạn sẽ có thể chỉnh sửa nó. bây giờ bạn có thể chỉnh sửa địa chỉ thanh toán nếu nó khác với địa chỉ giao hàng. địa chỉ thanh toán sẽ xuất hiện trên cùng một "trang" với địa chỉ giao hàng. hiện bước 1 trong các bước kiểm tra magento.

Làm thế nào để tôi làm điều này? có thể có một plugin cho cái này nhưng tôi chưa thể tìm thấy cái nào cả.

Tôi đã đính kèm một ảnh chụp màn hình của một cửa hàng Đức làm như thế này:

nhập mô tả hình ảnh ở đây

Tôi đã tìm thấy tệp mẫu .html cho biểu mẫu thanh toán và có vẻ như đây là nơi kết thúc trong 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>

Nhưng nó không được đặt cụ thể ở đây và tôi dường như không thể tìm thấy một nơi nào khác nơi nó được tiêm vào nơi đó.


2
Mẫu địa chỉ thanh toán được thêm vào trong tập tin Magento/Checkout/Block/Checkout/LayoutProcessor.php.
Aaron Allen

Đúng đó. Ở đó tôi quản lý để sắp xếp lại ít nhất. Vẫn phải chuyển đổi logic địa chỉ mặc dù.
Steros

Bạn đã sử dụng kiểm tra tùy chỉnh?
Amit Bera

Cần ghi đè Magento\Checkout\Block\Checkout\LayoutProcessor& thay đổi vị trí như tôi đang nghĩ. Không chắc chắn
Ankit Shah

1
@AnkitShah Điều đó sẽ không hoạt động vì tôi chỉ cần di chuyển địa chỉ thanh toán chứ không phải toàn bộ bước thanh toán. Cũng như Aaron chỉ ra bước đầu tiên để làm điều đó là viết một mô-đun ghi đè lên LayoutProcessor. Tôi đã thực hiện thành công nhưng vẫn logic khi chọn địa chỉ thanh toán giống như địa chỉ giao hàng là không chính xác. Và ngoài ra, tôi không chắc chắn nếu toàn bộ quá trình sẽ hoạt động. Ít nhất tôi có thể tiếp tục kiểm tra nhưng tôi không chắc chắn về tác dụng phụ cho đến nay.
Steros

Câu trả lời:


11

Như Aaron chỉ ra các hình thức được thêm vào Magento/Checkout/Block/Checkout/LayoutProcessor.php. Với thông tin này, tôi đã phát triển một mô-đun với một plugin sau nối vào bộ xử lý đó:

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

Điều này sắp xếp lại thành công biểu mẫu địa chỉ thanh toán (và hy vọng sẽ tiết kiệm được một số vấn đề đau đầu cho người khác). Nhưng vẫn còn công việc cần thiết trên javascript (?) Xử lý billing address is the same as shipping addresscơ chế. Vì điều này vẫn hoạt động theo cách "tiêu chuẩn".

Thông tin bổ sung:

Tôi thấy rằng trong phần phụ trợ nếu bạn tạo một thứ tự mới, bố cục chính xác như mong muốn. Hình thức thanh toán là "trước" hình thức vận chuyển và logic cũng là cách khác. Nếu tôi có thể tìm thấy thời gian tôi nghĩ rằng có thể có ích khi xem mã ở đó. Có lẽ nó cũng có thể sử dụng nó ở frontend.


Không phải không gian tên là không gian tên <vendor>\ReorderBillingForm\Block\Checkout;?
Frank Groot

2
Không chắc. Tôi gặp vấn đề về bộ nhớ đệm (một lần nữa) có vẻ như. Đôi khi nó không hoạt động, đôi khi nó đã làm. Tôi viết lại mô-đun và bây giờ nó hoạt động mọi lúc. Nó rất quan trọng để sử dụng aroundProcess. Tôi đã cập nhật bài viết của mình.
Steros

Cảm ơn bạn đã cập nhật câu trả lời của bạn nhưng tôi nhận được lỗi sauNotice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
Frank Groot

Hmm lạ, tôi không hiểu điều đó. Nhưng bạn có thể kiểm tra cách $ jsLayout được cấu trúc bằng cách gỡ lỗi. Tôi không có một ví dụ đang chạy. Nếu tôi thiết lập một cái khác, tôi sẽ cố gắng tìm hiểu vấn đề có thể là gì.
Steros

Bạn đã cập nhật câu trả lời? bạn vẫn đang sử dụng afterProcess, không phải xung quanh Process @DarsVaeda Chúng tôi đang sử dụng giải pháp của bạn nhưng có Địa chỉ Billign trên Bước thanh toán vẫn xuất hiện
Alex

0

Các lỗi Undefined index: billing-address-formtrong LayoutProcessorPlugin.phpxảy ra khi bạn có kiểm tra tài sản "Display Địa chỉ thanh toán On " thiết lập để " Phương thức thanh toán " thay vì " Thanh toán Trang ".

Khắc phục bằng:

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

Tôi muốn thêm bình luận này vào bài viết của DarsVaedas (xem ở trên), nhưng dường như tôi không có sự cho phép


cảm ơn @jaybong vì đã thêm câu lệnh sql để sửa lỗi này!
digijay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.