From 8dcb2b47628346226b18940b5cde7849f7a24687 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sun, 23 Dec 2012 23:05:51 +0400 Subject: [PATCH] implement plugin routing masks, add example plugin --- backend.php | 14 +++++-- classes/handler.php | 2 +- classes/ihandler.php | 7 ++++ classes/pluginhost.php | 31 +++++++++++++- include/functions.php | 4 ++ plugins/example_routing/example_routing.php | 46 +++++++++++++++++++++ public.php | 11 ++++- 7 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 classes/ihandler.php create mode 100644 plugins/example_routing/example_routing.php diff --git a/backend.php b/backend.php index 8aaf1001..2cac8232 100644 --- a/backend.php +++ b/backend.php @@ -118,10 +118,18 @@ $op = str_replace("-", "_", $op); - if (class_exists($op)) { - $handler = new $op($link, $_REQUEST); + global $pluginhost; + $override = $pluginhost->lookup_handler($op, $method); - if ($handler && is_subclass_of($handler, 'Handler')) { + if (class_exists($op) || $override) { + + if ($override) { + $handler = $override; + } else { + $handler = new $op($link, $_REQUEST); + } + + if ($handler && implements_interface($handler, 'IHandler')) { if (validate_csrf($csrf_token) || $handler->csrf_ignore($method)) { if ($handler->before($method)) { if ($method && method_exists($handler, $method)) { diff --git a/classes/handler.php b/classes/handler.php index e00b36aa..68b16eac 100644 --- a/classes/handler.php +++ b/classes/handler.php @@ -1,5 +1,5 @@ diff --git a/classes/pluginhost.php b/classes/pluginhost.php index d7926fa4..b28d2511 100644 --- a/classes/pluginhost.php +++ b/classes/pluginhost.php @@ -3,6 +3,7 @@ class PluginHost { private $link; private $hooks = array(); private $plugins = array(); + private $handlers = array(); const HOOK_ARTICLE_BUTTON = 1; const HOOK_ARTICLE_FILTER = 2; @@ -62,7 +63,7 @@ class PluginHost { foreach ($plugins as $class) { $class = trim($class); - $class_file = str_replace("_", "/", strtolower(basename($class))); + $class_file = strtolower(basename($class)); $file = dirname(__FILE__)."/../plugins/$class_file/$class_file.php"; if (file_exists($file)) require_once $file; @@ -75,5 +76,33 @@ class PluginHost { } } + function add_handler($handler, $method, $sender) { + $handler = strtolower($handler); + $method = strtolower($method); + + if (!is_array($this->handlers[$handler])) { + $this->handlers[$handler] = array(); + } + + $this->handlers[$handler][$method] = $sender; + } + + function del_handler($handler, $method) { + $handler = strtolower($handler); + $method = strtolower($method); + + unset($this->handlers[$handler][$method]); + } + + function lookup_handler($handler, $method) { + $handler = strtolower($handler); + $method = strtolower($method); + + if (is_array($this->handlers[$handler])) { + return $this->handlers[$handler][$method]; + } + + return false; + } } ?> diff --git a/include/functions.php b/include/functions.php index a4caf9fd..b338bde5 100644 --- a/include/functions.php +++ b/include/functions.php @@ -5576,4 +5576,8 @@ return $rc; } + function implements_interface($class, $interface) { + return in_array($interface, class_implements($class)); + } + ?> diff --git a/plugins/example_routing/example_routing.php b/plugins/example_routing/example_routing.php new file mode 100644 index 00000000..a5c4e613 --- /dev/null +++ b/plugins/example_routing/example_routing.php @@ -0,0 +1,46 @@ +link = $host->get_link(); + $this->host = $host; + + $host->add_handler("test", "example", $this); + $host->add_handler("public", "getunread", $this); + } + + function getunread() { + print rand(0,100); # yeah right + } + + function example() { + print "example method called"; + } + + function csrf_ignore($method) { + return true; + } + + function before($method) { + return true; + } + + function after() { + return true; + } + +} +?> diff --git a/public.php b/public.php index 59e0ef2e..4cf7653f 100644 --- a/public.php +++ b/public.php @@ -40,9 +40,16 @@ $method = $_REQUEST["op"]; - $handler = new Handler_Public($link, $_REQUEST); + global $pluginhost; + $override = $pluginhost->lookup_handler("public", $method); - if ($handler->before($method)) { + if ($override) { + $handler = $override; + } else { + $handler = new Handler_Public($link, $_REQUEST); + } + + if (implements_interface($handler, "IHandler") && $handler->before($method)) { if ($method && method_exists($handler, $method)) { $handler->$method(); } else if (method_exists($handler, 'index')) { -- 2.39.2