diff --git a/common/framework/router.php b/common/framework/router.php index 6261195bf..fb977fd74 100644 --- a/common/framework/router.php +++ b/common/framework/router.php @@ -59,6 +59,7 @@ class Router */ protected static $_action_cache_prefix = array(); protected static $_action_cache_module = array(); + protected static $_forwarded_cache = array(); protected static $_route_cache = array(); /** @@ -136,8 +137,8 @@ class Router } // Check other modules. - $all_routes = self::_getAllCachedRoutes(); - foreach ($all_routes->{$method} as $regexp => $action) + $forwarded_routes = self::_getForwardedRoutes(); + foreach ($forwarded_routes[$method] ?: [] as $regexp => $action) { if (preg_match($regexp, $internal_url, $matches)) { @@ -235,10 +236,10 @@ class Router } // Check other modules for $act. - $all_routes = self::_getAllCachedRoutes(); - if (isset($all_routes->reverse[$act])) + $forwarded_routes = self::_getForwardedRoutes(); + if (isset($forwarded_routes['reverse'][$act])) { - $result = self::_getBestMatchingRoute($all_routes->reverse[$act], $args2); + $result = self::_getBestMatchingRoute($forwarded_routes['reverse'][$act], $args2); if ($result !== false) { self::$_route_cache[$keys_string] = '$mid/' . $result . '$act:delete'; @@ -324,20 +325,30 @@ class Router } /** - * Get the list of all cached routes from all modules. + * Get the list of routes that are registered for action-forward. * * @return object */ - protected static function _getAllCachedRoutes() + protected static function _getForwardedRoutes() { - $cache_key = 'site_and_module:action_with_routes'; - $result = Cache::get($cache_key); - if ($result === null) - { - $result = (object)array('GET' => [], 'POST' => [], 'reverse' => []); - Cache::set($cache_key, $result, 0, true); - } - return $result; + if (count(self::$_forwarded_cache)) + { + return self::$_forwarded_cache; + } + + $action_forward = \ModuleModel::getActionForward(); + foreach ($action_forward as $action_name => $action_info) + { + if ($action_info->route_regexp) + { + foreach ($action_info->route_regexp as $regexp_info) + { + self::$_forwarded_cache[$regexp_info[0]][$regexp_info[1]] = [$action_info->module, $action_name]; + } + self::$_forwarded_cache['reverse'][$action_name] = $action_info->route_config; + } + } + return self::$_forwarded_cache; } /** diff --git a/modules/install/install.admin.controller.php b/modules/install/install.admin.controller.php index 931933410..0f757520a 100644 --- a/modules/install/install.admin.controller.php +++ b/modules/install/install.admin.controller.php @@ -24,7 +24,8 @@ class installAdminController extends install $oInstallController = getController('install'); $oInstallController->installModule($module_name, './modules/'.$module_name); - + $oModuleController = getController('module'); + $oModuleController->registerActionForwardRoutes($module_name); $this->setMessage('success_installed'); } @@ -41,13 +42,23 @@ class installAdminController extends install if(!$oModule) throw new Rhymix\Framework\Exceptions\InvalidRequest; Rhymix\Framework\Session::close(); + $output = $oModule->moduleUpdate(); - Rhymix\Framework\Session::start(); if($output instanceof BaseObject && !$output->toBool()) { + Rhymix\Framework\Session::start(); return $output; } + $oModuleController = getController('module'); + $oModuleController->registerActionForwardRoutes($module_name); + if($output instanceof BaseObject && !$output->toBool()) + { + Rhymix\Framework\Session::start(); + return $output; + } + + Rhymix\Framework\Session::start(); $this->setMessage('success_updated'); } diff --git a/modules/module/module.class.php b/modules/module/module.class.php index 248df4c92..0b6060562 100644 --- a/modules/module/module.class.php +++ b/modules/module/module.class.php @@ -133,7 +133,6 @@ class module extends ModuleObject } // check route columns in action_forward table - if(!$oDB->isColumnExists('action_forward', 'route_method')) return true; if(!$oDB->isColumnExists('action_forward', 'route_regexp')) return true; if(!$oDB->isColumnExists('action_forward', 'route_config')) return true; } @@ -455,13 +454,9 @@ class module extends ModuleObject } // check route columns in action_forward table - if(!$oDB->isColumnExists('action_forward', 'route_method')) - { - $oDB->addColumn('action_forward', 'route_method', 'varchar', 30); - } if(!$oDB->isColumnExists('action_forward', 'route_regexp')) { - $oDB->addColumn('action_forward', 'route_regexp', 'varchar', 180); + $oDB->addColumn('action_forward', 'route_regexp', 'text'); } if(!$oDB->isColumnExists('action_forward', 'route_config')) { diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index 8e196c11c..6ab018d5f 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -19,13 +19,12 @@ class moduleController extends module * Action forward finds and forwards if an action is not in the requested module * This is used when installing a module */ - function insertActionForward($module, $type, $act, $route_method = null, $route_regexp = null, $route_config = null) + function insertActionForward($module, $type, $act, $route_regexp = null, $route_config = null) { $args = new stdClass(); $args->module = $module; $args->type = $type; $args->act = $act; - $args->route_method = $route_method; $args->route_regexp = $route_regexp; $args->route_config = $route_config; $output = executeQuery('module.insertActionForward', $args); @@ -1291,6 +1290,78 @@ class moduleController extends module Rhymix\Framework\Cache::clearGroup('site_and_module'); return $output; } + + /** + * Check if all action-forwardable routes are registered. If not, register them. + * + * @param string $module_name + * @return object + */ + public function registerActionForwardRoutes(string $module_name) + { + $action_forward = ModuleModel::getActionForward(); + $module_action_info = ModuleModel::getModuleActionXml($module_name); + + // Get the list of forwardable actions and their routes. + $forwardable_routes = array(); + foreach ($module_action_info->action ?: [] as $action_name => $action_info) + { + if (count($action_info->route) && $action_info->standalone !== 'false') + { + $forwardable_routes[$action_name] = array( + 'type' => $module_action_info->action->{$action_name}->type, + 'regexp' => array(), + 'config' => $action_info->route, + ); + } + } + foreach ($module_action_info->route->GET as $regexp => $action_name) + { + if (isset($forwardable_routes[$action_name])) + { + $forwardable_routes[$action_name]['regexp'][] = ['GET', $regexp]; + } + } + foreach ($module_action_info->route->POST as $regexp => $action_name) + { + if (isset($forwardable_routes[$action_name])) + { + $forwardable_routes[$action_name]['regexp'][] = ['POST', $regexp]; + } + } + + // Insert or delete from the action_forward table. + foreach ($forwardable_routes as $action_name => $route_info) + { + if (!isset($action_forward[$action_name])) + { + $output = $this->insertActionForward($module_name, $route_info['type'], $action_name, + serialize($route_info['regexp']), serialize($route_info['config'])); + if (!$output->toBool()) + { + return $output; + } + } + elseif ($action_forward[$action_name]->route_regexp !== $route_info['regexp'] || + $action_forward[$action_name]->route_config !== $route_info['config']) + { + $output = $this->deleteActionForward($module_name, $route_info['type'], $action_name); + if (!$output->toBool()) + { + return $output; + } + + $output = $this->insertActionForward($module_name, $route_info['type'], $action_name, + serialize($route_info['regexp']), serialize($route_info['config'])); + if (!$output->toBool()) + { + return $output; + } + } + } + + return new BaseObject(); + } } /* End of file module.controller.php */ /* Location: ./modules/module/module.controller.php */ diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 260983caa..e5cf24234 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -567,7 +567,7 @@ class moduleModel extends module /** * @brief Get forward value by the value of act */ - public static function getActionForward($act) + public static function getActionForward($act = null) { $action_forward = Rhymix\Framework\Cache::get('action_forward'); if($action_forward === null) @@ -582,12 +582,18 @@ class moduleModel extends module $action_forward = array(); foreach($output->data as $item) { + if ($item->route_regexp) $item->route_regexp = unserialize($item->route_regexp); + if ($item->route_config) $item->route_config = unserialize($item->route_config); $action_forward[$item->act] = $item; } Rhymix\Framework\Cache::set('action_forward', $action_forward, 0, true); } + if(!isset($act)) + { + return $action_forward; + } if(!isset($action_forward[$act])) { return; @@ -723,30 +729,7 @@ class moduleModel extends module $info = Rhymix\Framework\Cache::get($cache_key); if($info === null) { - // Load the XML file. $info = Rhymix\Framework\Parsers\ModuleActionParser::loadXML($xml_file); - - // Add all routes from the module to a global list. - $action_cache_key = 'site_and_module:action_with_routes'; - $action_with_routes = Rhymix\Framework\Cache::get($action_cache_key) ?: (object)array('GET' => [], 'POST' => [], 'reverse' => []); - foreach ($info->route->GET as $regexp => $action) - { - $action_with_routes->GET[$regexp] = [$module, $action]; - } - foreach ($info->route->POST as $regexp => $action) - { - $action_with_routes->POST[$regexp] = [$module, $action]; - } - foreach ($info->action as $action_name => $action_info) - { - if (count($action_info->route) && $action_info->standalone !== 'false') - { - $action_with_routes->reverse[$action_name] = $action_info->route; - } - } - - // Set cache entries. - Rhymix\Framework\Cache::set($action_cache_key, $action_with_routes, 0, true); Rhymix\Framework\Cache::set($cache_key, $info, 0, true); } @@ -1361,12 +1344,12 @@ class moduleModel extends module $searched_count = count($searched_list); if(!$searched_count) return; + + // Get action forward + $action_forward = self::getActionForward(); - for($i=0;$i<$searched_count;$i++) + foreach ($searched_list as $module_name) { - // module name - $module_name = $searched_list[$i]; - $path = ModuleHandler::getModulePath($module_name); if(!is_dir(FileHandler::getRealPath($path))) continue; @@ -1403,16 +1386,50 @@ class moduleModel extends module { $info->need_install = false; } + // Check if it is upgraded to module.class.php on each module - $oDummy = null; $oDummy = getModule($module_name, 'class'); if($oDummy && method_exists($oDummy, "checkUpdate")) { $info->need_update = $oDummy->checkUpdate(); } - else + unset($oDummy); + + // Check if all action-forwardable routes are registered + $module_action_info = self::getModuleActionXml($module_name); + $forwardable_routes = array(); + foreach ($module_action_info->action ?: [] as $action_name => $action_info) { - continue; + if (count($action_info->route) && $action_info->standalone !== 'false') + { + $forwardable_routes[$action_name] = array( + 'regexp' => array(), + 'config' => $action_info->route, + ); + } + } + foreach ($module_action_info->route->GET as $regexp => $action_name) + { + if (isset($forwardable_routes[$action_name])) + { + $forwardable_routes[$action_name]['regexp'][] = ['GET', $regexp]; + } + } + foreach ($module_action_info->route->POST as $regexp => $action_name) + { + if (isset($forwardable_routes[$action_name])) + { + $forwardable_routes[$action_name]['regexp'][] = ['POST', $regexp]; + } + } + foreach ($forwardable_routes as $action_name => $route_info) + { + if (!isset($action_forward[$action_name]) || + $action_forward[$action_name]->route_regexp !== $route_info['regexp'] || + $action_forward[$action_name]->route_config !== $route_info['config']) + { + $info->need_update = true; + } } } $list[] = $info; diff --git a/modules/module/queries/insertActionForward.xml b/modules/module/queries/insertActionForward.xml index 20d4d52ec..d2cb1bc68 100644 --- a/modules/module/queries/insertActionForward.xml +++ b/modules/module/queries/insertActionForward.xml @@ -6,7 +6,6 @@ - diff --git a/modules/module/schemas/action_forward.xml b/modules/module/schemas/action_forward.xml index c14824218..2a1989a89 100644 --- a/modules/module/schemas/action_forward.xml +++ b/modules/module/schemas/action_forward.xml @@ -2,7 +2,6 @@ - - +