Jak zrobić pole formularza tylko do odczytu przy użyciu komponentów interfejsu użytkownika?

10

Mam definicję pola formularza w komponencie interfejsu użytkownika w moim module Magento 2.

    <field name="name">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="dataType" xsi:type="string">text</item>
                <item name="label" xsi:type="string" translate="true">Some Label</item>
                <item name="formElement" xsi:type="string">input</item>
                <item name="source" xsi:type="string">something_here</item>
                <item name="sortOrder" xsi:type="number">10</item>
                <item name="dataScope" xsi:type="string">name</item>
                <item name="notice" xsi:type="string" translate="true">Enter something here</item>
                <item name="validation" xsi:type="array">
                    <item name="required-entry" xsi:type="boolean">true</item>
                </item>
            </item>
        </argument>
    </field>

i próbuję zrobić to tylko do odczytu. Nie wyłączony Tylko do odczytu.
Próbowałem dodać:

<item name="readonly" xsi:type="boolean">true</item>  

do sekcji konfiguracji, ale oczywiście mi się nie udało.
Jak mogę zrobić pole tylko do odczytu? Czy mogę zrobić pole tylko do odczytu?

Marius
źródło
Jaka jest różnica między parametrami „wyłączony” i „tylko do odczytu”? Moim zdaniem oba parametry działają w podobny sposób.
Siarhey Uchukhlebau
1
Z tego co wiem, wyłączone oznacza, że ​​pole nie jest wysyłane pocztą i tylko do odczytu. Mój plan polega na zmodyfikowaniu wartości pola tylko do odczytu za pomocą jakiegoś javascript.
Marius
Jasne, ale w zwykłej formie magento (nie interfejsu użytkownika) atrybut „tylko do odczytu” oznacza atrybut html „wyłączony”. W inny sposób powinieneś użyć niestandardowego komponentu lub niestandardowego skryptu, ponieważ atrybut „tylko do odczytu” nie istnieje dla komponentów interfejsu użytkownika.
Siarhey Uchukhlebau
Po prostu trzymam się twojej odpowiedzi. Mam tylko nadzieję, że nie muszę w przyszłości wyłączać pola.
Marius
Pozostaw formElement jako dane wejściowe i dodaj element tekstowy taki jak <item name = "elementTmpl" xsi: type = "string"> ui / form / element / text </item> Patrz: magento.stackexchange.com/a/296735/14271
Magento_Newbie

Odpowiedzi:

18

Spróbuj dodać disabledparametr do elementu w następujący sposób:

<field name="is_active">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="label" xsi:type="string">Status</item>
            <item name="dataType" xsi:type="string">number</item>
            <item name="formElement" xsi:type="string">checkbox</item>
            <item name="source" xsi:type="string">vendor_rules_rule_form.vendor_rules_rule_form_data_source.is_active</item>
            <item name="prefer" xsi:type="string">toggle</item>
            <item name="disabled" xsi:type="boolean">true</item>
            <item name="valueMap" xsi:type="array">
                <item name="true" xsi:type="string">1</item>
                <item name="false" xsi:type="string">0</item>
            </item>
            <item name="sortOrder" xsi:type="number">12</item>
        </item>
    </argument>
</field>

Wynik powinien być podobny do readonlyparametru dla zwykłego elementu formularza:

wynik

Siarhey Uchukhlebau
źródło
1
Jestem zaskoczony. to działa, ale dla mnie wygląda źle. Jeśli pole jest wyłączone, dlaczego nadal wysyłane jest za pośrednictwem POST? W każdym razie to inne pytanie. Na razie wezmę to za pewnik.
Marius
5
@Marius Jest to najprawdopodobniej dlatego, że gdy formularz jest przesyłany z backendu, nie jest to faktyczny formularz, który jest przesyłany, ale nowy formularz z ukrytymi polami, który jest tworzony po kliknięciu przycisku Zapisz. Formularz jest tworzony zgodnie z polami w pliku XML składników interfejsu użytkownika i polami oznaczonymi data-form-part. Przyjrzeć module-ui/view/base/web/js/form/form.js::initConfig(), validate()i submit(). Zobacz także lib/mage/utils/misc.js::submit(). Te połączone dodają nowy formularz na końcu faktycznie przesłanego formularza.
Giel Berkers
@GielBerkers. Przeprowadziłem badania po zadaniu tego pytania i doszedłem do tego samego wniosku, co wyjaśniłeś. Masz rację. Przesłane dane nie pochodzą z formularza.
Marius
Mam również ten sam problem jak w przypadku .. Chcę włączyć pole ceny dla konfigurowalnego produktu .. Tutaj wyjaśniłem link
Gopal Kacha
@Marius, Jak zrobić pole disabledtylko w formularzu edycji, a nie w nowym formularzu?
Vinaya Maheshwari,