Как отключить поле компонента пользовательского интерфейса при добавлении нового элемента и включить его при редактировании?


Привет, я новичок в magento 2, и я хочу отключить поле компонента пользовательского интерфейса при создании элемента и включить это поле при редактировании.

Хорошо, следуя этому руководству: Отключение поля компонента пользовательского интерфейса при условии в Magento 2

Учебник противоположен тому, что я искал, он работает только для отключения во время редактирования, а не во время добавления. Я хочу отключить во время добавления и включить во время редактирование. example

Поставщик данных:

class DataProvider extends AbstractDataProvider

{ /** * @var Модель ресурсов\Данные\Сбор */ защищенная коллекция $;

/**
 * @var DataPersistorInterface
 */
protected $dataPersistor;

/**
 * @var array
 */
protected $loadedData;

/**
 * @param string $name
 * @param string $primaryFieldName
 * @param string $requestFieldName
 * @param CollectionFactory $pageCollectionFactory
 * @param DataPersistorInterface $dataPersistor
 * @param array $meta
 * @param array $data
 */
public function __construct(
    $name,
    $primaryFieldName,
    $requestFieldName,
    CollectionFactory $pageCollectionFactory,
    DataPersistorInterface $dataPersistor,
    array $meta = [],
    array $data = []
) {
    $this->collection    = $pageCollectionFactory->create();
    $this->dataPersistor = $dataPersistor;
    $this->meta          = $this->prepareMeta($this->meta);
    parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
}

/**
 * Prepares Meta
 *
 * @param array $meta
 * @return array
 */
public function prepareMeta(array $meta)
{
    return $meta;
}

/**
 * Get data
 *
 * @return array
 */
public function getData()
{
    if (isset($this->loadedData)) {
        return $this->loadedData;
    }
    $items = $this->collection->getItems();
    foreach ($items as $page) {
        $this->loadedData[$page->getId()] = $page->getData();
    }
    $data = $this->dataPersistor->get('module_messages');
    if (!empty($data)) {
        $page = $this->collection->getNewEmptyItem();
        $page->setData($data);
        $this->loadedData[$page->getId()] = $page->getData();
        $this->dataPersistor->clear('module_messages');
    }

    if($_SESSION['action'] == 'edicao' AND isset($page)){
        $this->loadedData[$page->getId()]['do_we_hide_it'] = true;
    }
    return $this->loadedData;
}

}

Form.xml

<field name="nome_header" formElement="input">
        <argument name="nmh" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="source" xsi:type="string">nmh</item>
            </item>
        </argument>
        <settings>
            <imports>
                <link name="disabled">${ $.provider}:data.edit</link>
            </imports>
            <validation>
                <rule name="required-entry" xsi:type="boolean">false</rule>
            </validation>
            <dataType>text</dataType>
            <label translate="true">Nome Header</label>
            <dataScope>nome_header</dataScope>
        </settings>
    </field>
Author: Rafael Fagundes, 2020-06-12

1 answers

  1. Вы можете сделать это, просто проверив, существует ли ваш идентификатор сущности В вашем поставщике данных.

    public function getData()
    {
       if (!empty($this->loadedData)) {
         return $this->loadedData;
       }
    
       $items = $this->collection->getItems();
       foreach ($items as $page) {
          $rec = $page->getData();
          $rec['edit'] = true; // true when the data is set for edit form. it can be any variable name
          $this->loadedData[$page->getId()] = $rec;
      }
    
      return $this->loadedData;
    }
    

А затем в вашем поле в форме компонента пользовательского интерфейса проверьте наличие переменной редактирования внутри тега импорта

   <field name="to_hide_feild">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="sortOrder" xsi:type="number">10</item>
                <item name="dataType" xsi:type="string">text</item>
                <item name="label" xsi:type="string" translate="true">Title</item>
                <item name="formElement" xsi:type="string">input</item>
                <item name="dataScope" xsi:type="string">title</item>
                <item name="validation" xsi:type="array">
                    <item name="required-entry" xsi:type="boolean">true</item>
                </item>
                <item name="imports" xsi:type="array">
                    <item name="disabled" xsi:type="string">${ $.provider}:data.edit</item>
                </item>
            </item>
        </argument>
    </field>

Если кто-то использует другой шаблон для полей в компоненте пользовательского интерфейса, то этот код будет работать.

    <field name="nome_header" formElement="input">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="source" xsi:type="string">customer</item>
                </item>
            </item>
        </argument>
        <settings>
            <imports>
                <link name="disabled">${ $.provider}:data.edit</link>
            </imports>
            <validation>
                <rule name="required-entry" xsi:type="boolean">false</rule>
            </validation>
            <dataType>text</dataType>
            <disabled>true</disabled>
            <label translate="true">Nome Header</label>
            <dataScope>data</dataScope>
        </settings>
    </field>
 2
Author: Afreen Sheikh, 2020-06-12 19:23:15