summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authoremkael <emkael@tlen.pl>2016-05-06 17:10:01 +0200
committeremkael <emkael@tlen.pl>2016-05-06 17:10:01 +0200
commit5888fa8b601963cbea68462116577332404fe138 (patch)
tree15e0c4743189f369fb8c168b6b40cf06788c9756 /app
parent93a8bca97a8d5453a206c402efce5fdd0e9dae72 (diff)
* application event handling module
Diffstat (limited to 'app')
-rw-r--r--app/php/application.xml2
-rw-r--r--app/php/events/EventModule.php53
-rw-r--r--app/php/events/config.xml6
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>