AvocadoAmber/AvocadoEdition_Light/lib/Hook/hook.extends.class.php
2024-10-05 05:58:42 +09:00

137 lines
3.5 KiB
PHP

<?php
if (!defined('_GNUBOARD_'))
exit;
class GML_Hook extends Hook
{
protected $filters = ['count' => 0];
protected $callback_filters = [];
protected static $current_filter = false;
protected function runAction($action, $args)
{
$function = $action['function'];
$argsNumber = $action['arguments'];
$args = $this->getArguments($argsNumber, $args);
if (is_callable($function)) {
return call_user_func_array($function, $args);
} elseif (is_array($function) && isset($function[0], $function[1])) {
$class = $function[0];
$method = $function[1];
if ($obj = call_user_func([$class, $this->singleton])) {
return $obj !== false ? call_user_func_array([$obj, $method], $args) : false;
} elseif (class_exists($class)) {
$instance = new $class();
return call_user_func_array([$instance, $method], $args);
}
}
return false;
}
protected function getFilters($tag, $remove)
{
$filters = isset($this->callback_filters[$tag]) ? $this->callback_filters[$tag] : [];
if ($remove) {
unset($this->callback_filters[$tag]);
}
return $filters;
}
public static function get_properties($type, $is_callback = false)
{
$that = self::getInstance(self::$id);
if ($type === 'event') {
return $is_callback ? $that->callbacks : $that->actions;
}
return $is_callback ? $that->callback_filters : $that->filters;
}
public static function addFilter($tag, $func, $priority = 8, $args = 0)
{
$that = self::getInstance(self::$id);
$that->callback_filters[$tag][$priority][] = [
'function' => $func,
'arguments' => $args,
];
return true;
}
public static function apply_filters($tag, $args = [], $remove = true)
{
$that = self::getInstance(self::$id);
self::$current_filter = $tag;
$that->filters['count']++;
if (!isset($that->filters[$tag])) {
$that->filters[$tag] = 0;
}
$that->filters[$tag]++;
$filters = $that->getFilters($tag, $remove);
ksort($filters);
$value = isset($args[0]) ? $args[0] : null;
foreach ($filters as $priority) {
foreach ($priority as $filter) {
if (isset($args[0])) {
$args[0] = $value;
}
$replace = $that->runAction($filter, $args);
if ($replace !== false) {
$value = $replace;
}
}
}
self::$current_filter = false;
return $value;
}
protected function getArguments($argsNumber, $arguments)
{
if ($argsNumber === 1 && is_string($arguments)) {
return [$arguments];
}
if (is_array($arguments) && $argsNumber === count($arguments)) {
return $arguments;
}
return array_slice((array) $arguments, 0, $argsNumber);
}
public static function remove_filter($tag, $func, $priority)
{
$that = self::getInstance(self::$id);
return self::remove_callback($that->callback_filters, $tag, $func, $priority);
}
public static function remove_action($tag, $func, $priority)
{
$that = self::getInstance(self::$id);
return self::remove_callback($that->callbacks, $tag, $func, $priority);
}
private static function remove_callback(&$array, $tag, $func, $priority)
{
if (!isset($array[$tag][$priority])) {
return false;
}
$is_remove = false;
foreach ($array[$tag][$priority] as $key => $value) {
if (isset($value['function']) && $value['function'] === $func) {
unset($array[$tag][$priority][$key]);
$is_remove = true;
}
}
return $is_remove;
}
}