refactor: 修改处理配置附加项

This commit is contained in:
2025-03-07 18:15:12 +08:00
parent 00539bbe03
commit 307bb2bcf4

View File

@@ -1,5 +1,6 @@
<?php <?php
declare (strict_types = 1);
declare(strict_types=1);
namespace app\admin\controller\v1; namespace app\admin\controller\v1;
@@ -42,7 +43,7 @@ class SiteConfig
->groupId(array_column($groups, 'id')) ->groupId(array_column($groups, 'id'))
->order(['sort' => 'asc', 'id' => 'desc']) ->order(['sort' => 'asc', 'id' => 'desc'])
->select() ->select()
->each(function($item) { ->each(function ($item) {
// 修改字段为null的输出为空字符串 // 修改字段为null的输出为空字符串
$keys = array_keys($item->toArray()); $keys = array_keys($item->toArray());
foreach ($keys as $key) { foreach ($keys as $key) {
@@ -58,12 +59,7 @@ class SiteConfig
} }
// 处理附加配置项及联动项 // 处理附加配置项及联动项
$config_name_map = []; $configs = $this->handleExtra($configs);
foreach ($configs as $config) {
unset($config['group_id']);
$config_name_map[$config['name']] = $config;
}
$configs = $this->handleExtra($configs, $config_name_map);
// 组合数据 // 组合数据
$config_group_map = []; $config_group_map = [];
@@ -82,50 +78,66 @@ class SiteConfig
return success('获取成功', $groups); return success('获取成功', $groups);
} }
// 处理配置联动项数据 // 处理配置联动项数据
private function handleExtra($data, $map) private function handleExtra($data)
{ {
$ret = []; list($list, $map) = $this->parseExtra($data);
$need_delete_names = []; return $this->buildExtra($list, $map);
foreach ($data as $val) { }
private function parseExtra($data)
{
$linkage_names = [];
foreach ($data as &$val) {
if (!empty($val['extra'])) { if (!empty($val['extra'])) {
$extra = explode(PHP_EOL, $val['extra']); $extra = explode(PHP_EOL, $val['extra']);
$val['extra'] = [];
foreach ($extra as $v) { foreach ($extra as $v) {
if (preg_match('/^([^:]+):(.+)\[(.+)\]$/i', $v, $match)) { if (preg_match('/^([^:]+):(.+)\[(.+)\]$/i', $v, $match)) {
$item = [ $item = [
'name' => $match[2], 'name' => $match[2],
'value' => $match[1] 'value' => $match[1],
'linkage_names' => array_map(function ($it) {
return trim(trim($it), "'");
}, explode(',', $match[3]))
]; ];
if (isset($match[3])) { $linkage_names = array_merge($linkage_names, $item['linkage_names']);
$children = []; $val['extra'][] = $item;
$names = explode(',', $match[3]);
foreach ($names as $name) {
$name = trim(trim($name), "'");
$need_delete_names[] = $name;
if (!empty($map[$name])) {
$children[] = $map[$name];
}
}
// 处理子级
if (!empty($children)) {
$item['children'] = $this->handleExtra($children, $map);
}
}
unset($val['extra']);
if (!isset($val['extras'])) {
$val['extras'] = [];
}
$val['extras'][] = $item;
} }
} }
} }
$ret[] = $val;
} }
// 删除多余的配置项 unset($val);
foreach ($ret as $k => $it) {
if (in_array($it['name'], $need_delete_names)) { $linkage_data = [];
unset($ret[$k]); foreach ($data as $key => $val) {
if (in_array($val['name'], $linkage_names)) {
$linkage_data[$val['name']] = $val;
unset($data[$key]);
} }
} }
return [$data, $linkage_data];
}
private function buildExtra($data, $linkage_data)
{
$ret = [];
foreach ($data as $val) {
if (!empty($val['extra'])) {
foreach ($val['extra'] as &$v) {
$linkage_names = $v['linkage_names'];
unset($v['linkage_names']);
$children = [];
foreach ($linkage_names as $name) {
if (!empty($linkage_data[$name])) {
$children[] = $linkage_data[$name];
}
}
$v['children'] = $this->handleExtra($children);
}
unset($v);
}
$ret[] = $val;
}
return $ret; return $ret;
} }