Продукт Magento 2 Редактировать/Добавлять пользовательский раздел формы администратора
Я изучаю компонент пользовательского интерфейса.
Я хочу добавить пользовательский раздел в форму редактирования/добавления продукта, чтобы для этого
Я создал следующие файлы.
Vendor/module/view/adminhtml/ui_component/product_form.xml
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<fieldset name="mobile">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Time</item>
<item name="provider" xsi:type="string">product</item>
<item name="dataScope" xsi:type="string">data.product</item>
<item name="sortOrder" xsi:type="number">2</item>
<item name="collapsible" xsi:type="boolean">true</item>
<item name="opened" xsi:type="boolean">false</item>
<item name="ns" xsi:type="string">product_form</item>
</item>
</argument>
<container name="monday_time_group">
<argument name="data" xsi:type="array">
<item name="type" xsi:type="string">group</item>
<item name="config" xsi:type="array">
<item name="additionalClasses" xsi:type="string">admin__control-grouped-date</item>
<item name="component" xsi:type="string">Magento_Ui/js/form/components/group</item>
<item name="label" xsi:type="string" translate="true">Monday</item>
<item name="required" xsi:type="boolean">false</item>
<item name="sortOrder" xsi:type="number">220</item>
<item name="breakLine" xsi:type="boolean">false</item>
<item name="scopeLabel" xsi:type="string">[STORE VIEW]</item>
</item>
</argument>
<field name="monday_design_from">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Vendor\Module\Model\Config\Source\TimeSetup</item>
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Monday</item>
<item name="additionalClasses" xsi:type="string">admin__field-date</item>
<item name="sortOrder" xsi:type="number">230</item>
<item name="dataType" xsi:type="string">string</item>
<item name="formElement" xsi:type="string">select</item>
</item>
</argument>
</field>
<field name="monday_design_to">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Vendor\Module\Model\Config\Source\TimeSetup</item>
<item name="config" xsi:type="array">
<item name="additionalClasses" xsi:type="string">admin__field-date</item>
<item name="sortOrder" xsi:type="number">240</item>
<item name="dataType" xsi:type="string">string</item>
<item name="formElement" xsi:type="string">select</item>
</item>
</argument>
</field>
</container>
</fieldset>
</form>
Vendor\Module\Model\Config\Source\TimeSetup.php
<?php
namespace Vendor\Module\Model\Config\Source;
class TimeSetup extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
{
protected $_optionsData;
/**
* getAllOptions
*
* @return array
*/
public function getAllOptions()
{
if ($this->_options === null) {
$this->_options = [
['value' => 'one', 'label' => __('one')],
['value' => 'two', 'label' => __('two')]
];
}
return $this->_options;
}
final public function toOptionArray()
{
return array(
array('value' => 'one', 'label' => __('one')),
array('value' => 'two', 'label' => __('two'))
);
}
}
Он отображается в бэкэнде правильно, как я и хотел, но при попытке сохранить продукт это значение поля не сохраняется.
Нужно ли мне это создать атрибут "monday_time_group"? Правильно ли это делать? Как я могу получить ценность этого в интерфейсе для продукта?
ОБНОВЛЕНИЕ:
Я создал атрибут monday_time_group, но все еще не работает.
3 answers
Хорошо, наконец-то я решил эту проблему сам, вот полный код моего модуля...
Registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Vendor_Module',
__DIR__
);
Etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
<module name="Vendor_Module" setup_version="1.0.0"></module>
</config>
Setup/InstallData.php
<?php
namespace Vendor\Module\Setup;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class InstallData implements InstallDataInterface
{
private $eavSetupFactory;
public function __construct(
EavSetupFactory $eavSetupFactory
)
{
$this->eavSetupFactory = $eavSetupFactory;
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
$eavSetup->addAttribute(
\Magento\Catalog\Model\Product::ENTITY,
"testone",
[
'group' => "",
'label' => "Test One",
'is_html_allowed_on_front' => true,
'default' => '1',
'note' => '',
'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE,
'visible' => true,
'required' => false,
'user_defined' => false,
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => true,
'visible_in_advanced_search' => false,
'unique' => false,
"frontend_class" => "",
"used_in_product_listing" => true,
"input" => "select",
"type" => "varchar",
"source" => "Vendor\Module\Model\Config\Source\TimeSetup",
'backend' => 'Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend'
]
);
$eavSetup->addAttribute(
\Magento\Catalog\Model\Product::ENTITY,
"testtwo",
[
'group' => "",
'label' => "Test Two",
'is_html_allowed_on_front' => true,
'default' => '1',
'note' => '',
'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE,
'visible' => true,
'required' => false,
'user_defined' => false,
'searchable' => false,
'filterable' => false,
'comparable' => false,
'visible_on_front' => true,
'visible_in_advanced_search' => false,
'unique' => false,
"frontend_class" => "",
"used_in_product_listing" => true,
"input" => "select",
"type" => "varchar",
"source" => "Vendor\Module\Model\Config\Source\TimeSetup",
'backend' => 'Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend'
]
);
}
}
Model\Config\Source\TimeSetup.php
<?php
namespace Vendor\Module\Model\Config\Source;
class TimeSetup extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
{
protected $_optionsData;
/**
* getAllOptions
*
* @return array
*/
public function getAllOptions()
{
if ($this->_options === null) {
$this->_options = [
['value' => 'one', 'label' => __('one')],
['value' => 'two', 'label' => __('two')]
];
}
return $this->_options;
}
final public function toOptionArray()
{
return array(
array('value' => 'one', 'label' => __('one')),
array('value' => 'two', 'label' => __('two'))
);
}
}
View/adminhtml/ui_component/product_form.xml
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<fieldset name="testingproduct">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Testing Group</item>
<item name="provider" xsi:type="string">product</item>
<item name="dataScope" xsi:type="string">data.product</item>
<item name="sortOrder" xsi:type="number">2</item>
<item name="collapsible" xsi:type="boolean">true</item>
<item name="opened" xsi:type="boolean">false</item>
<item name="ns" xsi:type="string">product_form</item>
</item>
</argument>
<container name="testing_group">
<argument name="data" xsi:type="array">
<item name="type" xsi:type="string">group</item>
<item name="config" xsi:type="array">
<item name="formElement" xsi:type="string">container</item>
<item name="component" xsi:type="string">Magento_Ui/js/form/components/group</item>
<item name="label" xsi:type="string" translate="true">Testing Group</item>
<item name="required" xsi:type="boolean">false</item>
<item name="sortOrder" xsi:type="number">220</item>
<item name="breakLine" xsi:type="boolean">false</item>
<item name="scopeLabel" xsi:type="string">[STORE VIEW]</item>
</item>
</argument>
<field name="testone">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Vendor\Module\Model\Config\Source\TimeSetup</item>
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Testing Row</item>
<item name="sortOrder" xsi:type="number">230</item>
<item name="dataType" xsi:type="string">string</item>
<item name="formElement" xsi:type="string">select</item>
</item>
</argument>
</field>
<field name="testtwo">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Vendor\Module\Model\Config\Source\TimeSetup</item>
<item name="config" xsi:type="array">
<item name="sortOrder" xsi:type="number">240</item>
<item name="dataType" xsi:type="string">string</item>
<item name="formElement" xsi:type="string">select</item>
</item>
</argument>
</field>
</container>
</fieldset>
</form>
Используя приведенный выше код, правильно сохраняя данные, единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что эти атрибуты появляются в целом раздел, а также в моем созданном пользовательском разделе, который называется "Группа тестирования", так что на данный момент я скрыл их из общего раздела с помощью CSS.
Из того, что я здесь вижу, в ваших атрибутах нет ничего особенного.
Они являются обычными.
Вы можете просто добавить атрибуты monday_design_from
, monday_design_from
и поместите их в отдельную группу.
Я рекомендую вам сделать это с помощью кода, а не вручную, потому что я предполагаю, что у вас будет логика в этих атрибутах.
Вот пример того, как вы можете это сделать: https://magento.stackexchange.com/a/162115/146
Единственное, что вам нужно изменить, если вы хотите, чтобы ваш атрибуты, которые будут отображаться в отдельном разделе, должны добавить в массив конфигурации этот
'group' => 'Time',
Идеальное решение, доступное здесь:
Добавить новую вкладку на странице редактирования продукта в admin Magento 2
Вы можете найти решение для любой версии magento2