J'ai un choix de champ qui a quelques options. L'un d'eux aura certains champs dépendants de la valeur, un autre champ sera masqué. J'ai copié et étendu le composant js pour mon domaine mais cela n'a pas fonctionné ou je l'ai mal fait. Le composant Ui prend en charge cette fonctionnalité? Comment puis-je y parvenir?
Voici ce que j'ai fait:
<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
}
});
});
la source
initialize
méthode dans votre cas car ui-element n'a pas deonLoad
méthode. Vous pouvez obtenir une valeur de champ en tout lieu du registre en utilisant l'index entrée clé:uiRegistry.get('index = field1')
. Si vous avez plus de questions, veuillez m'adresser via skype (sarj1989), il sera plus facile de communiquer en russe.La solution suggérée par Magentix générera de temps en temps une erreur lors de l'utilisation de l'initialisation. Cela dépend du temps nécessaire à votre navigateur pour rendre les composants. Pour y remédier, vous pouvez utiliser setTimeout.
Voir le code ci-dessous:
la source
C'est une vieille question avec plusieurs réponses qui fonctionnent, mais j'ai découvert une solution utilisant ce que Magento fournit (à partir de 2.1.0) sans avoir besoin d'étendre les composants. Comme plusieurs questions ont été marquées comme étant en double et dirigées ici, j'ai pensé qu'il serait utile de fournir des informations sur cette option.
Tous les composants ui de l'élément de formulaire qui s'étendent
Magento_Ui/js/form/element/abstract.js
ont unswitcherConfig
paramètre disponible à des fins telles que le masquage / affichage des éléments ainsi que d'autres actions. Leswitcher
composant peut être trouvé sur Magento_Ui / js / form / switcher pour les curieux. Vous pouvez en trouver des exemples dans sales_rule_form.xml et catalog_rule_form.xml . Bien sûr, si vous utilisez déjà votre propre composant personnalisé, vous pouvez toujours l'utiliser aussi longtemps que votre composant s'étend finalement,abstract
ce qui semble être le cas en fonction de l'exemple de code fourni dans la question.Maintenant, pour un exemple plus spécifique pour répondre à la question d'origine.
Dans,
Namespace/ModuleName/view/adminhtml/ui_component/your_entity_form.xml
vous devez simplement ajouter ce qui suit aux champssettings
qui font le contrôle (c'est-à-dire le champ qui détermine quels champs sont masqués / visibles). Dans votre exemple, ce seraitfield1
.Décomposons-le un peu. Le
switcher
composant contient un tableaurules
dont nous construisons ici. Chacun<rule>
a un nom qui est un nombre dans cet exemple. Ce nom est la clé / l'index du tableau pour cet élément. Nous utilisons des nombres comme index de tableau.Les cordes devraient aussi fonctionner mais je n'ai pas testé cette théorie. MISE À JOUR - Comme mentionné par @ChristopheFerreboeuf dans les commentaires, les chaînes ne fonctionnent pas ici. Ce sont des tableaux et doivent commencer par0
, pas des chaînes ou 1.À l'intérieur de chacun,
rule
nous passons deux arguments.value
- C'est la valeurfield1
qui doit déclencher laactions
définition ci-dessous.actions
- Ici, nous avons un autre tableau. Ce sont les actions à déclencher lorsque les conditions de cette règle sont remplies. Encore une fois,action
le nom de chacun n'est que l'index / la clé du tableau de cet élément.Maintenant, chacun
action
a également deux arguments (avec un 3e optionnel).target
- C'est l'élément que vous souhaitez manipuler dans le cadre de cette action. Si vous ne savez pas comment les noms des éléments ui_component sont composés dans Magento, vous pouvez consulter l'article d'Alan Storm . C'est fondamentalement quelque chose comme{component_name}.{component_name}.{fieldset_name}.{field_name}
dans cet exemple.callback
- Voici les mesures à prendre dans ce qui précèdetarget
. Ce rappel doit être une fonction disponible sur l'élément ciblé. Notre exemple utilisehide
etshow
. C'est là que vous pouvez commencer à développer les fonctionnalités disponibles. L'catalog_rule_form.xml
exemple que j'ai mentionné plus haut utilisesetValidation
si vous souhaitez voir un autre exemple.<params>
à tout ceaction
qui les appelle. Vous pouvez également le voir dans l'catalog_rule_form.xml
exemple.Enfin, le dernier élément à l'intérieur
switcherConfig
est<enabled>true</enabled>
. Cela devrait être assez simple, c'est un booléen pour activer / désactiver la fonctionnalité de commutateur que nous venons d'implémenter.Et nous avons terminé. Donc , en utilisant l'exemple ci - dessus ce que vous devriez voir est le champ
field2Depend1
affiché si vous choisissez une option avec une valeur2
surfield1
, etfield3Depend1
affiché si vous choisissez une option avec la valeur3
.J'ai testé cet exemple en utilisant uniquement
hide
etshow
sur un champ obligatoire et il semble prendre en compte la visibilité pour la validation. En d'autres termes, sifield2Depend1
nécessaire, il ne sera requis que lorsqu'il sera visible. Pas besoin de configuration supplémentaire pour que cela fonctionne.J'espère que cela fournira de l'aide à tous ceux qui recherchent une solution plus prête à l'emploi.
la source
Il y a beaucoup de réponses à cette question, mais la plupart d'entre elles font des hypothèses sur si l'uRegistry est complètement chargé, ou utilisent
setTimeout
pour effacer la pile d'appels, et attendre la prochaine boucle d'événements (qui à mon avis est toujours la mauvaise façon de faites-le - puisque vous ne pouvez pas être sûr quand les autres composants de l'interface utilisateur ont été chargés - corrigez-moi si je me trompe).Tout d'abord, bien sûr, ajoutez votre composant JS personnalisé à la configuration du champ (voir les autres réponses pour plus de détails):
Ensuite, voici le composant d'interface utilisateur personnalisé qui masque ou affiche les champs dépendants - avec des commentaires pour expliquer ce qui se passe.
la source
Si vous avez une erreur comme
Field is Undefined
lors de l'initialisation de la visibilité des champs, utilisezsetTimeout()
pour charger les champs dépendants:la source
uiRegistry.get('q', function(field) { ... }));
Composant personnalisé avec init:
la source
setTimeout()
dansfieldDepend()
car dépendu n'est pas encore chargé.Juste au cas où quelqu'un se débat avec la solution Erfan , vous devez passer le chemin complet vers les champs
dependentFieldNames
, par exemple:Je ne sais pas pourquoi form_name doit être 2 fois, mais cela a fonctionné pour moi.
Pour déboguer cela, je mets
console.log(query);
enstatic/adminhtml/Magento/backend/en_US/Magento_Ui/js/lib/registry/registry.js
223e ligne (la fonction get () juste avantthis._addRequest(query, callback)
)la source
Il existe plusieurs façons de gérer les dépendances de champs, pour une simple liste déroulante Oui / Non, une case à cocher ou un commutateur, vous pouvez utiliser les propriétés de liaison
imports
ouexports
dans Magento 2. La solution est discutée en détail ici: Champs dépendants dans les formulaires de composants d'interface utilisateur dans Magento 2 sans Javascript pour les champs booléens :Pour gérer d'autres types de valeurs telles que la dépendance à une liste de valeurs dans une liste déroulante ou bien que peu probable, une valeur d'un champ de saisie, vous pouvez utiliser le
switcherConfig
. Vérifiez les champs dépendants dans les formulaires à composants ui dans Magento 2 sans Javascript pour plus d'informations.Les 2 règles ci-dessus gèrent à peu près tout en utilisant la configuration XML. Pour des règles plus complexes, vous pouvez également utiliser JavaScript.
Chaque champ dans la forme de composant d'interface utilisateur est un composant qui peut être étendu à l'aide de l'
component
attribut pour le<field component="path to your js" ...>...</field>
. Vous pouvez ensuite utiliser le champdata.config
pour transmettre plus d'informations au composant, au cas où le composant est générique et est réutilisé à plusieurs endroits, combiné avec la propriétéimports
ouexports
lien pour transmettre des valeurs à des observables ou à des méthodes.Pour plus d'informations sur les propriétés de liaison, vous pouvez vérifier les propriétés de liaison des composants d'interface utilisateur
la source