From 44fe03c6ea5eb14d95a2025947b4cf83e900d3d9 Mon Sep 17 00:00:00 2001 From: slawkens Date: Sat, 29 Jun 2024 15:53:02 +0200 Subject: [PATCH 1/2] feat: Hooks filters --- system/functions.php | 22 ++++++++++++-------- system/src/Hook.php | 5 +++++ system/src/Hooks.php | 29 +++++++++++++++++++-------- system/src/Twig/EnvironmentBridge.php | 28 ++++++++++++++++++++++++++ system/src/global.php | 10 +++++++++ system/twig.php | 5 ++--- 6 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 system/src/Twig/EnvironmentBridge.php diff --git a/system/functions.php b/system/functions.php index 70c0b93e7d..82a17f21f8 100644 --- a/system/functions.php +++ b/system/functions.php @@ -542,33 +542,39 @@ function template_header($is_admin = false): string */ function template_footer(): string { - global $views_counter; - $ret = ''; + $footer = []; + if(admin()) { - $ret .= generateLink(ADMIN_URL, 'Admin Panel', true); + $footer[] = generateLink(ADMIN_URL, 'Admin Panel', true); } if(setting('core.visitors_counter')) { global $visitors; $amount = $visitors->getAmountVisitors(); - $ret .= '
Currently there ' . ($amount > 1 ? 'are' : 'is') . ' ' . $amount . ' visitor' . ($amount > 1 ? 's' : '') . '.'; + $footer[] = 'Currently there ' . ($amount > 1 ? 'are' : 'is') . ' ' . $amount . ' visitor' . ($amount > 1 ? 's' : '') . '.'; } if(setting('core.views_counter')) { - $ret .= '
Page has been viewed ' . $views_counter . ' times.'; + global $views_counter; + $footer[] = 'Page has been viewed ' . $views_counter . ' times.'; } if(setting('core.footer_load_time')) { - $ret .= '
Load time: ' . round(microtime(true) - START_TIME, 4) . ' seconds.'; + $footer[] = 'Load time: ' . round(microtime(true) - START_TIME, 4) . ' seconds.'; } $settingFooter = setting('core.footer'); if(isset($settingFooter[0])) { - $ret .= '
' . $settingFooter; + $footer[] = '' . $settingFooter; } // please respect my work and help spreading the word, thanks! - return $ret . '
' . base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4='); + $footer[] = base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4='); + + global $hooks; + $footer = $hooks->triggerFilter(HOOK_FILTER_THEME_FOOTER, $footer); + + return implode('
', $footer); } function template_ga_code() diff --git a/system/src/Hook.php b/system/src/Hook.php index 73e378fd53..9f4b7978c7 100644 --- a/system/src/Hook.php +++ b/system/src/Hook.php @@ -37,6 +37,11 @@ public function execute($params) return !isset($ret) || $ret == 1 || $ret; } + public function executeFilter(...$args) { + return include BASE . $this->_file; + } + public function name() {return $this->_name;} public function type() {return $this->_type;} + public function file() {return $this->_file;} } diff --git a/system/src/Hooks.php b/system/src/Hooks.php index ee9f3b766b..084d5e1a68 100644 --- a/system/src/Hooks.php +++ b/system/src/Hooks.php @@ -4,22 +4,23 @@ class Hooks { - private static $_hooks = array(); + private static array $_hooks = []; - public function register($hook, $type = '', $file = null) { + public function register($hook, $type = '', $file = null): void + { if(!($hook instanceof Hook)) $hook = new Hook($hook, $type, $file); self::$_hooks[$hook->type()][] = $hook; } - public function trigger($type, $params = array()) + public function trigger($type, $params = []): bool { $ret = true; - if(isset(self::$_hooks[$type])) - { + + if(isset(self::$_hooks[$type])) { foreach(self::$_hooks[$type] as $name => $hook) { - /** @var $hook Hook */ + /** @var Hook $hook */ if (!$hook->execute($params)) { $ret = false; } @@ -29,11 +30,23 @@ public function trigger($type, $params = array()) return $ret; } - public function exist($type) { + public function triggerFilter($type, $args = []) + { + if(isset(self::$_hooks[$type])) { + foreach(self::$_hooks[$type] as $hook) { + /** @var Hook $hook */ + $args = $hook->executeFilter(...$args); + } + } + + return $args; + } + + public function exist($type): bool { return isset(self::$_hooks[$type]); } - public function load() + public function load(): void { foreach(Plugins::getHooks() as $hook) { $this->register($hook['name'], $hook['type'], $hook['file']); diff --git a/system/src/Twig/EnvironmentBridge.php b/system/src/Twig/EnvironmentBridge.php new file mode 100644 index 0000000000..ab54bd2569 --- /dev/null +++ b/system/src/Twig/EnvironmentBridge.php @@ -0,0 +1,28 @@ +triggerFilter(HOOK_FILTER_TWIG_DISPLAY, $context); + + parent::display($name, $context); + } + + public function render($name, array $context = []): string + { + global $hooks; + + $context['viewName'] = $name; + $context = $hooks->triggerFilter(HOOK_FILTER_TWIG_RENDER, $context); + + return parent::render($name, $context); + } +} diff --git a/system/src/global.php b/system/src/global.php index d4bd0cc40b..eff0bc0b3f 100644 --- a/system/src/global.php +++ b/system/src/global.php @@ -82,6 +82,16 @@ define('HOOK_INSTALL_FINISH', ++$i); define('HOOK_INSTALL_FINISH_END', ++$i); +// hook filters +define('HOOK_FILTER_TWIG_DISPLAY', ++$i); +define('HOOK_FILTER_TWIG_RENDER', ++$i); +define('HOOK_FILTER_THEME_FOOTER', ++$i); + +const HOOK_FILTERS = [ + HOOK_FILTER_TWIG_DISPLAY, + HOOK_FILTER_TWIG_RENDER, +]; + const HOOK_FIRST = HOOK_STARTUP; define('HOOK_LAST', $i); diff --git a/system/twig.php b/system/twig.php index 9176c37116..e4e9d0d932 100644 --- a/system/twig.php +++ b/system/twig.php @@ -9,8 +9,7 @@ */ defined('MYAAC') or die('Direct access not allowed!'); -use MyAAC\CsrfToken; -use Twig\Environment as Twig_Environment; +use MyAAC\Twig\EnvironmentBridge as MyAAC_Twig_EnvironmentBridge; use Twig\Extension\DebugExtension as Twig_DebugExtension; use Twig\Loader\FilesystemLoader as Twig_FilesystemLoader; use Twig\TwigFilter; @@ -18,7 +17,7 @@ $dev_mode = (config('env') === 'dev'); $twig_loader = new Twig_FilesystemLoader(SYSTEM . 'templates'); -$twig = new Twig_Environment($twig_loader, array( +$twig = new MyAAC_Twig_EnvironmentBridge($twig_loader, array( 'cache' => CACHE . 'twig/', 'auto_reload' => $dev_mode, 'debug' => $dev_mode From b471b1567af507eb4b6da3b69daddafc48af97bb Mon Sep 17 00:00:00 2001 From: slawkens Date: Sat, 29 Jun 2024 21:30:12 +0200 Subject: [PATCH 2/2] Cleanup --- system/src/global.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/system/src/global.php b/system/src/global.php index eff0bc0b3f..4ae1024f48 100644 --- a/system/src/global.php +++ b/system/src/global.php @@ -87,11 +87,6 @@ define('HOOK_FILTER_TWIG_RENDER', ++$i); define('HOOK_FILTER_THEME_FOOTER', ++$i); -const HOOK_FILTERS = [ - HOOK_FILTER_TWIG_DISPLAY, - HOOK_FILTER_TWIG_RENDER, -]; - const HOOK_FIRST = HOOK_STARTUP; define('HOOK_LAST', $i);