como reordenar (alternar) o endereço de cobrança antes do endereço de entrega

17

no checkout de uma página, preciso reordenar o endereço de cobrança antes do endereço de entrega. de fato, a lógica deve ser inversa do que é agora. se o endereço de entrega diferir do endereço de cobrança, você poderá editá-lo. agora você pode editar o endereço de cobrança se ele diferir do endereço de entrega. também o endereço de cobrança deve aparecer na mesma "página" que o endereço de entrega. atualmente passo 1 nas etapas de checkout do magento.

Como eu faria isso? talvez exista um plugin para isso, mas ainda não consegui encontrar um.

Anexei uma captura de tela de uma loja alemã fazendo assim:

insira a descrição da imagem aqui

Encontrei o arquivo de modelo .html para o formulário de cobrança e parece que este é o local em que ele termina no 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>

Mas não foi especificamente colocado aqui e não consigo encontrar outro lugar onde é injetado nesse local.

steros
fonte
2
O formulário do endereço de cobrança é adicionado ao arquivo Magento/Checkout/Block/Checkout/LayoutProcessor.php.
Aaron Allen
Sim é isso. Lá eu consegui reordenar pelo menos. Ainda tem que mudar a lógica do endereço.
steros
você está usando o checkout personalizado?
Amit Bera
Preciso substituir Magento\Checkout\Block\Checkout\LayoutProcessore mudar de posição como estou pensando. Não tenho certeza
Ankit Shah
1
@AnkitShah Isso não funcionará, pois só preciso mover o endereço de cobrança e não toda a etapa de cobrança. Além disso, como Aaron apontou, o primeiro passo para fazer isso é escrever um módulo que substitua o LayoutProcessor. Eu já fiz isso com sucesso, mas ainda assim a lógica de escolher o endereço de cobrança igual ao endereço de entrega não está correta. Além disso, não tenho certeza se todo o processo funcionará. Pelo menos eu posso continuar no caixa, mas não tenho certeza sobre os efeitos colaterais até agora.
steros

Respostas:

11

Como Aaron apontou, o formulário é adicionado Magento/Checkout/Block/Checkout/LayoutProcessor.php. Com essas informações, desenvolvi um módulo com um plug-in posterior que se conecta ao processador:

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

Isso reordena com êxito o formulário de endereço de cobrança (e, com sorte, salva algumas dores de cabeça para outras pessoas). Mas ainda há trabalho necessário no javascript (?) Que lida com o billing address is the same as shipping addressmecanismo. Como isso ainda funciona da maneira "padrão".

Informação adicional:

Vi que no back-end, se você criar um novo pedido, o layout será exatamente o desejado. O formulário de cobrança é "antes" do formulário de remessa e a lógica também é inversa. Se eu conseguir encontrar o tempo, acho que pode ser benéfico olhar para o código lá. Talvez seja possível usá-lo também no frontend.

steros
fonte
O espaço para nome não deve ser um espaço para nome <vendor>\ReorderBillingForm\Block\Checkout;?
Frank Groot
2
Não tenho certeza. Corri para problemas de cache (mais uma vez) parece. Às vezes não funcionava, às vezes funcionava. Eu reescrevi o módulo e agora ele funciona o tempo todo. Era importante usar aroundProcess. Eu atualizei minha postagem.
steros
Obrigado por atualizar sua resposta, mas eu recebo o seguinte erroNotice: Undefined index: billing-address-form in LayoutProcessorPlugin.php:20
Frank Groot
Hmm estranho, eu não entendo isso. Mas você pode verificar como o $ jsLayout é estruturado por depuração. Não tenho uma instância em execução no momento. Se eu configurar outro, tentarei descobrir qual pode ser o problema.
steros
Você já atualizou a resposta? você ainda está usando afterProcess, não em torno de Processo @DarsVaeda Nós estamos usando a sua solução, mas têm o endereço Billign no Passo pagamento ainda aparecendo
Alex
0

O erro Undefined index: billing-address-formno LayoutProcessorPlugin.phpocorre quando você tem o check-out propriedade "Display Endereço de Cobrança On " definido como " Método de Pagamento " em vez de " Pagamento Página ".

Corrigir com:

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

Eu teria preferido adicionar isso como um comentário ao post do DarsVaedas (veja acima), mas não tenho permissão…

digijay
fonte
obrigado @jaybong por adicionar a instrução sql para corrigir isso!
digijay 26/03