Revise handlePageAction() + getInstalledPlugins()

This commit is contained in:
billz 2024-11-05 18:27:24 -08:00
parent 3a19ed9c3d
commit 63924c26ac
2 changed files with 46 additions and 23 deletions

View file

@ -21,11 +21,5 @@ interface PluginInterface {
* @param Sidebar $sidebar Sidebar instance for adding items
*/
public function initialize(Sidebar $sidebar): void;
/**
* Provide template data for rendering
* @return array
*/
public function getTemplateData(): array;
}

View file

@ -42,12 +42,12 @@ class PluginManager {
foreach ($directories as $dir) {
$pluginName = basename($dir);
$pluginFile = "$dir/$pluginName.php";
$pluginClass = "RaspAP\\Plugins\\$pluginName\\$pluginName"; // fully qualified class name
if (file_exists($pluginFile)) {
require_once $pluginFile;
$className = "RaspAP\\Plugins\\$pluginName\\$pluginName"; // Fully qualified class name
if (class_exists($className)) {
$plugin = new $className();
if (class_exists($pluginClass)) {
$plugin = new $pluginClass($this->pluginPath, $pluginName);
$this->registerPlugin($plugin);
}
}
@ -90,31 +90,60 @@ class PluginManager {
return $this->sidebar;
}
// Forwards the page to the responsible plugin
public function handlePageAction(string $page): void {
foreach ($this->getInstalledPlugins() as $plugin) {
if (str_starts_with($page, "/plugin__" . $plugin . "__")) {
require_once($this->pluginPath . "/" . $plugin . "/functions.php");
$function = '\\' . $plugin . '\\pluginHandlePageAction';
$function($page);
/**
* Iterate over each registered plugin and calls its associated method
* @param string $page
* @return boolean
*/
public function handlePageAction(string $page) {
foreach ($this->getInstalledPlugins() as $pluginClass) {
$pluginName = (new \ReflectionClass($pluginClass))->getShortName();
$plugin = new $pluginClass($this->pluginPath, $pluginName);
if ($plugin instanceof PluginInterface) {
// check if the page matches this plugin's action
if (strpos($page, "/plugin__{$plugin->getName()}") === 0) {
$functions = "{$this->pluginPath}/{$plugin->getName()}/functions.php";
if (file_exists($functions)) {
require_once $functions;
// define the namespaced function
$function = '\\' . $plugin->getName() . '\\handlePageAction';
// call the function if it exists, passing the page and PluginManager instance
if (function_exists($function)) {
$function($page, $this, $pluginName);
return true;
}
} else {
throw new \Exception("Functions file not found for plugin: {$plugin->getName()}");
}
}
}
}
}
// Returns all installed plugins
// Returns all installed plugins with full class names
public function getInstalledPlugins(): array {
$plugins = [];
if (file_exists($this->pluginPath)) {
$files = scandir($this->pluginPath);
foreach ($files as $file) {
if ($file === "." || $file === "..") continue;
$filePath = $this->pluginPath . '/' . $file;
if (is_dir($filePath)) {
$plugins[] = $file;
$directories = scandir($this->pluginPath);
foreach ($directories as $directory) {
if ($directory === "." || $directory === "..") continue;
$pluginClass = "RaspAP\\Plugins\\$directory\\$directory";
$pluginFile = $this->pluginPath . "/$directory/$directory.php";
// Check if the file and class exist
if (file_exists($pluginFile) && class_exists($pluginClass)) {
$plugins[] = $pluginClass;
}
}
}
return $plugins;
}
}