mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-05 09:41:40 +09:00
Support custom namespaces in ModuleHandler and related processes
This commit is contained in:
parent
9e13c5ee6e
commit
7502b7308b
4 changed files with 107 additions and 33 deletions
|
|
@ -414,7 +414,15 @@ class ModuleHandler extends Handler
|
||||||
// Create an instance of the requested module and class
|
// Create an instance of the requested module and class
|
||||||
if($class_name)
|
if($class_name)
|
||||||
{
|
{
|
||||||
$class_fullname = sprintf('Rhymix\\Modules\\%s\\%s', $this->module, $class_name);
|
if (isset($xml_info->namespaces) && count($xml_info->namespaces))
|
||||||
|
{
|
||||||
|
$class_fullname = array_first($xml_info->namespaces) . '\\' . $class_name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$class_fullname = sprintf('Rhymix\\Modules\\%s\\%s', $this->module, $class_name);
|
||||||
|
}
|
||||||
|
|
||||||
if (class_exists($class_fullname))
|
if (class_exists($class_fullname))
|
||||||
{
|
{
|
||||||
$oModule = $class_fullname::getInstance();
|
$oModule = $class_fullname::getInstance();
|
||||||
|
|
@ -442,19 +450,7 @@ class ModuleHandler extends Handler
|
||||||
$oModule = self::getModuleInstance($this->module, $type ?: 'class', $kind);
|
$oModule = self::getModuleInstance($this->module, $type ?: 'class', $kind);
|
||||||
if (!$oModule)
|
if (!$oModule)
|
||||||
{
|
{
|
||||||
$base_class_fullname = sprintf('Rhymix\\Modules\\%s\\Base', $this->module);
|
$oModule = ModuleModel::getModuleBaseClass($this->module, $xml_info);
|
||||||
if (class_exists($base_class_fullname))
|
|
||||||
{
|
|
||||||
$oModule = $base_class_fullname::getInstance();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$base_class_fullname = sprintf('Rhymix\\Modules\\%s\\Controllers\\Base', $this->module);
|
|
||||||
if (class_exists($base_class_fullname))
|
|
||||||
{
|
|
||||||
$oModule = $base_class_fullname::getInstance();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -548,7 +544,15 @@ class ModuleHandler extends Handler
|
||||||
|
|
||||||
if($forward->class_name)
|
if($forward->class_name)
|
||||||
{
|
{
|
||||||
$class_fullname = sprintf('Rhymix\\Modules\\%s\\%s', $forward->module, $forward->class_name);
|
if (isset($xml_info->namespaces) && count($xml_info->namespaces))
|
||||||
|
{
|
||||||
|
$class_fullname = array_first($xml_info->namespaces) . '\\' . $forward->class_name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$class_fullname = sprintf('Rhymix\\Modules\\%s\\%s', $forward->module, $forward->class_name);
|
||||||
|
}
|
||||||
|
|
||||||
if (class_exists($class_fullname))
|
if (class_exists($class_fullname))
|
||||||
{
|
{
|
||||||
$oModule = $class_fullname::getInstance();
|
$oModule = $class_fullname::getInstance();
|
||||||
|
|
@ -1291,7 +1295,7 @@ class ModuleHandler extends Handler
|
||||||
// Get instance of module class
|
// Get instance of module class
|
||||||
if (strpos($type, '\\') !== false)
|
if (strpos($type, '\\') !== false)
|
||||||
{
|
{
|
||||||
$class_name = sprintf('Rhymix\\Modules\\%s\\%s', $module, $type);
|
$class_name = ($type[0] === '\\') ? $type : sprintf('Rhymix\\Modules\\%s\\%s', $module, $type);
|
||||||
if (class_exists($class_name))
|
if (class_exists($class_name))
|
||||||
{
|
{
|
||||||
$oModule = $class_name::getInstance();
|
$oModule = $class_name::getInstance();
|
||||||
|
|
|
||||||
|
|
@ -242,6 +242,18 @@ class ModuleActionParser extends BaseParser
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parse custom namespaces.
|
||||||
|
foreach ($xml->namespaces->namespace ?: [] as $namespace)
|
||||||
|
{
|
||||||
|
$info->namespaces[] = strval($namespace['name']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse custom prefixes.
|
||||||
|
foreach ($xml->prefixes->prefix ?: [] as $prefix)
|
||||||
|
{
|
||||||
|
$info->prefixes[] = strval($prefix['name']);
|
||||||
|
}
|
||||||
|
|
||||||
// Parse error handlers.
|
// Parse error handlers.
|
||||||
foreach ($xml->errorHandlers->errorHandler ?: [] as $errorHandler)
|
foreach ($xml->errorHandlers->errorHandler ?: [] as $errorHandler)
|
||||||
{
|
{
|
||||||
|
|
@ -253,14 +265,23 @@ class ModuleActionParser extends BaseParser
|
||||||
foreach ($xml->eventHandlers->eventHandler ?: [] as $eventHandler)
|
foreach ($xml->eventHandlers->eventHandler ?: [] as $eventHandler)
|
||||||
{
|
{
|
||||||
$attrs = self::_getAttributes($eventHandler);
|
$attrs = self::_getAttributes($eventHandler);
|
||||||
$def = new \stdClass;
|
|
||||||
foreach (['before', 'after', 'beforeaction', 'afteraction'] as $key)
|
foreach (['before', 'after', 'beforeaction', 'afteraction'] as $key)
|
||||||
{
|
{
|
||||||
if (isset($attrs[$key]))
|
if (isset($attrs[$key]))
|
||||||
{
|
{
|
||||||
|
if (count($info->namespaces) && str_contains($attrs['class'], '\\'))
|
||||||
|
{
|
||||||
|
$namespace = '\\' . array_first($info->namespaces) . '\\';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$namespace = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$def = new \stdClass;
|
||||||
$def->event_name = (str_contains($key, 'action') ? 'act:' : '') . $attrs[$key];
|
$def->event_name = (str_contains($key, 'action') ? 'act:' : '') . $attrs[$key];
|
||||||
$def->position = str_starts_with($key, 'before') ? 'before' : 'after';
|
$def->position = str_starts_with($key, 'before') ? 'before' : 'after';
|
||||||
$def->class_name = $attrs['class'];
|
$def->class_name = $namespace . $attrs['class'];
|
||||||
$def->method = $attrs['method'];
|
$def->method = $attrs['method'];
|
||||||
$info->event_handlers[] = $def;
|
$info->event_handlers[] = $def;
|
||||||
break;
|
break;
|
||||||
|
|
@ -269,18 +290,6 @@ class ModuleActionParser extends BaseParser
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse custom namespaces.
|
|
||||||
foreach ($xml->namespaces->namespace ?: [] as $namespace)
|
|
||||||
{
|
|
||||||
$info->namespaces[] = strval($namespace['name']);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse custom prefixes.
|
|
||||||
foreach ($xml->prefixes->prefix ?: [] as $prefix)
|
|
||||||
{
|
|
||||||
$info->prefixes[] = strval($prefix['name']);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the complete result.
|
// Return the complete result.
|
||||||
return $info;
|
return $info;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1418,6 +1418,9 @@ class ModuleController extends Module
|
||||||
// Remove event handlers that are no longer defined by this module.
|
// Remove event handlers that are no longer defined by this module.
|
||||||
if (count($registered_event_handlers))
|
if (count($registered_event_handlers))
|
||||||
{
|
{
|
||||||
|
// Refresh cache
|
||||||
|
ModuleModel::getTriggers('null', 'null');
|
||||||
|
|
||||||
foreach ($GLOBALS['__triggers__'] as $trigger_name => $val1)
|
foreach ($GLOBALS['__triggers__'] as $trigger_name => $val1)
|
||||||
{
|
{
|
||||||
foreach ($val1 as $called_position => $val2)
|
foreach ($val1 as $called_position => $val2)
|
||||||
|
|
|
||||||
|
|
@ -1424,6 +1424,48 @@ class ModuleModel extends Module
|
||||||
return $list;
|
return $list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get module base class
|
||||||
|
*
|
||||||
|
* This method supports namespaced modules as well as XE-compatible modules.
|
||||||
|
*
|
||||||
|
* @param string $module_name
|
||||||
|
* @return ModuleObject|null
|
||||||
|
*/
|
||||||
|
public static function getModuleBaseClass(string $module_name, ?object $module_action_info = null)
|
||||||
|
{
|
||||||
|
if (!$module_action_info)
|
||||||
|
{
|
||||||
|
$module_action_info = self::getModuleActionXml($module_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($module_action_info->namespaces) && count($module_action_info->namespaces))
|
||||||
|
{
|
||||||
|
$namespace = array_first($module_action_info->namespaces);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$namespace = 'Rhymix\\Modules\\' . ucfirst($module_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
$class_name = $namespace . '\\Base';
|
||||||
|
if (class_exists($class_name))
|
||||||
|
{
|
||||||
|
return $class_name::getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
$class_name = $namespace . '\\Controllers\\Base';
|
||||||
|
if (class_exists($class_name))
|
||||||
|
{
|
||||||
|
return $class_name::getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($oModule = getModule($module_name, 'class'))
|
||||||
|
{
|
||||||
|
return $oModule;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get module install class
|
* Get module install class
|
||||||
*
|
*
|
||||||
|
|
@ -1432,18 +1474,34 @@ class ModuleModel extends Module
|
||||||
* @param string $module_name
|
* @param string $module_name
|
||||||
* @return ModuleObject|null
|
* @return ModuleObject|null
|
||||||
*/
|
*/
|
||||||
public static function getModuleInstallClass(string $module_name)
|
public static function getModuleInstallClass(string $module_name, ?object $module_action_info = null)
|
||||||
{
|
{
|
||||||
$class_name = 'Rhymix\\Modules\\' . ucfirst($module_name) . '\\Install';
|
if (!$module_action_info)
|
||||||
|
{
|
||||||
|
$module_action_info = self::getModuleActionXml($module_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($module_action_info->namespaces) && count($module_action_info->namespaces))
|
||||||
|
{
|
||||||
|
$namespace = array_first($module_action_info->namespaces);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$namespace = 'Rhymix\\Modules\\' . ucfirst($module_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
$class_name = $namespace . '\\Install';
|
||||||
if (class_exists($class_name))
|
if (class_exists($class_name))
|
||||||
{
|
{
|
||||||
return $class_name::getInstance();
|
return $class_name::getInstance();
|
||||||
}
|
}
|
||||||
$class_name = 'Rhymix\\Modules\\' . ucfirst($module_name) . '\\Controllers\\Install';
|
|
||||||
|
$class_name = $namespace . '\\Controllers\\Install';
|
||||||
if (class_exists($class_name))
|
if (class_exists($class_name))
|
||||||
{
|
{
|
||||||
return $class_name::getInstance();
|
return $class_name::getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($oModule = getModule($module_name, 'class'))
|
if ($oModule = getModule($module_name, 'class'))
|
||||||
{
|
{
|
||||||
return $oModule;
|
return $oModule;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue