Magento 2.2.6: Добавьте настраиваемое поле в форму добавления атрибута продукта - Не отображает значение базы данных при редактировании
Я добавил настраиваемое поле в атрибуты своего продукта, и оно отображается и сохраняется нормально, но когда я перезагружаю форму атрибута, значение моего настраиваемого поля пустое. Если я введу данные формы внутри _prepareForm в Front.php , Я вижу значение своего настраиваемого поля, которое сейчас равно 5
Я создаю свой плагин с помощью этого кода:
/app/code/Vendor/CustomModule/etc/adminhtml/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Front">
<plugin name="vendor_custommodule_attribute_edit_form" type="Vendor\CustomModule\Plugin\Block\Adminhtml\Product\Attribute\Edit\Tab\Front" sortOrder="1"/>
</type>
</config>
/app/code/Vendor/CustomModule/Plugin/Block/Adminhtml/Product/Attribute/Edit/Tab/Front.php
namespace Vendor\CustomModule\Plugin\Block\Adminhtml\Product\Attribute\Edit\Tab;
class Front
{
/**
* Get form HTML
*
* @return string
*/
public function aroundGetFormHtml(
\Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Front $subject,
\Closure $proceed
)
{
$form = $subject->getForm();
if (is_object($form)) {
$fieldset = $form->addFieldset(
'custom_fieldset',
['legend' => __('Custom options')]
);
$fieldset->addField(
'my_custom_field',
'text',
[
'name' => 'my_custom_field',
'label' => __('My custom field'),
'title' => __('My custom field'),
]
);
}
return $proceed();
}
}
/app/code/Vendor/CustomModule/view/adminhtml/ui_component/product_attribute_add_form.xml
<?xml version="1.0"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<fieldset name="custom_fieldset">
<field name="my_custom_field">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="sortOrder" xsi:type="number">130</item>
<item name="dataType" xsi:type="string">string</item>
<item name="formElement" xsi:type="string">input</item>
<item name="label" xsi:type="string" translate="true">My custom field</item>
<item name="default" xsi:type="number">0</item>
</item>
</argument>
</field>
</fieldset>
</form>
Результат таков:
Но в базе данных у меня есть правильное значение, которое в настоящее время равно 5
Кто-нибудь может мне помочь, пожалуйста?
2 answers
protected $_coreRegistry;
public function __construct(
\Magento\Framework\Registry $registry
) {
$this->_coreRegistry = $registry;
}
/**
* Get form HTML
*
* @return string
*/
public function aroundGetFormHtml(
\Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Front $subject,
\Closure $proceed
)
{
$attributeObject = $this->_coreRegistry->registry('entity_attribute');
$yesnoSource = $this->_yesNo->toOptionArray();
$form = $subject->getForm();
if (is_object($form)) {
$fieldset = $form->addFieldset(
'custom_fieldset',
['legend' => __('Custom options')]
);
$fieldset->addField(
'my_custom_field',
'text',
[
'name' => 'my_custom_field',
'label' => __('My custom field'),
'title' => __('My custom field'),
]
);
}
$form->setValues($attributeObject->getData());
return $proceed();
}
Вы забыли задать значения для формы Попробуйте эти коды и запустите снова
Просто обновление предыдущего ответа. Реестр устарел, и теперь вы можете использовать:
$attributeObject = $subject->getAttributeObject();
И вместо использования $form->setValues($attributeobject->getData()); Лучше использовать следующий код, чтобы предотвратить пустоту метки атрибута при редактировании администратором. Это было протестировано в magento 2.3.1
$form->addValues(['my_custom_field' => $attributeObject->getData('my_custom_field')]);
Общий файл становится:
/**
* Get form HTML
*
* @return string
*/
public function aroundGetFormHtml(
\Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Front $subject,
\Closure $proceed
)
{
$attributeObject = $subject->getAttributeObject();
$form = $subject->getForm();
if (is_object($form)) {
$fieldset = $form->addFieldset(
'custom_fieldset',
['legend' => __('Custom options')]
);
$fieldset->addField(
'my_custom_field',
'text',
[
'name' => 'my_custom_field',
'label' => __('My custom field'),
'title' => __('My custom field'),
]
);
}
$form->addValues(['my_custom_field' => $attributeObject->getData('my_custom_field')]);
return $proceed();
}