Mam jedno pole, które ma kilka opcji. Jedno z nich będzie miało pola zależne od wartości, inne będą ukryte. Skopiowałem i rozszerzyłem js komponentu dla mojego pola, ale to nie działało lub zrobiłem to źle. Składnik interfejsu użytkownika obsługuje tę funkcję? Jak mogę to osiągnąć?
Poniżej zrobiłem:
<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
}
});
});
źródło
initialize
metody w twoim przypadku, ponieważ element interfejsu użytkownika nie maonLoad
metody. Można dostać żadnej wartości pola w dowolnym miejscu z rejestru przy użyciu klucza indeksu wejściowego:uiRegistry.get('index = field1')
. W przypadku dodatkowych pytań proszę o kontakt w skype (sarj1989). Łatwiej będzie komunikować się w języku rosyjskim.Rozwiązanie sugerowane przez Magentix od czasu do czasu generuje błąd podczas inicjalizacji. Zależy to od czasu renderowania komponentów przez przeglądarkę. Aby to naprawić, możesz użyć setTimeout.
Zobacz poniższy kod:
źródło
To stare pytanie z wieloma odpowiedziami, które działają, ale znalazłem rozwiązanie wykorzystujące to, co zapewnia Magento (od wersji 2.1.0), bez potrzeby rozszerzania komponentów. Ponieważ wiele pytań zostało oznaczonych jako duplikaty i skierowanych tutaj, pomyślałem, że dobrze byłoby podać informacje na temat tej opcji.
Wszystkie rozszerzane elementy interfejsu użytkownika elementu formularza
Magento_Ui/js/form/element/abstract.js
mająswitcherConfig
ustawienie dostępne do takich celów, jak ukrywanie / wyświetlanie elementów, a także innych działań.switcher
Składnik można znaleźć w Magento_Ui / js / / postać przełącznika do ciekawy. Przykłady tego można znaleźć w pliku sales_rule_form.xml i catalog_rule_form.xml . Oczywiście, jeśli używasz już własnego niestandardowego komponentu, możesz go nadal używać, dopóki komponent ostatecznie się rozszerzy,abstract
co wydaje się być przypadkiem na podstawie przykładowego kodu podanego w pytaniu.Teraz bardziej konkretny przykład odpowiedzi na pierwotne pytanie.
W
Namespace/ModuleName/view/adminhtml/ui_component/your_entity_form.xml
wystarczy po prostu dodać do pola,settings
które kontroluje (tj. Pole, które określa, które pola są ukryte / widoczne). W twoim przykładzie byłoby tofield1
.Rozwalmy to trochę.
switcher
Składnik zawiera tablicęrules
, która jest co budujemy tutaj. Każdy<rule>
ma nazwę, która jest liczbą w tym przykładzie. Ta nazwa to klucz / indeks tablicy dla tego elementu. Używamy liczb jako indeksów tablic.Ciągi też powinny działać, ale nie przetestowałem tej teorii. AKTUALIZACJA - Jak wspomniano w @ChristopheFerreboeuf w komentarzach, ciągi znaków nie działają tutaj. Są to tablice i powinny zaczynać się od0
, a nie ciągów znaków lub 1.Wewnątrz każdego
rule
przekazujemy dwa argumenty.value
- Jest to wartość,field1
która powinna uruchomićactions
zdefiniowaną poniżej.actions
- Tutaj mamy kolejną tablicę. Są to akcje, które zostaną uruchomione, gdy zostaną spełnione warunki tej reguły. Ponownie,action
nazwa każdego z nich jest tylko indeksem / kluczem tablicy tego elementu.Teraz każdy
action
ma również dwa argumenty (z opcjonalnym trzecim).target
- To jest element, którym chcesz manipulować w ramach tej akcji. Jeśli nie jesteś zaznajomiony ze sposobem tworzenia nazw elementów ui_component w Magento, możesz przeczytać artykuł Alana Storma . Zasadniczo jest to jak{component_name}.{component_name}.{fieldset_name}.{field_name}
w tym przykładzie.callback
- Oto działania, które należy podjąć w odniesieniu do wyżej wymienionychtarget
. To wywołanie zwrotne powinno być funkcją dostępną dla elementu docelowego. W naszym przykładzie użytohide
ishow
. W tym miejscu możesz zacząć rozszerzać dostępne funkcje.catalog_rule_form.xml
Przykład wspomniałem wcześniej zastosowaniasetValidation
, jeśli chcesz zobaczyć inny przykład.<params>
do każdegoaction
, kto do nich wzywa. Możesz to również zobaczyć wcatalog_rule_form.xml
przykładzie.Wreszcie ostatni element wewnątrz
switcherConfig
jest<enabled>true</enabled>
. Powinno to być dość proste, bo logiczne jest włączenie / wyłączenie właśnie zaimplementowanej funkcji przełącznika.I skończyliśmy. Więc korzystając z przykładu powyżej, co powinieneś zobaczyć to pole
field2Depend1
wyświetlane w przypadku wybrania opcji z wartości2
nafield1
ifield3Depend1
wyświetlona, jeśli wybierzesz opcję za pomocą wartości3
.Ja testowałem ten przykład przy użyciu tylko
hide
ishow
na wymaganym zakresie i wydaje się, aby wziąć pod uwagę widoczność do walidacji. Innymi słowy, jeślifield2Depend1
jest wymagany, będzie wymagany tylko wtedy, gdy będzie widoczny. Nie ma potrzeby dalszej konfiguracji, aby to działało.Mam nadzieję, że zapewnia to pomoc każdemu, kto szuka bardziej gotowego rozwiązania.
źródło
Istnieje wiele odpowiedzi na to pytanie, ale większość z nich przyjmuje albo założenia, czy uiRegistry jest w pełni załadowana, albo używa
setTimeout
do wyczyszczenia stosu wywołań i czeka na następną pętlę zdarzeń (co moim zdaniem jest nadal niewłaściwym sposobem na zrób to - ponieważ nie możesz być pewien, kiedy załadowane zostały inne elementy interfejsu - popraw mnie, jeśli się mylę).Po pierwsze, oczywiście dodaj swój niestandardowy komponent JS do konfiguracji pola (szczegóły znajdziesz w innych odpowiedziach):
Oto niestandardowy składnik interfejsu użytkownika, który ukrywa lub pokazuje pola zależne - z komentarzami wyjaśniającymi, co się dzieje.
źródło
Jeśli wystąpił błąd, np.
Field is Undefined
Podczas inicjalizacji widoczności pola, użyj,setTimeout()
aby załadować pola zależne:źródło
uiRegistry.get('q', function(field) { ... }));
Komponent niestandardowy z init:
źródło
setTimeout()
w,fieldDepend()
ponieważ zależny nie jest jeszcze załadowany.Istnieje kilka sposobów radzenia sobie z zależnościami pól, dla prostego menu rozwijanego Tak / Nie, pola wyboru lub przełącznika, możesz użyć właściwości
imports
lubexports
łączenia właściwości w Magento 2. Rozwiązanie zostało szczegółowo omówione tutaj: Pola zależne w formularzach komponentów interfejsu użytkownika w Magento 2 bez Javascript dla pól boolowskich :Aby obsłużyć inne typy wartości, takie jak zależność od listy wartości w menu rozwijanym lub, choć mało prawdopodobne, wartość pola wejściowego, możesz użyć
switcherConfig
. Aby uzyskać informacje, sprawdź pola Zależne w formularzach interfejsu użytkownika w Magento 2 bez Javascript .Powyższe 2 reguły obsługują prawie wszystko za pomocą konfiguracji XML. W przypadku bardziej skomplikowanych reguł możesz także użyć JavaScript.
Każde pole w formularzu komponentu interfejsu użytkownika jest komponentem, który można rozszerzyć za pomocą
component
atrybutu dla<field component="path to your js" ...>...</field>
. Następnie możesz użyć tego pola,data.config
aby przekazać więcej informacji do komponentu, na wypadek gdyby komponent był ogólny i został ponownie użyty w wielu miejscach, w połączeniu z właściwościąimports
lubexports
łączącą właściwość w celu przekazania wartości do obserwowalnych lub metod.Aby uzyskać więcej informacji na temat właściwości łączenia, możesz sprawdzić Właściwości łączenia składników interfejsu użytkownika
źródło
Na wypadek, gdyby ktoś miał problem z rozwiązaniem Erfan , musisz podać pełną ścieżkę do pól
dependentFieldNames
, np .:Nie jestem pewien, dlaczego nazwa_formy musi być 2 razy, ale to zadziałało dla mnie.
Aby to debugować, umieściłem
console.log(query);
wstatic/adminhtml/Magento/backend/en_US/Magento_Ui/js/lib/registry/registry.js
223 linii (funkcja get () tuż przedthis._addRequest(query, callback)
)źródło