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