From 4f9f641067dd9db553724bcc097c10971c8e7962 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Fri, 11 Aug 2023 02:04:59 +0900 Subject: [PATCH] Add regexp to config for custom namespaces --- modules/module/module.controller.php | 22 ++++++++++++++++++++-- modules/module/module.model.php | 8 ++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index d64d050be..b3bda8691 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -1457,20 +1457,38 @@ class ModuleController extends Module { if(!isset($namespaces[$name])) { - $namespaces[$name] = $module_name; + $namespaces[$name] = 'modules/' . $module_name; $changed = true; } } // Remove namespaces that are no longer defined by this module. - foreach ($namespaces as $name => $attached_module) + foreach ($namespaces as $name => $path) { + $attached_module = preg_replace('!^modules/!', '', $path); if ($attached_module === $module_name && !in_array($name, $module_action_info->namespaces ?? [])) { unset($namespaces[$name]); + $changed = true; } } + // Generate a regular expression for routing. + $regexp = []; + unset($namespaces['regexp']); + foreach ($namespaces as $name => $path) + { + $regexp[] = preg_quote(strtr($name, '\\', '/'), '!'); + } + if (count($regexp)) + { + $namespaces['regexp'] = '!^(' . implode('|', $regexp) . ')/(\\w+/)*(\\w+)$!'; + } + else + { + $namespaces['regexp'] = ''; + } + // Update system configuration. if ($changed) { diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 539a1e150..b271670a0 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -1673,6 +1673,14 @@ class ModuleModel extends Module $info->need_update = true; } } + foreach ($namespaces as $name => $path) + { + $attached_module = preg_replace('!^modules/!', '', $path); + if ($attached_module === $module_name && !in_array($name, $module_action_info->namespaces ?? [])) + { + $info->need_update = true; + } + } // Check if all prefixes are registered. foreach ($module_action_info->prefixes ?? [] as $name)