วิธีการเรียงลำดับ (สลับ) ที่อยู่สำหรับเรียกเก็บเงินใหม่ก่อนที่จะจัดส่ง


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รูปแบบที่อยู่เรียกเก็บเงินจะถูกเพิ่มในแฟ้ม
Aaron Allen

ใช่นั่นแหล่ะ ฉันจัดการสั่งซื้อใหม่เป็นอย่างน้อย ยังคงต้องเปลี่ยนตรรกะที่อยู่แม้ว่า
steros

คุณใช้การชำระเงินที่กำหนดเองหรือ
Amit Bera

ต้องการแทนที่Magento\Checkout\Block\Checkout\LayoutProcessorและเปลี่ยนตำแหน่งในขณะที่ฉันกำลังคิด ไม่แน่ใจ
Ankit Shah

1
@AnkitShah ไม่สามารถใช้งานได้เพราะฉันต้องการย้ายที่อยู่สำหรับเรียกเก็บเงินไม่ใช่ขั้นตอนการเรียกเก็บเงินทั้งหมด เช่นเดียวกับที่แอรอนชี้ให้เห็นขั้นตอนแรกคือการเขียนโมดูลที่เขียนทับ LayoutProcessor ฉันทำเช่นนั้นสำเร็จแล้ว แต่ก็ยังมีเหตุผลในการเลือกที่อยู่สำหรับการเรียกเก็บเงินเหมือนกันกับที่อยู่จัดส่งไม่ถูกต้อง นอกจากนี้ฉันไม่แน่ใจว่ากระบวนการทั้งหมดจะใช้งานได้หรือไม่ อย่างน้อยก็สามารถไปเช็คเอาท์ได้ แต่ฉันไม่แน่ใจเกี่ยวกับผลข้างเคียง
steros

คำตอบ:


11

เมื่อแอรอนชี้ให้เห็นแบบฟอร์มจะถูกเพิ่มเข้าMagento/Checkout/Block/Checkout/LayoutProcessor.phpมา ด้วยข้อมูลนี้ฉันได้พัฒนาโมดูลที่มีปลั๊กอินหลังที่เชื่อมต่อกับโปรเซสเซอร์:

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

การเรียงลำดับแบบฟอร์มที่อยู่การเรียกเก็บเงินใหม่นี้ประสบความสำเร็จ แต่ยังคงต้องใช้งานจาวาสคริปต์ (?) ที่ยังbilling address is the same as shipping addressใช้งานได้อยู่ เช่นนี้ยังคงใช้งานได้ "มาตรฐาน" วิธี

ข้อมูลเพิ่มเติม:

ฉันเห็นว่าในแบ็กเอนด์ถ้าคุณสร้างคำสั่งซื้อใหม่เลย์เอาต์เป็นสิ่งที่ต้องการ แบบฟอร์มการเรียกเก็บเงินคือ "ก่อน" แบบฟอร์มการจัดส่งและตรรกะเป็นวิธีอื่น ๆ เช่นกัน หากฉันสามารถหาเวลาที่ฉันคิดว่ามันอาจจะเป็นประโยชน์ในการดูรหัสที่นั่น อาจเป็นไปได้ที่จะใช้ในส่วนหน้าด้วย


เนมสเปซไม่ควรเป็นเนมสเปซ<vendor>\ReorderBillingForm\Block\Checkout;?
Frank Groot

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เกิดขึ้นเมื่อคุณมีคุณสมบัติที่เช็คเอาท์"ที่อยู่บนจอแสดงผลการเรียกเก็บเงิน " ชุดที่ " วิธีการชำระเงิน " แทน " การชำระเงินหน้า "

แก้ไขด้วย:

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

ฉันต้องการเพิ่มสิ่งนี้เป็นความคิดเห็นในโพสต์ของ DarsVaedas (ดูด้านบน) แต่ฉันดูเหมือนจะไม่ได้รับอนุญาต ...


ขอบคุณ @jaybong สำหรับการเพิ่มคำสั่ง sql เพื่อแก้ไขปัญหานี้!
digijay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.