系统学习magento二次开发,推荐小册:《Magento中文全栈二次开发 》
本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。
如何在Magento 2中添加动态系统配置字段:
步骤 1:在以下路径中创建一个示例系统.xml:
app/code/Vendor/Extension/etc/adminhtml/system.xml
然后,添加以下代码:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../Magento/Backend/etc/system_file.xsd"> <system> <tab id="vendortab" translate="label" sortOrder="100"> <label>Vendor TAB</label> </tab> <section id="sectionid" translate="label" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1"> <class>separator-top</class> <label>General Config</label> <tab>vendortab</tab> <resource>Vendor_Extension::config</resource> <group id="group" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="0" showInStore="0"> <label>General Configuration</label> <field id="field" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Field</label> </field> </group> </section> </system> </config>
步骤2:为此,请在以下路径中创建di.xml:
app\code\Vendor\Extension\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\Config\Model\Config\Structure\Data"> <plugin name="vendor_dynamic" type="Vendor\Extension\Plugin\Config\Field\Data"/> </type> </config><span style="font-weight: 400;"> </span>
步骤3: 接下来,在插件中创建一个名为 Data.php 文件的插件:
app\code\Vendor\Extension\Plugin\Config\Field\Data.php
并将以下代码添加到文件中:
<?php
namespace Vendor\Extension\Plugin\Config\Field;
use Magento\Config\Model\Config\Structure\Data as StructureData;
use Magento\Framework\Module\ModuleListInterface;
class Data
{
public function __construct(ModuleListInterface $moduleList)
{
$this->_moduleList = $moduleList;
}
public function beforeMerge(StructureData $object, array $config)
{
$moduleList = $this->_moduleList->getNames();
foreach ($moduleList as $name)
{
if (strpos($name, 'Vendor_Extension') === false)
{
continue;
}
$this->moduleslist[] = $name;
}
if (!isset($config['config']['system']))
{
return [$config];
}
$sections = $config['config']['system']['sections'];
foreach ($sections as $sectionId => $section)
{
if (isset($section['tab']) && ($section['tab'] === 'vendor') && ($section['id'] !== 'vendor'))
{
foreach ($this->moduleslist as $moduleName)
{
if ($section['id'] !== 'sectionid')
{
continue;
}
$dynamicGroups = $this->getGroups($moduleName, $section['id']);
if (!empty($dynamicGroups))
{
$config['config']['system']['sections'][$sectionId]['children'] = $dynamicGroups + $section['children'];
}
break;
}
}
}
return [$config];
}
protected function getGroups($moduleName, $sectionName)
{
$defaultFieldOptions = [
'type' => 'text',
'showInDefault' => '1',
'showInWebsite' => '1',
'showInStore' => '1',
'sortOrder' => 1,
'module_name' => $moduleName,
'validate' => 'required-entry',
'_elementType' => 'field',
'path' => $sectionName . '/module'
];
$fields = [];
foreach ($this->getNewField() as $id => $option)
{
$fields[$id] = array_merge($defaultFieldOptions, ['id' => $id], $option);
}
return [
'module' => [
'id' => 'module',
'label' => __('Dynamic Section'),
'showInDefault' => '1',
'showInWebsite' => '0',
'showInStore' => '0',
'_elementType' => 'group',
'path' => $sectionName,
'children' => $fields
]
];
}
protected function getNewField()
{
return [
'name1' => [
'label' => __('Dynamic Field'),
'frontend_class' => 'vendor_dynamic_class',
'show' => 1,
'tooltip' => __('Dynamic Field Tooltip'),
'comment' => __('Dynamic Field Comment')
],
];
}
}您可以从管理面板检查输出。
结语:
这样,您可以在Magento 2中添加动态系统配置字段。