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 uma switcherConfig
configuração disponível para fins como ocultar / mostrar elementos, além de outras ações. O switcher
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, o abstract
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 campo settings
que faz o controle (ou seja, o campo que determina os campos estão escondidas / visível). No seu exemplo, isso seria field1
.
<field name="field1">
<argument name="data" xsi:type="array">
...
</argument>
<settings>
<switcherConfig>
<rules>
<rule name="0">
<value>2</value>
<actions>
<action name="0">
<target>your_entity_form.your_entity_form.entity_information.field2Depend1</target>
<callback>show</callback>
</action>
<action name="1">
<target>your_entity_form.your_entity_form.entity_information.field3Depend1</target>
<callback>hide</callback>
</action>
</actions>
</rule>
<rule name="1">
<value>3</value>
<actions>
<action name="0">
<target>your_entity_form.your_entity_form.entity_information.field2Depend1</target>
<callback>hide</callback>
</action>
<action name="1">
<target>your_entity_form.your_entity_form.entity_information.field3Depend1</target>
<callback>show</callback>
</action>
</actions>
</rule>
</rules>
<enabled>true</enabled>
</switcherConfig>
</settings>
</field>
Vamos dividir um pouco. O switcher
componente contém uma matriz do rules
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 com 0
, não cadeias ou 1.
Dentro de cada um rule
, passamos dois argumentos.
value
- Este é o valor do field1
qual deve disparar o actions
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 acima target
. Esse retorno de chamada deve ser uma função disponível no elemento de destino. Nosso exemplo usa hide
e show
. É aqui que você pode começar a expandir a funcionalidade disponível. O catalog_rule_form.xml
exemplo que mencionei anteriormente usa setValidation
se você deseja ver um exemplo diferente.
- Você também pode adicionar
<params>
a qualquer um action
que pedir por eles. Você pode ver isso no catalog_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 valor 2
em field1
e field3Depend1
exibida se você escolher uma opção com valor 3
.
Testei este exemplo usando apenas hide
e show
em um campo obrigatório e parece levar em consideração a visibilidade para validação. Em outras palavras, se field2Depend1
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.