I have a UI component defining some fields. How do I disable the field upon a certain condition? In other words, use <item name="disabled" xsi:type="boolean">true</item> only when a condition is met. Here's my field.

<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">Profile Name</item>
                <item name="formElement" xsi:type="string">input</item>
                <item name="source" xsi:type="string">profile</item>
                <item name="dataScope" xsi:type="string">name</item>

4 Answers 4


First set:

<item name="disabled" xsi:type="string">${ $.provider }:data.do_we_hide_it</item>

Suppose Vendor\Extension\Model\Notification\DataProvider is your data provider for UI:

<dataSource name="notification_edit_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">Vendor\Extension\Model\Notification\DataProvider</argument>
        <argument name="name" xsi:type="string">notification_edit_data_source</argument>

Then in its getData function add the following lines:

public function getData(){
    $this->loadedData[$entity_id]['do_we_hide_it'] = true;
    $this->loadedData[$entity_id]['do_we_hide_it'] = false;

See the core files vendor/magento/module-catalog/view/adminhtml/ui_component/category_form.xml line 377 and vendor/magento/module-catalog/Model/Category/DataProvider.php line 303 for an example.

  • 3
    This always disables the input. And if I set xsi:type="boolean" an exception appears: Exception #0 (InvalidArgumentException): Boolean value is expected Commented Jul 6, 2018 at 16:41
  • Actually, it unable to parse to boolean.
    – Knight017
    Commented Dec 18, 2018 at 6:09
  • Hi, can you please upload m2.3 file location. Because, I didn't found anything in that. Commented May 7, 2019 at 11:04
  • does not work, is not respecting the condition, is always disabled Commented Oct 30, 2019 at 15:48

I tried Konstantin's solution but for some reason, it didn't work for me.

I managed to make it work by using the following syntax:

<field name="name">
            <link name="disabled">${ $.provider}:data.do_we_hide_it</link>

Hope it helps.

Edit :

The argument node is not required but if it exists, settings node must be placed after. It is the last one in the xsd definition in M2.3. The xml comes in addition with the accepted answer.

  • How to make field disabled only in edit form not in new form? Commented May 15, 2018 at 6:20
  • I used this option but an exception occured: Exception #0 (Magento\Framework\Exception\LocalizedException): Element 'settings': This element is not expected. Commented Jul 6, 2018 at 16:46
  • This one works for me, the solution from Konstantin Gerasimov is the one didn't work Commented May 21, 2019 at 9:37
  • @AndresRojasOrozco and other people using this solution (that works just fine). The order of nodes is important, settings should be put after argument. You can check the vendor/magento/module-ui/view/base/ui_component/etc/definition/field.xsd where configurable refers to ui_settings.xsd in the same directory. I will try to amend the answer to have it fitting the reality. Commented Jul 3, 2019 at 11:58
  • @Alessandro Ronchi How can we do this for FieldSet do you know? I've tried but it doesn't work! Commented Feb 25, 2020 at 12:48

You can override getMeta() function in your DataProvider class

public function getMeta()
        $meta = parent::getMeta();
        /** @var Magento\Framework\App\RequestInterface $this->request */
        $id = $this->request->getParam('entity_id');

        if($id) {
            $meta['fieldset_name']['children']['field_name']['arguments']['data']['config']['disabled'] = 1;
            //you can replace 'disabled" with 'visible' to hide the field completely

        return $meta;

This worked for me.


So for all of you struggling with this, here is another "solution". I combined the answers above to the one that works for me:

My item url looks like this: specialshipment/item/edit/id/172/key... this important to understand because you need to retrieve the id and not the entity_id as was my first mistake.

Because I needed to hide my dropdown in case of an existing shipment I added a class to my field. To do this you need the so called "additionalClasses" attribute. It will be "hidden" if it is an existing shipment and "use_dropdown" when the shipment is new (since we would like to use the dropdown).

the answer from @smitaKagwade was what helped a lot! Here is my ui form with the special class:

<fieldset name="general">
    <field name="shipment_container_size_id">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="object">Vendor\SpecialShipments\Model\Config\Source\ShipContainerSize</item>
                <item name="config" xsi:type="array">
                    <item name="source" xsi:type="string">shipment_container_size_id</item>
                    <item name="label" xsi:type="string" translate="true">Ship Container Size</item>
                    <item name="dataType" xsi:type="string">select</item>
                    <item name="formElement" xsi:type="string">select</item>
                    <item name="additionalClasses" xsi:type="string">use_dropdown</item>

In the above note the line saying item name="additionalClasses" ...use_dropdown

So my dropdown (ShipContainerSize) field in the form gets a css class called use_dropdown.

I want to hide it if the shipment already exists and the container size is already chosen. For this I need to go to my DataProvider and in my construct function I make sure to get the Magento\Framework\App\RequestInterface $request. Now I can apply smitaKagwade's solution making use of the getParam('id') for the url id as mentioned at the beginning.

As Smita Kagwade mentioned, I need my field set name (as seen above it is "general"), my field name ("shipment_container_size_id") and the config attribute I want to change: additionalClasses. So here is the code:

public function getMeta()
        $meta = parent::getMeta();
        $itemId = $this->request->getParam('id');
        if (isset($itemId) && $itemId > 0) {
            $meta['general']['children']['shipment_container_size_id']['arguments']['data']['config']['additionalClasses'] = 'hidden';
            $meta['general']['children']['shipment_container_size_id']['arguments']['data']['config']['additionalClasses'] = 'use_dropdown';
        return $meta;

And it works! It hides the drowpdown on existing shipment items, and shows it on new ones. I hope this elaborate solution will help others :-)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.