feat: Hooks filters

This commit is contained in:
slawkens 2024-06-29 15:53:02 +02:00
parent 33a47137c9
commit 44fe03c6ea
6 changed files with 80 additions and 19 deletions

View File

@ -542,33 +542,39 @@ function template_header($is_admin = false): string
*/ */
function template_footer(): string function template_footer(): string
{ {
global $views_counter; $footer = [];
$ret = '';
if(admin()) { if(admin()) {
$ret .= generateLink(ADMIN_URL, 'Admin Panel', true); $footer[] = generateLink(ADMIN_URL, 'Admin Panel', true);
} }
if(setting('core.visitors_counter')) { if(setting('core.visitors_counter')) {
global $visitors; global $visitors;
$amount = $visitors->getAmountVisitors(); $amount = $visitors->getAmountVisitors();
$ret .= '<br/>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')) { if(setting('core.views_counter')) {
$ret .= '<br/>Page has been viewed ' . $views_counter . ' times.'; global $views_counter;
$footer[] = 'Page has been viewed ' . $views_counter . ' times.';
} }
if(setting('core.footer_load_time')) { if(setting('core.footer_load_time')) {
$ret .= '<br/>Load time: ' . round(microtime(true) - START_TIME, 4) . ' seconds.'; $footer[] = 'Load time: ' . round(microtime(true) - START_TIME, 4) . ' seconds.';
} }
$settingFooter = setting('core.footer'); $settingFooter = setting('core.footer');
if(isset($settingFooter[0])) { if(isset($settingFooter[0])) {
$ret .= '<br/>' . $settingFooter; $footer[] = '' . $settingFooter;
} }
// please respect my work and help spreading the word, thanks! // please respect my work and help spreading the word, thanks!
return $ret . '<br/>' . base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4='); $footer[] = base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4=');
global $hooks;
$footer = $hooks->triggerFilter(HOOK_FILTER_THEME_FOOTER, $footer);
return implode('<br/>', $footer);
} }
function template_ga_code() function template_ga_code()

View File

@ -37,6 +37,11 @@ class Hook
return !isset($ret) || $ret == 1 || $ret; return !isset($ret) || $ret == 1 || $ret;
} }
public function executeFilter(...$args) {
return include BASE . $this->_file;
}
public function name() {return $this->_name;} public function name() {return $this->_name;}
public function type() {return $this->_type;} public function type() {return $this->_type;}
public function file() {return $this->_file;}
} }

View File

@ -4,22 +4,23 @@ namespace MyAAC;
class Hooks 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)) if(!($hook instanceof Hook))
$hook = new Hook($hook, $type, $file); $hook = new Hook($hook, $type, $file);
self::$_hooks[$hook->type()][] = $hook; self::$_hooks[$hook->type()][] = $hook;
} }
public function trigger($type, $params = array()) public function trigger($type, $params = []): bool
{ {
$ret = true; $ret = true;
if(isset(self::$_hooks[$type]))
{ if(isset(self::$_hooks[$type])) {
foreach(self::$_hooks[$type] as $name => $hook) { foreach(self::$_hooks[$type] as $name => $hook) {
/** @var $hook Hook */ /** @var Hook $hook */
if (!$hook->execute($params)) { if (!$hook->execute($params)) {
$ret = false; $ret = false;
} }
@ -29,11 +30,23 @@ class Hooks
return $ret; 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]); return isset(self::$_hooks[$type]);
} }
public function load() public function load(): void
{ {
foreach(Plugins::getHooks() as $hook) { foreach(Plugins::getHooks() as $hook) {
$this->register($hook['name'], $hook['type'], $hook['file']); $this->register($hook['name'], $hook['type'], $hook['file']);

View File

@ -0,0 +1,28 @@
<?php
namespace MyAAC\Twig;
use Twig\Environment;
class EnvironmentBridge extends Environment
{
public function display($name, array $context = []): void
{
global $hooks;
$context['viewName'] = $name;
$context = $hooks->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);
}
}

View File

@ -82,6 +82,16 @@ define('HOOK_CACHE_CLEAR', ++$i);
define('HOOK_INSTALL_FINISH', ++$i); define('HOOK_INSTALL_FINISH', ++$i);
define('HOOK_INSTALL_FINISH_END', ++$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; const HOOK_FIRST = HOOK_STARTUP;
define('HOOK_LAST', $i); define('HOOK_LAST', $i);

View File

@ -9,8 +9,7 @@
*/ */
defined('MYAAC') or die('Direct access not allowed!'); defined('MYAAC') or die('Direct access not allowed!');
use MyAAC\CsrfToken; use MyAAC\Twig\EnvironmentBridge as MyAAC_Twig_EnvironmentBridge;
use Twig\Environment as Twig_Environment;
use Twig\Extension\DebugExtension as Twig_DebugExtension; use Twig\Extension\DebugExtension as Twig_DebugExtension;
use Twig\Loader\FilesystemLoader as Twig_FilesystemLoader; use Twig\Loader\FilesystemLoader as Twig_FilesystemLoader;
use Twig\TwigFilter; use Twig\TwigFilter;
@ -18,7 +17,7 @@ use Twig\TwigFunction;
$dev_mode = (config('env') === 'dev'); $dev_mode = (config('env') === 'dev');
$twig_loader = new Twig_FilesystemLoader(SYSTEM . 'templates'); $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/', 'cache' => CACHE . 'twig/',
'auto_reload' => $dev_mode, 'auto_reload' => $dev_mode,
'debug' => $dev_mode 'debug' => $dev_mode