diff options
author | emkael <emkael@tlen.pl> | 2016-05-06 17:10:01 +0200 |
---|---|---|
committer | emkael <emkael@tlen.pl> | 2016-05-06 17:10:01 +0200 |
commit | 5888fa8b601963cbea68462116577332404fe138 (patch) | |
tree | 15e0c4743189f369fb8c168b6b40cf06788c9756 | |
parent | 93a8bca97a8d5453a206c402efce5fdd0e9dae72 (diff) |
* application event handling module
-rw-r--r-- | app/php/application.xml | 2 | ||||
-rw-r--r-- | app/php/events/EventModule.php | 53 | ||||
-rw-r--r-- | app/php/events/config.xml | 6 |
3 files changed, 61 insertions, 0 deletions
diff --git a/app/php/application.xml b/app/php/application.xml index b89de7e..ec23f55 100644 --- a/app/php/application.xml +++ b/app/php/application.xml @@ -15,6 +15,8 @@ <include file="Application.pages.config" /> <include file="Application.controls.config" /> + <include file="Application.events.config" /> + <modules> <!-- <module id="log" class="System.Util.TLogRouter"> <route class="TBrowserLogRoute" diff --git a/app/php/events/EventModule.php b/app/php/events/EventModule.php new file mode 100644 index 0000000..6474523 --- /dev/null +++ b/app/php/events/EventModule.php @@ -0,0 +1,53 @@ +<?php + +class EventModule extends TModule { + + public function init($config) { + $reflection = new ReflectionClass($this); + foreach ($reflection->getMethods() as $method) { + if (is_a($method->class, get_class(), TRUE)) { + $eventPattern = []; + if (preg_match('/^on(.*)/', $method->name, $eventPattern)) { + $this->_registerEventHandler( + $eventPattern[1], + $method->getClosure($this) + ); + } + } + } + if (get_class() === get_called_class()) { + $directory = dirname(__FILE__); + foreach (scandir($directory) as $dirEntry) { + $classNameMatch = []; + if (preg_match('/(.*)\.php$/', $dirEntry, $classNameMatch)) { + $className = $classNameMatch[1]; + include_once($directory . DIRECTORY_SEPARATOR . $dirEntry); + if ($className != get_class() + && is_a($className, get_class(), TRUE)) { + $class = new $className(); + $class->init(NULL); + } + } + } + } + } + + protected static $_handlers = []; + private function _registerEventHandler($event, $handler) { + if (!isset(self::$_handlers[$event])) { + self::$_handlers[$event] = []; + } + self::$_handlers[$event][] = $handler; + } + + public function raiseApplicationEvent($event, ...$params) { + if (isset(self::$_handlers[$event])) { + foreach (self::$_handlers[$event] as $handler) { + call_user_func_array($handler, $params); + } + } + } + +} + +?> diff --git a/app/php/events/config.xml b/app/php/events/config.xml new file mode 100644 index 0000000..d1c1e3f --- /dev/null +++ b/app/php/events/config.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<configuration> + <modules> + <module id="events" class="Application.events.EventModule" /> + </modules> +</configuration> |