Как сделать поле формы доступным только для чтения с помощью ui-компонентов?

10

У меня есть это UI-компонент определения поля формы в моем модуле 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>

и я пытаюсь сделать это только для чтения. Не отключен Просто только для чтения.
Я попытался добавить:

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

в разделе конфигурации, но, очевидно, я не смог.
Как сделать поле доступным только для чтения? Можно ли сделать поле доступным только для чтения?

Мариус
источник
Какая разница между параметрами «отключен» и «только для чтения»? На мой взгляд, оба параметра работают одинаково.
Сергей Учухлебау
1
Из того, что я знаю, отключено означает, что поле не отправляется по почте и отправляется только для чтения. Мой план состоит в том, чтобы изменить значение поля только для чтения с помощью некоторого JavaScript.
Мариус
Конечно, но в обычной форме magento (не ui) атрибут «readonly» означает html-атрибут «disabled». Другим способом вы должны использовать пользовательский компонент или пользовательский скрипт, потому что атрибут «только для чтения» не существует для компонентов пользовательского интерфейса.
Сергей Учухлебау
Я просто собираюсь придерживаться вашего ответа сейчас. Я просто надеюсь, что мне не нужно отключать поле в будущем.
Мариус
Оставьте formElement в качестве входных данных и добавьте text elementTmpl следующим образом: <item name = "elementTmpl" xsi: type = "string"> ui / form / element / text </ item> См. Magento.stackexchange.com/a/296735/14271
Magento_Newbie

Ответы:

18

Попробуйте добавить disabledпараметр в элемент следующим образом:

<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>

Результат должен быть похож на readonlyпараметр для обычного элемента формы:

результат

Сергей Учухлебау
источник
1
Я озадачен здесь. это работает, но это выглядит неправильно для меня. Если поле отключено, почему пришло все еще отправлено через POST? Во всяком случае, это другой вопрос. Я приму это как должное на данный момент.
Мариус
5
@Marius Это наиболее вероятно, потому что когда форма отправляется из бэкэнда, отправляется не фактическая форма, а новая форма со скрытыми полями, которая создается при нажатии кнопки «Сохранить». Форма создается в соответствии с полями в вашем XML-файле компонентов пользовательского интерфейса и полями, отмеченными значком data-form-part. Посмотрите module-ui/view/base/web/js/form/form.js::initConfig(), validate()и submit(). Также посмотрите на lib/mage/utils/misc.js::submit(). Все вместе они добавляют новую форму в конце тела, которое фактически отправлено.
Giel Berkers
@GielBerkers. Я провел некоторое исследование после того, как задал этот вопрос, и пришел к тому же выводу, что и вы. Вы правы. Представленные данные не приходят из формы.
Мариус
У меня тоже должен быть такой же вопрос .. Я хочу включить поле цены для конфигурируемого продукта .. Здесь я объяснил ссылку
Gopal Kacha
@Marius, как сделать поле disabledтолько в форме редактирования, а не в новой?
Виная Махешвари,