Как отключить поле компонента пользовательского интерфейса при добавлении нового элемента и включить его при редактировании?
Привет, я новичок в magento 2, и я хочу отключить поле компонента пользовательского интерфейса при создании элемента и включить это поле при редактировании.
Хорошо, следуя этому руководству: Отключение поля компонента пользовательского интерфейса при условии в Magento 2
Учебник противоположен тому, что я искал, он работает только для отключения во время редактирования, а не во время добавления. Я хочу отключить во время добавления и включить во время редактирование.
Поставщик данных:
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>
1 answers
-
Вы можете сделать это, просто проверив, существует ли ваш идентификатор сущности В вашем поставщике данных.
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>