Eu tenho um campo de seleção que tem algumas opções. Um deles terá alguns campos dependentes do valor, outro campo será oculto. Copiei e estendi o componente js para o meu campo, mas não funcionou ou fiz errado. O componente da interface do usuário suporta esse recurso? Como eu posso conseguir isso?
Abaixo está o que eu fiz:
<field name="field1">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Namespace\ModuleName\Model\Config\Source\Options</item>
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Field name</item>
<item name="visible" xsi:type="boolean">true</item>
<item name="dataType" xsi:type="string">number</item>
<item name="formElement" xsi:type="string">select</item>
<item name="source" xsi:type="string">item</item>
<item name="dataScope" xsi:type="string">field1</item>
<item name="component" xsi:type="string">Pathto/js/form/element/options</item>
<item name="validation" xsi:type="array">
<item name="required-entry" xsi:type="boolean">true</item>
</item>
</item>
</argument>
</field>
<field name="field2Depend1"></field>
<field name="field3Depend1"></field>
jsComponent js/form/element/options
:
define([
'underscore',
'uiRegistry',
'Magento_Ui/js/form/element/select',
'Magento_Ui/js/modal/modal'
], function (_, uiRegistry, select) {
'use strict';
return select.extend({
onChange: function () {
this.enableDisableFields();
},
/**
* Enable/disable fields on Coupons tab
*/
enableDisableFields: function () {
// code check field
}
});
});
fonte
initialize
método no seu caso, porque o ui-element não temonLoad
método. Você pode obter qualquer valor de campo em qualquer lugar a partir do registo utilizando a chave de índice de entrada:uiRegistry.get('index = field1')
. Caso você tenha mais perguntas, entre em contato no skype (sarj1989), será mais fácil se comunicar em russo.A solução sugerida pelo Magentix gera um erro de tempos em tempos ao usar o initialize. Depende do tempo que leva para o seu navegador renderizar os componentes. Para corrigi-lo, você pode usar o setTimeout.
Veja o código abaixo:
fonte
Esta é uma pergunta antiga com várias respostas que funcionam, no entanto, descobri uma solução usando o que o Magento fornece (a partir do 2.1.0) sem a necessidade de estender os componentes. Como várias perguntas foram marcadas como duplicadas e direcionadas aqui, pensei que seria benéfico fornecer algumas informações sobre essa opção.
Todos os componentes da interface do usuário do elemento de formulário que se estendem
Magento_Ui/js/form/element/abstract.js
têm umaswitcherConfig
configuração disponível para fins como ocultar / mostrar elementos, além de outras ações. Oswitcher
componente pode ser encontrado em Magento_Ui / js / form / switcher para os curiosos. Você pode encontrar exemplos de ele ser usado em sales_rule_form.xml e catalog_rule_form.xml . Obviamente, se você já estiver usando seu próprio componente personalizado, ainda poderá usá-lo, desde que o componente se estenda, oabstract
que parece ser o caso, com base no código de exemplo fornecido na pergunta.Agora, veja um exemplo mais específico para responder à pergunta original.
Em
Namespace/ModuleName/view/adminhtml/ui_component/your_entity_form.xml
você simplesmente precisa adicionar o seguinte ao do camposettings
que faz o controle (ou seja, o campo que determina os campos estão escondidas / visível). No seu exemplo, isso seriafield1
.Vamos dividir um pouco. O
switcher
componente contém uma matriz dorules
que estamos construindo aqui. Cada<rule>
um tem um nome que é um número neste exemplo. Este nome é a chave / índice da matriz para este item. Estamos usando números como índices de matriz.Strings devem funcionar também, mas eu não testei essa teoria. ATUALIZAÇÃO - Conforme mencionado por @ChristopheFerreboeuf nos comentários, as strings não funcionam aqui. Essas são matrizes e devem começar com0
, não cadeias ou 1.Dentro de cada um
rule
, passamos dois argumentos.value
- Este é o valor dofield1
qual deve disparar oactions
definido abaixo.actions
- Aqui temos outra matriz. Estas são as ações a serem acionadas quando as condições desta regra forem atendidas. Novamente,action
o nome de cada um é apenas o índice / chave da matriz desse item.Agora, cada um
action
tem dois argumentos também (com um terceiro opcional).target
- Este é o elemento que você deseja manipular sob esta ação. Se você não está familiarizado com a forma como os nomes dos elementos ui_component são compostos no Magento, consulte o artigo de Alan Storm . É basicamente algo como{component_name}.{component_name}.{fieldset_name}.{field_name}
neste exemplo.callback
- Aqui está a ação a ser tomada sobre o mencionado acimatarget
. Esse retorno de chamada deve ser uma função disponível no elemento de destino. Nosso exemplo usahide
eshow
. É aqui que você pode começar a expandir a funcionalidade disponível. Ocatalog_rule_form.xml
exemplo que mencionei anteriormente usasetValidation
se você deseja ver um exemplo diferente.<params>
a qualquer umaction
que pedir por eles. Você pode ver isso nocatalog_rule_form.xml
exemplo também.Finalmente, o último item dentro
switcherConfig
é<enabled>true</enabled>
. Isso deve ser bem simples: é um booleano ativar / desativar a funcionalidade do comutador que acabamos de implementar.E nós terminamos. Então, usando o exemplo acima que você deve ver é o campo
field2Depend1
exibido se você escolher uma opção com valor2
emfield1
efield3Depend1
exibida se você escolher uma opção com valor3
.Testei este exemplo usando apenas
hide
eshow
em um campo obrigatório e parece levar em consideração a visibilidade para validação. Em outras palavras, sefield2Depend1
for necessário, será necessário apenas quando visível. Não há necessidade de configuração adicional para que isso funcione.Espero que isso ofereça alguma ajuda para quem procura uma solução mais pronta para uso.
fonte
Há muitas respostas para essa pergunta, mas a maioria delas faz suposições sobre se o uiRegistry está totalmente carregado ou usa
setTimeout
para limpar a pilha de chamadas e aguarda o próximo loop de evento (que, na minha opinião, ainda é o caminho errado) faça - já que você não pode ter certeza de quando os outros componentes da interface do usuário foram carregados - me corrija se eu estiver errado).Primeiramente, é claro, adicione seu componente JS personalizado à configuração do campo (consulte outras respostas para obter detalhes):
Então, aqui está o componente de interface do usuário personalizado que oculta ou mostra os campos dependentes - com comentários para explicar o que está acontecendo.
fonte
Se você tiver um erro como
Field is Undefined
quando a visibilidade do campo foi inicializada, usesetTimeout()
para carregar os campos dependentes:fonte
uiRegistry.get('q', function(field) { ... }));
Componente personalizado com init:
fonte
setTimeout()
emfieldDepend()
causa dependia não é carregado ainda.Apenas no caso de alguém ter problemas com a solução Erfan , é necessário passar o caminho completo para os campos
dependentFieldNames
, por exemplo:Não sei por que o form_name deve ser 2 vezes, mas isso funcionou para mim.
Para depurar isso, coloquei
console.log(query);
nastatic/adminhtml/Magento/backend/en_US/Magento_Ui/js/lib/registry/registry.js
223ª linha (a função get () logo antesthis._addRequest(query, callback)
)fonte
Existem algumas maneiras de lidar com dependências de campo, para uma lista suspensa Sim / Não simples, uma caixa de seleção ou um comutador, você pode usar as propriedades de vinculação
imports
ouexports
no Magento 2. A solução é discutida em detalhes aqui: Campos dependentes nos formulários de componentes de interface do usuário no Magento 2 sem Javascript para campos booleanos :Para manipular outros tipos de valores, como dependência de uma lista de valores em uma lista suspensa ou, embora improvável, o valor de um campo de entrada, você pode usar o
switcherConfig
. Verifique os campos dependentes nos formulários ui-component no Magento 2 sem Javascript para obter informações.As 2 regras acima, lidam com praticamente tudo usando a configuração XML. Para regras mais complexas, você também pode usar JavaScript.
Cada campo no formulário de componente da interface do usuário é um componente que pode ser estendido usando o
component
atributo para o<field component="path to your js" ...>...</field>
. Em seguida, você pode usar o campodata.config
para passar mais informações ao componente, caso o componente seja genérico e reutilizado em vários locais, combinado com oimports
ouexports
propriedade link para transmitir valores a métodos ou objetos observáveis.Para obter mais informações sobre as propriedades de vinculação, verifique as propriedades de vinculação dos componentes da interface do usuário.
fonte