¿Cómo hacer un campo de formulario de solo lectura usando ui-components?

10

Tengo esta definición de componente ui de un campo de formulario en mi módulo 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>

y estoy tratando de que sea de solo lectura. No desactivado. Solo lectura.
Intenté agregar:

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

a la sección de configuración, pero obviamente fallé.
¿Cómo puedo hacer que el campo sea de solo lectura? ¿Puedo hacer que el campo sea de solo lectura?

Marius
fuente
¿Qué diferencia hay entre los parámetros "deshabilitado" y "solo lectura"? En mi opinión, ambos parámetros funcionan de manera similar.
Siarhey Uchukhlebau
1
Por lo que sé, deshabilitado significa que el campo no se envía por correo y solo se envía. Mi plan es modificar el valor del campo de solo lectura a través de algunos javascript.
Marius
Claro, pero en forma regular de magento (no ui) el atributo "readonly" significa el atributo html "disabled". De otra manera, debe usar un componente personalizado o un script personalizado, porque el atributo "readonly" no existe para los componentes ui.
Siarhey Uchukhlebau
Voy a seguir con tu respuesta ahora. Solo espero no tener que deshabilitar un campo en el futuro.
Marius
Deje formElement como entrada y agregue text elementTmpl como este <item name = "elementTmpl" xsi: type = "string"> ui / form / element / text </item> Consulte: magento.stackexchange.com/a/296735/14271
Magento_Newbie

Respuestas:

17

Intente agregar el disabledparámetro al elemento así:

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

El resultado debe ser similar con el readonlyparámetro para el elemento de forma regular:

resultado

Siarhey Uchukhlebau
fuente
1
Estoy perplejo aquí. funciona, pero me parece mal. Si el campo está desactivado, ¿cómo es que todavía se envía a través de POST? De todos modos, esta es una pregunta diferente. Daré esto por sentado por ahora.
Marius
55
@Marius Esto es muy probable porque cuando se envía un formulario desde el back-end, no se envía el formulario real, sino un nuevo formulario con campos ocultos que se crea al hacer clic en guardar. El formulario se crea de acuerdo con los campos en el archivo XML de componentes de la interfaz de usuario y los campos que están marcados con data-form-part. Echa un vistazo a module-ui/view/base/web/js/form/form.js::initConfig(), validate()y submit(). También mira lib/mage/utils/misc.js::submit(). Estos combinados agregan un nuevo formulario al final del cuerpo que realmente se envía.
Giel Berkers
@GielBerkers. Investigué un poco después de hacer esta pregunta y llegué a la misma conclusión que usted explicó. Tienes razón. Los datos enviados no provienen de un formulario.
Marius
También tengo el mismo problema. Quiero habilitar el campo de precio para un producto configurable. Aquí he explicado el enlace
Gopal Kacha
@Marius, ¿cómo hacer que el campo disabledsolo esté en forma de edición y no en forma nueva?
Vinaya Maheshwari