diff --git a/module/custom/model.php b/module/custom/model.php index b20fade15c..0caa21b4bd 100644 --- a/module/custom/model.php +++ b/module/custom/model.php @@ -225,7 +225,7 @@ class customModel extends model $group = 0; foreach($menu as $item) { - if($module == 'main' && isset($dividerOrders[$item->name]) && $dividerOrders[$item->name] > $group) + if($module == 'main' && isset($item->name) && isset($dividerOrders[$item->name]) && $dividerOrders[$item->name] > $group) { $menu[$item->order]->divider = $isFirst ? false : true; $group = $dividerOrders[$item->name]; @@ -322,6 +322,7 @@ class customModel extends model $subMenu = array(); $label = $link; $hasPriv = true; + $method = ''; if(strpos($link, '|') !== false) { $link = explode('|', $link); diff --git a/module/custom/test/lib/custom.unittest.class.php b/module/custom/test/lib/custom.unittest.class.php index 1d6315241e..f9f186e960 100755 --- a/module/custom/test/lib/custom.unittest.class.php +++ b/module/custom/test/lib/custom.unittest.class.php @@ -741,55 +741,39 @@ class customTest /** * Test setMenuByConfig method. * - * @param string $module main|product|my and so on + * @param object|array $allMenu + * @param string|array $customMenu + * @param string $module * @static * @access public - * @return string|array + * @return string */ - public static function setMenuByConfigTest(string $module = 'main'): string|array + public static function setMenuByConfigTest(object|array $allMenu, string|array $customMenu, string $module = 'main'): string { - global $config, $lang; + global $lang, $app; try { - // 初始化菜单对象 - $allMenu = new stdclass(); - - // 模拟不同模块的菜单配置 - if($module == 'main' && !empty($lang->menu)) { - $allMenu = $lang->menu; - } elseif($module != 'main' && isset($lang->menu->$module) && isset($lang->menu->{$module}['subMenu'])) { - $allMenu = $lang->menu->{$module}['subMenu']; - } else { - // 为测试创建基本菜单结构 - $allMenu = new stdclass(); - $allMenu->index = array('link' => '/', 'text' => '首页'); - $allMenu->dashboard = array('link' => '/dashboard', 'text' => '仪表盘'); + // 确保全局语言对象存在 + if(!isset($lang)) { + $lang = new stdclass(); } - // 处理产品模块的分支菜单 - if($module == 'product' && isset($allMenu->branch)) { - $allMenu->branch = str_replace('@branch@', isset($lang->custom->branch) ? $lang->custom->branch : '分支', $allMenu->branch); + // 设置应用tab,如果不存在 + if(!isset($app->tab)) { + $app = new stdclass(); + $app->tab = $module; } - // 处理地盘模块的评分功能 - if($module == 'my' && empty($config->global->scoreStatus)) { - if(isset($allMenu->score)) unset($allMenu->score); + // 初始化语言菜单顺序,避免未定义变量错误 + if(!isset($lang->{$app->tab})) { + $lang->{$app->tab} = new stdclass(); + $lang->{$app->tab}->menuOrder = array(); } - // 获取自定义菜单配置 - $flowModule = isset($config->global->flow) ? $config->global->flow . '_main' : 'full_main'; - $customMenu = isset($config->customMenu->$flowModule) ? $config->customMenu->$flowModule : array(); - - // 处理JSON格式的自定义菜单 - if(!empty($customMenu) && is_string($customMenu) && substr($customMenu, 0, 1) === '[') { - $customMenu = json_decode($customMenu, true); - } - - // 构建自定义菜单映射 - list($customMenuMap, $order) = customModel::buildCustomMenuMap($allMenu, $customMenu, $module); - // 调用实际的setMenuByConfig方法 - $result = customModel::setMenuByConfig($allMenu, $customMenuMap, $module); + $result = customModel::setMenuByConfig($allMenu, $customMenu, $module); + + if(dao::isError()) return 'error'; // 返回结果类型用于测试验证 if(is_array($result)) { diff --git a/module/custom/test/model/setmenubyconfig.php b/module/custom/test/model/setmenubyconfig.php index df79266b51..be605d7dcf 100755 --- a/module/custom/test/model/setmenubyconfig.php +++ b/module/custom/test/model/setmenubyconfig.php @@ -7,31 +7,29 @@ title=测试 customModel::setMenuByConfig(); timeout=0 cid=0 -- 测试步骤1:设置主菜单带有效数据 @array -- 测试步骤2:设置产品菜单带分支数据 @array -- 测试步骤3:设置地盘菜单排除评分功能 @array -- 测试步骤4:设置无效模块菜单 @array -- 测试步骤5:设置项目菜单 @array -- 测试步骤6:设置执行菜单 @array -- 测试步骤7:设置测试菜单 @array +- 测试步骤1:使用标准对象菜单和空自定义菜单测试主模块 @array +- 测试步骤2:使用数组菜单和JSON字符串自定义菜单测试 @array +- 测试步骤3:测试空菜单对象的情况 @array +- 测试步骤4:测试带有分割线配置的菜单 @array +- 测试步骤5:测试无效模块菜单处理 @array */ include dirname(__FILE__, 5) . '/test/lib/init.php'; include dirname(__FILE__, 2) . '/lib/custom.unittest.class.php'; +ob_start(); zenData('lang')->loadYaml('lang')->gen(15); zenData('user')->gen(5); +ob_end_clean(); su('admin'); $customTester = new customTest(); -r($customTester->setMenuByConfigTest('main')) && p() && e('array'); // 测试步骤1:设置主菜单带有效数据 -r($customTester->setMenuByConfigTest('product')) && p() && e('array'); // 测试步骤2:设置产品菜单带分支数据 -r($customTester->setMenuByConfigTest('my')) && p() && e('array'); // 测试步骤3:设置地盘菜单排除评分功能 -r($customTester->setMenuByConfigTest('invalid')) && p() && e('array'); // 测试步骤4:设置无效模块菜单 -r($customTester->setMenuByConfigTest('project')) && p() && e('array'); // 测试步骤5:设置项目菜单 -r($customTester->setMenuByConfigTest('execution')) && p() && e('array'); // 测试步骤6:设置执行菜单 -r($customTester->setMenuByConfigTest('qa')) && p() && e('array'); // 测试步骤7:设置测试菜单 +r($customTester->setMenuByConfigTest((object)array('home' => 'Home|index|index', 'project' => 'Project|project|index'), array(), 'main')) && p() && e('array'); // 测试步骤1:使用标准对象菜单和空自定义菜单测试主模块 +r($customTester->setMenuByConfigTest(array('task' => 'Task|task|browse', 'bug' => 'Bug|bug|browse'), '[{"name":"task","order":1},{"name":"bug","order":2}]', 'product')) && p() && e('array'); // 测试步骤2:使用数组菜单和JSON字符串自定义菜单测试 +r($customTester->setMenuByConfigTest(new stdclass(), array(), '')) && p() && e('array'); // 测试步骤3:测试空菜单对象的情况 +r($customTester->setMenuByConfigTest((object)array('index' => 'Home|index|index', 'divider' => '-', 'project' => 'Project|project|index'), array(), 'main')) && p() && e('array'); // 测试步骤4:测试带有分割线配置的菜单 +r($customTester->setMenuByConfigTest((object)array('custom' => 'Custom|custom|index'), array(), 'invalid')) && p() && e('array'); // 测试步骤5:测试无效模块菜单处理 zenData('lang')->gen(0); \ No newline at end of file