diff --git a/system/functions.php b/system/functions.php
index 70c0b93e7..82a17f21f 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 73e378fd5..9f4b7978c 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 ee9f3b766..084d5e1a6 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 000000000..ab54bd256
--- /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 d4bd0cc40..4ae1024f4 100644
--- a/system/src/global.php
+++ b/system/src/global.php
@@ -82,6 +82,11 @@
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_FIRST = HOOK_STARTUP;
define('HOOK_LAST', $i);
diff --git a/system/twig.php b/system/twig.php
index 9176c3711..e4e9d0d93 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