Todos os tutoriais estão cobrindo apenas a adição de campos, mas o valor de salvamento desses arquivos é ignorado #mindblown. Não sei por que, é a parte mais importante da adição de qualquer campo ou formulário.
Eu tentei seguir os documentos do Magento , mas ... é uma merda.
Para fins de teste, tento adicionar outros campos ao endereço de entrega, apenas para ignorar escopos personalizados, conjuntos de dados personalizados, provedores de dados personalizados e outras coisas não documentadas, o que parece muito estranho para mim.
Não tenho idéia do que significa que o formulário é "estático" ou "dinâmico". Para mim, todos os formulários de checkout são construídos dinamicamente sobre os modelos do KnockoutJS, mas ... quando tento o modo "estático", sou capaz de adicionar entradas aqui (por isso é um formulário estático ou não?).
Primeiro, tento depurar por que os observáveis do Knockout simplesmente ignoram meus campos durante a análise e o envio de dados. Descobri que meus campos têm name
parâmetro vazio , mas não consigo gerenciar uma maneira de corrigir esse problema. Na IMO, ele deve ser passado para o renderizador do componente da interface do usuário por meio de inputName
parâmetro, o mesmo que outras opções disabled
, placeholder
etc. (outros parâmetros funcionam bem, verifiquei a configuração gerada a partir do meu XML para a inicialização do módulo de checkout e fica bem para mim)
Segundo, tentei usar o modo "dinâmico" com a criação de plug-in LayoutProcessor
e a transmissão exatamente dos mesmos dados ... e agora tenho campos com name
s, mas o envio ainda não funciona.
Depois de pesquisar no JS, descobri que a preparação dessa solicitação é mantida em module-checkout/view/frontend/web/js/model/shipping-save-processor/default.js
arquivo, o que depende de module-checkout/view/frontend/web/js/model/quote.js
onde os observáveis do Knockout são definidos / criados.
De alguma forma, module-checkout/view/frontend/web/js/model/address-converter.js
atualizo esses observáveis e depende de module-checkout/view/frontend/web/js/model/new-customer-address.js
onde finalmente encontrei algumas opções interessantes de configuração - lista de todos os campos de endereço.
Quando adiciono meus campos aqui, os scripts começam a analisar e enviá-los, OFC eu recebo 500, o back-end b / c não os reconhece ... (não pergunte, eu não sou um desenvolvedor de back-end)
Então, aqui estão minhas perguntas:
- É uma maneira correta de lidar com esse tipo de personalização? (b / c parece estranho para mim)
- Como enviar valores de campos não relacionados a novos endereços? Não vi configuração semelhante em nenhum lugar. No meu caso, gostaria de enviar um comentário do pedido (área de texto) e solicitação de fatura (caixa de seleção). Ambos não devem ser salvos como um endereço, porque alguns usuários podem querer salvar esse endereço para uso futuro.
- Existe alguma documentação sobre formulários "estáticos" e "dinâmicos" ou alguns exemplos / comparação? Vale a pena pensar dessa maneira?
Pergunta existencial adicional:
- Por que isso é tão inconsistente? Por que eu tenho que definir vários parâmetros em arquivos XML / PHP, enquanto o Magento pode apenas renderizar uma entrada e então eu tenho que lidar com tudo sozinho?
fonte
Respostas:
Vou tentar responder às suas perguntas.
Não . Esta não é uma maneira correta de adicionar atributos personalizados ao formulário de endereço de entrega. Você não precisa editar
new-customer-address.js
. De fato, esse arquivo JS lista todos os atributos de endereço predefinidos e corresponde à interface de back-end correspondente,\Magento\Quote\Api\Data\AddressInterface
mas o Magento fornece a capacidade de transmitir quaisquer atributos personalizados para o back-end sem modificação dos componentes de back - end / front-end .O componente JS mencionado possui
customAttributes
propriedade. Seus atributos personalizados serão manipulados automaticamente se eles$dataScopePrefix
forem 'shippindAddress.custom_attributes
'.Se entendi sua pergunta corretamente, você tem dados que não fazem parte do endereço do cliente, mas também precisa enviá-los para o back-end. A resposta a esta pergunta é:
Depende . Por exemplo, você pode escolher a seguinte abordagem: adicione formulário personalizado à página de check-out que inclui todos os seus campos extras
(like comment, invoice request etc)
, adicione lógica JS que manipulará esse formulário com base em alguns eventos e forneça um serviço personalizado que receberá os dados do front-end e do armazenamento em algum lugar para uso futuro.Toda a documentação oficial relacionada ao checkout está localizada em http://devdocs.magento.com/guides/v2.1/howdoi/checkout/checkout_overview.html . O termo estático refere-se aos formulários em que todos os campos já são conhecidos / predefinidos (por exemplo: formulário sempre terá 2 campos de texto com rótulos predefinidos) e não podem ser alterados com base em algumas configurações no back-end.
Tais formulários podem ser declarados usando
layout XML configuration
. Por outro lado, termo dinâmico refere-se a formulários cujo conjunto de campos pode mudar (por exemplo: o formulário de checkout pode ter mais / menos campos com base nas definições de configuração).Nesse caso, a única maneira de declarar esse formulário é usar o
LayoutProcessor
plugin.:) O Magento tenta cobrir o maior número possível de casos de uso que possam ser significativos para os comerciantes durante o uso / personalização do Magento possível. Às vezes, isso leva à situação em que alguns casos de uso simples se tornam mais complexos.
Espero que isto ajude.
==================================================== =======================
OK ... Vamos escrever algum código;)
========
Como já mencionei, isso adicionará seu campo à
customAttributes
propriedade do objeto de endereço JS. Esta propriedade foi projetada para conter atributos de endereço EAV personalizados e está relacionada ao\Magento\Quote\Model\Quote\Address\CustomAttributeListInterface::getAttributes
métodoO código acima manipulará automaticamente a persistência de armazenamento local no frontend. Você pode obter o valor do seu campo no armazenamento local usando
checkoutData.getShippingAddressFromData()
(ondecheckoutData
estáMagento_Checkout/js/checkout-data
).========
========
Isso adicionará um atributo de extensão ao endereço do modelo no back-end. Os atributos de extensão são um dos pontos de extensão que o Magento fornece. Para acessar seus dados no back-end, você pode usar:
Espero que isso ajude e será adicionado à documentação oficial.
fonte
custom_attributes
jeito, mas não funciona para mim. É assim que parte do LayoutProcessor.php` se parece - gist.github.com/Igloczek/eaf4d2d7a0a04bd950110296ec3f7727 Masshipping-info
ou mesmo localStoragecheckout-data
não contém esses dados.Na minha experiência, o m2 usa xml para definir componentes como campos, etc. É uma ajuda para depuração, interativa com os dados mais fácil. No campo de front-end, você deve tentar substituir os modelos de check-out e adicionar seus próprios campos personalizados. Com o KO, você pode trabalhar e vincular dados de front-end e back-end
fonte