动态商店配置字段

动态商店配置字段

2017年4月3日发布 in 发展历程
如何更改订单,发票,贷项凭证和货件的Magento 2增量ID
如何更改订单,发票,贷项通知单和发货的Magento 2增量ID
2017年2月7日
在Magento 2中创建自定义小部件
在Magento 2中创建自定义小部件
2017年4月28日

Magento’的存储配置功能使开发人员可以快速有效地为其模块定义配置字段。这种效率促进了灵活和可配置的模块,从而节省了开发人员和商人的时间和金钱。

但是,在某些情况下,固定的已定义配置字段列表是’足以配置更多动态功能。幸运的是’实现动态生成的存储配置字段相对简单,允许开发人员支持复杂的灵活性。

示例用例

此示例的要求是,对于配置为要求州/地区的国家/地区,仅允许某些地区。

These countries are 配置ured 在 store 配置 at General ->一般 -> State Options -> State is Required for. In order to 配置ure which regions are allowed for each country, new store 配置 fields will need to be added, 上e for each 配置ured country. Since the 配置ured countries could change at any time, it will not be possible to hard code the allowed regions fields 在 system.xml. Instead, a field will need to be dynamically added to the State Options group for each 配置ured country.

动态场

方法

Each element 在 the store 配置 hierarchy (tab, section, and group) 延伸 \Magento\Config\Model\Config\Structure\Element\AbstractComposite. When setting its data, AbstractComposite specifically looks for an 数组 at key 孩子们, and 使用s this value to populate the 孩子们 elements.

的PHP
1
2
3
4
5
6
7
8
9
10
11
上市 功能 setData(数组 $数据, $范围)
{
    父母::setData($数据, $范围);
    $儿童 = 数组_key_exists(
        '儿童',
        $ this->_数据
    ) && is_array(
        $ this->_数据['儿童']
    ) ? $ this->_数据['儿童'] : [];
    $ this->_childrenIterator->setElements($儿童, $范围);
}

This provides the opportunity to craft a 插入 to add (or remove) 孩子们, which will eventually be 使用d to populate the store 配置 UI. The 父母 element of fields is a 配置 group, so \Magento\Config\Model\Config\Structure\Element\Group is the specific 类 where calls to setData() should be 在tercepted.

XHTML
1
2
3
4
5
6
7
<?XML文件 ="1.0"?>
<!-EW / 动态ConfigFields / etc / di.xml->
<config XML文件ns:si="http://www.w3.org/2001/XMLSchema-instance" si:noNamespaceSchemaLocation=“ ur:magento:框架:ObjectManager / etc / 配置.xsd”>
    <type 名称=“ \ Magento \ 设定档 \ 模型 \ 设定档 \ 结构体 \ 元件 \ 组”>
        <plugin 名称=“ dynamic_config_fields” 类型=“ 电子战 \ 动态ConfigFields \ 模型 \ 设定档 \ 设定档 \ 结构体 \ 元件 \ 组”/>
    </type>
</config>

的PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
 
// 电子战 / 动态ConfigFields / 模型 / 设定档 / 设定档 / 结构体 / 元件 / 组.php
 
命名空间 电子战\动态ConfigFields\模型\设定档\设定档\结构体\元件;
 
使用 \Magento\设定档\模型\设定档\结构体\元件\ 原始组;
 
{
    const DIRECTORY_REGION_REQUIRED_GROUP_ID = '地区';
 
    / **
    *为配置的每个国家/地区添加动态区域配置字段
     *
    * @param 原始组 $ subject
    * @param可调用的$ proceed
    * @参数数组$ data
     * @参数$ scope
     * @返回混合
     * /
    上市 功能 aroundSetData(原始组 $ subject, 可召回的 $收益, 数组 $数据, $范围) {
        //此方法在每个组中运行。
        //添加一个条件以检查我们要
        //对添加字段感兴趣。
        如果($数据['ID'] == ::DIRECTORY_REGION_REQUIRED_GROUP_ID) {
            // @ todo:添加动态字段
        }
 
        返回 $收益($数据, $范围);
    }
}

现在已经建立了一个拦截点,’s needed is to add values to the $数据['children'] 数组.

The format for the values of this 数组 mostly follow the format of fields 在 system.xml, with a few additions. Below is an example with common values set 上 the field.

的PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[
    'ID' => 'field-config-path-id',     //听写存储配置XML路径
    '类型' => '多选',            //设置配置字段的类型
    '排序' => 50,                  //字段排序
    'showInDefault' => '1',             //在默认范围内显示
    “ showInWebsite” => '0',             //在网站范围内显示
    'showInStore' => '0',               //在商店范围内显示
    '标签' => __(“我的动态领域”),  //在admin中显示的字段标签
    '选项' => [                      //为支持固定值的类型定义字段值。
                                        //或者,可以使用source_model。
        '选项' => [
            '值1' => [
                [
                    '值' => '值1',
                    '标签' => 标签1
                ]
            ],
            'value2' => [
                [
                    '值' => 'value2',
                    '标签' => 标签2
                ]
            ]
        ]
    ],
    '评论' => __(                    //字段注释
        “此字段是动态生成的”
    ),
    '_elementType' => '领域',          //'field'的固定值
    '路径' => 'some-tab / some-group'     //配置XML路径前缀。
                                        //此值+'/'+ id字段的值构成最终的配置路径。
]

In this example, a field needs to be dynamically added for every selected country 在 the General ->一般 -> State Options -> State is Required for field. Using \Magento\Directory\Helper\Data to retrieve which countries are selected and their known regions (if any), the 插入 shell can generate these dynamic fields.

In the event that a country has a known list of regions, a multiselect field is 使用d. Otherwise, a textarea field is generated to allow free-form region entry.

的PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<?php
 
//EW/DynamicConfigFields/Model/Config/Config/Structure/Element/Group.php
 
命名空间 电子战\动态ConfigFields\模型\设定档\设定档\结构体\元件;
 
使用 \Magento\设定档\模型\设定档\结构体\元件\ 原始组;
使用 \Magento\目录\阿皮\CountryInformationAcquirerInterface;
使用 \Magento\目录\阿皮\数据\国家信息接口;
使用 \电子战\动态ConfigFields\帮手\设定档 设定档Helper;
使用 \Magento\目录\帮手\数据 目录助手;
 
/ **
*插件添加动态生成的存储配置字段
*一般-> General ->状态选项组。
*
* @package 电子战 \ 动态ConfigFields \ 模型 \ 设定档 \ 设定档 \ 结构体 \ 元件
* /
{
    / **
    *目标组的配置XML路径
     * /
    const DIRECTORY_REGION_REQUIRED_GROUP_ID = '地区';
 
    / **
    * @var \ Magento \ 目录 \ 帮手 \ 数据
     * /
    受保护的 $ directoryHelper;
    / **
    * @var CountryInformationAcquirerInterface
     * /
    受保护的 $ countryInformationAcquirer;
 
    / **
    *组构造函数。
    * @param 目录助手 $目录助手
    * @param CountryInformationAcquirerInterface $ countryInformationAcquirer
     * /
    上市 功能 __构造(
        目录助手 $ directoryHelper,
        CountryInformationAcquirerInterface $ countryInformationAcquirer
    )
    {
        $ this->directoryHelper = $ directoryHelper;
        $ this->countryInformationAcquirer = $ countryInformationAcquirer;
    }
 
    / **
    *获取给定国家/地区的配置选项数组
     *
    * @param 国家信息接口 $ countryInfo
     * @返回数组
     * /
    受保护的 功能 getRegionsForCountry(国家信息接口 $ countryInfo) : 数组 {
        $选项 = [];
 
        $ availableRegions = $ countryInfo->getAvailableRegions() ?: [];
 
        前言($ availableRegions $区域) {
            $选项[$区域->getCode()] = [
                '值' => $区域->getCode(),
                '标签' => $区域->getName()
            ];
        }
 
        返回 $选项;
    }
 
    / **
    *获取动态配置字段(如果有)
     *
     * @返回数组
     * /
    受保护的 功能 getDynamicConfigFields() : 数组 {
        $ countriesWithStatesRequired = $ this->directoryHelper->getCountriesWithStatesRequired();
 
        $ dynamicConfigFields = [];
        前言($ countriesWithStatesRequired $ 在dex => $国家) {
            //为动态生成的字段使用一致的前缀
            //使其具有确定性,但不会与任何碰撞
            //预先存在的字段。
            // 设定档Helper :: ALLOWED_REGIONS_CONFIG_PATH_PREFIX == 'regions-allowed-'。
            $ 配置Id = 设定档Helper ::ALLOWED_REGIONS_CONFIG_PATH_PREFIX . $国家;
 
            $ countryInfo = $ this->countryInformationAcquirer->getCountryInfo($国家);
            $ regionOptions = $ this->getRegionsForCountry($ countryInfo);
 
            //如果区域列表固定,则使用multiselect类型;否则,请使用textarea。
            $ 配置Type = !空的($ regionOptions) ? '多选' : 'textarea';
 
            开关($ 配置Type) {
                案件 '多选':
                    $ dynamicConfigFields[$ 配置Id] = [
                        'ID' => $ 配置Id,
                        '类型' => '多选',
                        '排序' => ($ 在dex * 10), //生成唯一的确定性sortOrder值
                        'showInDefault' => '1',       //在这种情况下,仅显示默认范围内的字段
                        “ showInWebsite” => '0',
                        'showInStore' => '0',
                        '标签' => __(“允许的区域:%1”, $ countryInfo->getFullNameEnglish()),
                        '选项' => [                //由于这是一个多选,请动态生成选项。
                            '选项' => $ this->getRegionsForCountry($ countryInfo)
                        ],
                        '评论' => __(
                            “为%1选择允许的区域。”,
                            $ countryInfo->getFullNameEnglish()
                        ),
                        '_elementType' => '领域',
                        '路径' => 设定档Helper ::ALLOWED_REGIONS_GROUP_PATH_PREFIX //标签/部分名称:“常规/区域”。
                    ];
                    打破;
                案件 'textarea':
                    $ dynamicConfigFields[$ 配置Id] = [
                        'ID' => $ 配置Id,
                        '类型' => 'textarea',
                        '排序' => ($ 在dex * 10),  //生成唯一的确定性sortOrder值
                        'showInDefault' => '1',        //在这种情况下,仅显示默认范围内的字段
                        “ showInWebsite” => '0',
                        'showInStore' => '0',
                        '标签' => __(“允许的区域:%1”, $ countryInfo->getFullNameEnglish()),
                        '评论' => __(
                            “输入%1的允许区域,每行一个。”,
                            $ countryInfo->getFullNameEnglish()
                        ),
                        '_elementType' => '领域',
                        '路径' => 设定档Helper ::ALLOWED_REGIONS_GROUP_PATH_PREFIX //标签/部分名称:“常规/区域”。
                    ];
                    打破;
            }
 
        }
 
        返回 $ dynamicConfigFields;
    }
 
    / **
    *为配置的每个国家/地区添加动态区域配置字段
     *
    * @param 原始组 $ subject
    * @param可调用的$ proceed
    * @参数数组$ data
     * @参数$ scope
     * @返回混合
     * /
    上市 功能 aroundSetData(原始组 $ subject, 可召回的 $收益, 数组 $数据, $范围) {
        //此方法在每个组中运行。
        //添加一个条件以检查我们要
        //对添加字段感兴趣。
        如果($数据['ID'] == ::DIRECTORY_REGION_REQUIRED_GROUP_ID) {
            $ dynamicFields = $ this->getDynamicConfigFields();
 
            如果(!空的($ dynamicFields)) {
                $数据['儿童'] + = $ dynamicFields;
            }
        }
 
        返回 $收益($数据, $范围);
    }
}

结果

完全实现插件后,将动态创建的特定于国家/地区的配置字段附加到“状态选项”组。

在下面的屏幕截图中,选择了默认国家和阿富汗,以取得良好的效果。 (单击以获取完整的页面截图。)

缩写的Dynamic Fields管理员UI

当然,如果不添加动态字段,则没有用’t存储字段值。这是由Magento和动态字段无缝处理的’ values are stored 在 core_config_data with the computed path.

core_config_data动态字段屏幕截图

这些值可以通过其计算出的路径以与其他任何商店配置值相同的方式进行检索。

动态组

对于某些具有多个字段集的应用程序,动态创建整个字段组可能更有意义。可以通过类似的方式完成此操作,即在存储配置层次结构中上一层。

方法

就像动态字段是由围绕组模型的插件添加的一样’s setData() method, dynamic groups are added by a 插入 around the setData() method of the section model, \Magento\Config\Model\Config\Structure\Element\Section. This 插入 is nearly identical, but the expected format of 数组s appended to $数据['children'] is 上e level higher.

的PHP
1
2
3
4
5
6
7
8
9
[
    'ID' => 'group-config-path-id,      //配置路径的组ID组件
    '标签'=> __('我的 动态 '),  // 组 标签
    'showInDefault'=> '1',            //在默认范围内显示组
    'showInWebsite'=> '0',            //在网站范围内显示组
    'showInStore'=> '0',              //在商店范围内显示组
    '排序'=> 50,                  // 组 sort order
    '孩子们' => []                    //子字段,使用如上所述的相同格式
]

在这个例子中’可以使用此格式为所选的每个国家/地区添加整个配置组。使用类似于动态字段插件的插件可以轻松实现此目的。

XHTML
1
2
3
4
5
6
7
<?XML文件 ="1.0"?>
<!-EW / 动态ConfigFields / etc / di.xml->
<config XML文件ns:si="http://www.w3.org/2001/XMLSchema-instance" si:noNamespaceSchemaLocation=“ ur:magento:框架:ObjectManager / etc / 配置.xsd”>
    <type 名称=“ \ Magento \ 设定档 \ 模型 \ 设定档 \ 结构体 \ 元件 \ 部分”>
        <plugin 名称=“ dynamic_config_groups” 类型=“ 电子战 \ 动态ConfigFields \ 模型 \ 设定档 \ 设定档 \ 结构体 \ 元件 \ 部分”/>
    </type>
</config>

的PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<?php
 
// 电子战 / 动态ConfigFields / 模型 / 设定档 / 设定档 / 结构体 / 元件 / 部分.php
 
命名空间 电子战\动态ConfigFields\模型\设定档\设定档\结构体\元件;
 
使用 \Magento\设定档\模型\设定档\结构体\元件\部分 原始部分;
使用 \Magento\目录\阿皮\CountryInformationAcquirerInterface;
使用 \Magento\目录\阿皮\数据\国家信息接口;
使用 \电子战\动态ConfigFields\帮手\设定档 设定档Helper;
使用 \Magento\目录\帮手\数据 目录助手;
 
/ **
*插件可将动态生成的组添加到
* 一般 -> General section.
*
* @package 电子战 \ 动态ConfigFields \ 模型 \ 设定档 \ 设定档 \ 结构体 \ 元件
* /
部分
{
    / **
    *目标部分的配置路径
     * /
    const CONFIG_GENERAL_SECTION_ID = '一般';
 
    / **
    * @var \ Magento \ 目录 \ 帮手 \ 数据
     * /
    受保护的 $ directoryHelper;
    / **
    * @var CountryInformationAcquirerInterface
     * /
    受保护的 $ countryInformationAcquirer;
 
    / **
    *组构造函数。
    * @param 目录助手 $目录助手
    * @param CountryInformationAcquirerInterface $ countryInformationAcquirer
     * /
    上市 功能 __构造(
        目录助手 $ directoryHelper,
        CountryInformationAcquirerInterface $ countryInformationAcquirer
    )
    {
        $ this->directoryHelper = $ directoryHelper;
        $ this->countryInformationAcquirer = $ countryInformationAcquirer;
    }
 
    / **
    *获取给定国家/地区的配置选项数组
     *
    * @param 国家信息接口 $ countryInfo
     * @返回数组
     * /
    受保护的 功能 getRegionsForCountry(国家信息接口 $ countryInfo) : 数组 {
        $选项 = [];
 
        $ availableRegions = $ countryInfo->getAvailableRegions() ?: [];
 
        前言($ availableRegions $区域) {
            $选项[$区域->getCode()] = [
                '值' => $区域->getCode(),
                '标签' => $区域->getName()
            ];
        }
 
        返回 $选项;
    }
 
    / **
    *获取动态配置组(如果有)
     *
     * @返回数组
     * /
    受保护的 功能 getDynamicConfigGroups() : 数组 {
        $ countriesWithStatesRequired = $ this->directoryHelper->getCountriesWithStatesRequired();
 
        $ dynamicConfigGroups = [];
        前言($ countriesWithStatesRequired $ 在dex => $国家) {
            //为动态生成的字段使用一致的前缀
            //使其具有确定性,但不会与任何碰撞
            //预先存在的字段。
            // 设定档Helper :: ALLOWED_REGIONS_CONFIG_PATH_PREFIX == 'regions-allowed-'。
            $ 配置Id = 设定档Helper ::ALLOWED_REGIONS_CONFIG_PATH_PREFIX . $国家;
 
            $ countryInfo = $ this->countryInformationAcquirer->getCountryInfo($国家);
            $ regionOptions = $ this->getRegionsForCountry($ countryInfo);
 
            //如果区域列表固定,则使用multiselect类型;否则,请使用textarea。
            $ 配置Type = !空的($ regionOptions) ? '多选' : 'textarea';
 
            $ dynamicConfigFields = [];
            开关($ 配置Type) {
                案件 '多选':
                    $ dynamicConfigFields[$ 配置Id] = [
                        'ID' => $ 配置Id,
                        '类型' => '多选',
                        '排序' => ($ 在dex * 10), //生成唯一的确定性sortOrder值
                        'showInDefault' => '1',       //在这种情况下,仅显示默认范围内的字段
                        “ showInWebsite” => '0',
                        'showInStore' => '0',
                        '标签' => __(“允许的区域:%1”, $ countryInfo->getFullNameEnglish()),
                        '选项' => [                //由于这是一个多选,请动态生成选项。
                            '选项' => $ this->getRegionsForCountry($ countryInfo)
                        ],
                        '评论' => __(
                            “为%1选择允许的区域。”,
                            $ countryInfo->getFullNameEnglish()
                        ),
                        '_elementType' => '领域',
                        '路径' => 内爆(            //根据区段ID和动态组ID计算组路径
                            '/',
                            [
                                ::CONFIG_GENERAL_SECTION_ID,
                                设定档Helper ::ALLOWED_REGIONS_SECTION_CONFIG_PATH_PREFIX . $国家
                            ]
                        )
                    ];
                    打破;
                案件 'textarea':
                    $ dynamicConfigFields[$ 配置Id] = [
                        'ID' => $ 配置Id,
                        '类型' => 'textarea',
                        '排序' => ($ 在dex * 10), //生成唯一的确定性sortOrder值
                        'showInDefault' => '1',       //在这种情况下,仅显示默认范围内的字段
                        “ showInWebsite” => '0',
                        'showInStore' => '0',
                        '标签' => __(“允许的区域:%1”, $ countryInfo->getFullNameEnglish()),
                        '评论' => __(
                            “输入%1的允许区域,每行一个。”,
                            $ countryInfo->getFullNameEnglish()
                        ),
                        '_elementType' => '领域',
                        '路径' => 内爆(            //根据区段ID和动态组ID计算组路径
                            '/',
                            [
                                ::CONFIG_GENERAL_SECTION_ID,
                                设定档Helper ::ALLOWED_REGIONS_SECTION_CONFIG_PATH_PREFIX . $国家
                            ]
                        )
                    ];
                    打破;
            }
 
            $ dynamicConfigGroups[$国家] = [    //声明群组信息
                'ID' => $国家,                   //使用动态组ID
                '标签' => __(
                    '%1个允许的区域' ,
                    $ countryInfo->getFullNameEnglish()
                ),
                'showInDefault' => '1',             //在默认范围内显示
                “ showInWebsite” => '0',             //不显示在网站范围内
                'showInStore' => '0',               //不显示在商店范围内
                '排序' => ($ 在dex * 10),       //生成唯一的确定性sortOrder值
                '儿童' => $ dynamicConfigFields  //使用上面生成的动态字段
            ];
        }
 
        返回 $ dynamicConfigGroups;
    }
 
    / **
    *为配置的每个国家/地区添加动态区域配置组
     *
    * @param 原始部分 $ subject
    * @param可调用的$ proceed
    * @参数数组$ data
     * @参数$ scope
     * @返回混合
     * /
    上市 功能 aroundSetData(原始部分 $ subject, 可召回的 $收益, 数组 $数据, $范围) {
        //此方法在每个部分都运行。
        //添加一个条件以检查我们要
        //有兴趣添加组。
        如果($数据['ID'] == ::CONFIG_GENERAL_SECTION_ID) {
            $ dynamicGroups = $ this->getDynamicConfigGroups();
 
            如果(!空的($ dynamicGroups)) {
                $数据['儿童'] + = $ dynamicGroups;
            }
        }
 
        返回 $收益($数据, $范围);
    }
}

结果

Similar to dynamic fields, after this 插入 is implemented a dynamic group is shown 在 the General -> General tab, 上e for each selected country. (Click for full page screenshot.)

管理员界面中动态组的屏幕截图

Additionally, values of fields 在 dynamic groups are correctly saved to core_config_data.

core_config_data动态组屏幕截图

从这往哪儿走

取值

检索动态字段或动态组的字段的值与获取任何其他存储配置字段相同,只是要计算路径。下面是一个配置助手的示例,可以从该示例中查找值。

的PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
 
// 电子战 / 动态ConfigFields / 帮手 / 设定档.php
 
命名空间 电子战\动态ConfigFields\帮手;
 
使用 Magento\构架\应用程式\设定档\ScopeConfigInterface;
使用 Magento\构架\应用程式\帮手\抽象助手;
 
设定档 延伸 抽象助手
{
    const ALLOWED_REGIONS_GROUP_PATH_PREFIX = “一般/地区”;
    const ALLOWED_REGIONS_CONFIG_PATH_PREFIX = “允许的区域”;
 
    const ALLOWED_REGIONS_TAB_ID = '一般';
    const ALLOWED_REGIONS_SECTION_CONFIG_PATH_PREFIX = “允许的状态部分”;
 
    / **
    *通过国家/地区代码从动态字段中获取已配置的允许区域
     *
    * @参数字符串$ countryCode
    * @参数字符串$ scopeType
    * @param空$ scopeCode
     * @返回数组
     * /
    上市 功能 getAllowedRegionsByDynamicField(
         $ countryCode,
        $ scopeType = ::SCOPE_TYPE_DEFAULT,
        $ scopeCode = 空值
    ) : 数组 {
        $ 配置Path = 内爆(
            '/',
            [
                ::ALLOWED_REGIONS_GROUP_PATH_PREFIX,
                ::ALLOWED_REGIONS_CONFIG_PATH_PREFIX . $ countryCode
            ]
        );
 
        $ rawValue = $ this->scopeConfig->getValue($ 配置Path, $ scopeType, $ scopeCode);
 
        //在逗号或换行符上分割以同时容纳多选
        //和textarea字段类型。
        $ parsedValues = preg_split('/ [,\ n] /', $ rawValue);
 
        返回 $ parsedValues;
    }
 
    / **
    *从动态组中的字段获取配置的允许区域
     *
    * @参数字符串$ countryCode
    * @参数字符串$ scopeType
    * @param空$ scopeCode
     * @返回数组
     * /
    上市 功能 getAllowedRegionsByDynamicGroup(
         $ countryCode,
        $ scopeType = ::SCOPE_TYPE_DEFAULT,
        $ scopeCode = 空值
    ) : 数组 {
        $ 配置Path = 内爆(
            '/',
            [
                ::ALLOWED_REGIONS_TAB_ID,
                ::ALLOWED_REGIONS_SECTION_CONFIG_PATH_PREFIX . $ countryCode,
                ::ALLOWED_REGIONS_CONFIG_PATH_PREFIX . $ countryCode
            ]
        );
 
        $ rawValue = $ this->scopeConfig->getValue($ 配置Path, $ scopeType, $ scopeCode);
 
        //在逗号或换行符上分割以同时容纳多选
        //和textarea字段类型。
        $ parsedValues = preg_split('/ [,\ n] /', $ rawValue);
 
        返回 $ parsedValues;
    }
}

动态部分和标签

与字段和组类似,它’s possible to create an around 插入 上 the setData() method of \Magento\Config\Model\Config\Structure\Element\Tab and add 孩子们 上e level higher than a group. These dynamic sections will show 在 the admin 如 expected. However, clicking 上 them redirects back to 上e of the hard-coded sections. Since each section has its own URL, there are probably additional routing concerns for dynamic sections.

示例模块

这里提供了演示这些代码示例的完整模块: //github.com/ericthehacker/example-dynamicconfigfields。明智地使用它。

请注意以下模块说明。

  • 该模块实现示例动态字段和组,以及检索其值的方法。但是,实际上是使用值来限制可用区域(如示例用例中所述),仅供读者练习。
  • 动态字段和组插件之间存在重复的代码。这是为了确保每个示例插件都易于阅读。

5 评论s

  1. Syed Muneeb Ul Hasan 说:

    那 ’一个详细而出色的教程!

  2. 随机花花公子 说:

    谢谢!这非常有帮助。

  3. 法兰 说:

    然后如何添加图像场,在生成图像场时面临问题。我有自己的backend_model类,我确实在数组中添加了backend_model,但是管理前端上的字段却没有’t似乎上传了文件。 (简单地说,图像字段不’获取backend_model类)。
    顺便说一下,感谢您的出色指导。

  4. 法兰 说:

    感谢非常有用的教程,但是我遇到了图像类型字段的问题,这些字段确实会动态生成,但是我无法上传图像。看来该领域没有得到我“back_end model”类。因此,这就是为什么我不能上传图像。选择图像并保存配置时,图像名称仅显示在该字段中。
    请帮助我,我该如何解决这个问题!

  5. 康志 说:

    嘿!感谢您所学的知识,它确实使我快速获得了预期的结果。但是,此精确解决方案无法正常工作,因为在保存配置时,类\ Magento \ 设定档 \ 模型 \ 设定档无法在直接从后端请求的配置数据中找到组和字段,并且没有有关我们的自定义字段的信息。最好的解决方法我’我们发现有一个遵循\ Magento \ 设定档 \ 模型 \ 设定档 \ 结构体 \ 数据 merge()方法并在其中添加自定义数据的插件。这样,在两种情况下都将显示自定义组和字段:在Admin中渲染字段以及保存它们时。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.

最近的帖子查看全部
2020年10月22日
通过 阿什莉·科利弗 商业见解, 优雅的骆马 2020年10月22日
毫无疑问,2020年是历史性的一年。火灾,全球大流行,暴动,老虎王等’只是冰山一角。如 […]