배송지 주소 전에 청구 지 주소를 재주문 (전환)하는 방법


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.
Aaron Allen

그렇습니다. 나는 적어도 재주문했다. 그래도 여전히 주소 논리를 전환해야합니다.
steros

맞춤 결제를 사용하고 있습니까?
Amit Bera

Magento\Checkout\Block\Checkout\LayoutProcessor생각하면서 위치 를 재정의 하고 변경 해야합니다 . 확실하지 않음
Ankit Shah

1
@AnkitShah 전체 청구 단계가 아닌 청구 주소를 이동하기 만하면 작동하지 않습니다. 또한 Aaron이 첫 번째 단계로 지적한 것처럼 LayoutProcessor를 덮어 쓰는 모듈을 작성하는 것입니다. 나는 이미 그것을 성공적으로했지만 여전히 청구 주소를 배송 주소와 동일하게 선택하는 논리가 올바르지 않습니다. 또한 전체 프로세스가 작동하는지 확실하지 않습니다. 적어도 체크 아웃을 계속할 수는 있지만 지금까지 부작용에 대해서는 잘 모르겠습니다.
steros

답변:


11

Aaron이 지적한대로 양식은에 추가됩니다 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메커니즘 을 처리하는 javascript (?)에 대한 작업이 여전히 필요합니다 . 이것은 여전히 ​​"표준"방식으로 작동합니다.

추가 정보:

백엔드에서 새 주문을 만들면 레이아웃이 원하는대로 정확하게 보입니다. 청구서 양식은 운송 양식보다 "앞에"있으며 논리도 그 반대입니다. 시간을 찾을 수 있다면 거기서 코드를 보는 것이 도움이 될 것이라고 생각합니다. 프론트 엔드에서도 사용할 수 있습니다.


네임 스페이스가 네임 스페이스가 아니어야합니까 <vendor>\ReorderBillingForm\Block\Checkout;?
Frank Groot

2
확실하지 않다. 캐싱 문제가 발생했습니다 (다시). 때로는 작동하지 않거나 때로는 작동하지 않습니다. 모듈을 다시 작성했으며 이제는 항상 작동합니다. 사용하는 것이 중요했습니다 aroundProcess. 내 게시물을 업데이트했습니다.
steros 2016 년

답변을 업데이트 해 주셔서 감사하지만 다음과 같은 오류가 발생합니다Notice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
Frank Groot

흠, 나는 그것을 얻지 못한다. 그러나 디버깅을 통해 $ jsLayout의 구조를 확인할 수 있습니다. 현재 실행중인 인스턴스가 없습니다. 다른 것을 설정하면 문제가 무엇인지 알아 내려고 노력할 것입니다.
steros 2016 년

이미 답변을 업데이트 했습니까? 귀하는 여전히 Process @ DarsVaeda가 아닌 afterProcess를 사용하고 있습니다. 귀하의 솔루션을 사용하고 있지만 결제 단계에 Billign 주소가 계속 표시됩니다
Alex

0

결제 속성 "결제 주소 표시 "를 " 결제 페이지 " 대신 " 결제 방법 "으로 설정 한 경우 오류 Undefined index: billing-address-formLayoutProcessorPlugin.php발생합니다 .

로 수정 :

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

DarsVaedas 게시물에 주석으로 이것을 추가하고 싶었지만 (위 참조) 권한이없는 것 같습니다 ...


이 문제를 해결하기 위해 sql 문을 추가해 주신 @jaybong에게 감사드립니다!
digijay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.