|
- <?php
-
- // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
-
- namespace dokuwiki\Extension;
-
- /**
- * Controls the registration and execution of all events,
- */
- class EventHandler
- {
- // public properties: none
-
- // private properties
- protected $hooks = []; // array of events and their registered handlers
-
- /**
- * event_handler
- *
- * constructor, loads all action plugins and calls their register() method giving them
- * an opportunity to register any hooks they require
- */
- public function __construct()
- {
-
- // load action plugins
- /** @var ActionPlugin $plugin */
- $plugin = null;
- $pluginlist = plugin_list('action');
-
- foreach ($pluginlist as $plugin_name) {
- $plugin = plugin_load('action', $plugin_name);
-
- if ($plugin instanceof PluginInterface) $plugin->register($this);
- }
- }
-
- /**
- * register_hook
- *
- * register a hook for an event
- *
- * @param string $event name used by the event
- * @param string $advise BEFORE|AFTER
- * @param object $obj scope for the method be executed on, NULL for global function or callable
- * @param string|callable $method event handler function
- * @param mixed $param data passed to the event handler
- * @param int $seq sequence number for ordering hook execution (ascending)
- */
- public function register_hook($event, $advise, $obj, $method, $param = null, $seq = 0)
- {
- $seq = (int)$seq;
- $doSort = !isset($this->hooks[$event . '_' . $advise][$seq]);
- $this->hooks[$event . '_' . $advise][$seq][] = [$obj, $method, $param];
-
- if ($doSort) {
- ksort($this->hooks[$event . '_' . $advise]);
- }
- }
-
- /**
- * process the before/after event
- *
- * @param Event $event
- * @param string $advise BEFORE or AFTER
- */
- public function process_event($event, $advise = '')
- {
-
- $evt_name = $event->name . ($advise ? '_' . $advise : '_BEFORE');
-
- if (!empty($this->hooks[$evt_name])) {
- foreach ($this->hooks[$evt_name] as $sequenced_hooks) {
- foreach ($sequenced_hooks as $hook) {
- [$obj, $method, $param] = $hook;
-
- if ($obj === null) {
- $method($event, $param);
- } else {
- $obj->$method($event, $param);
- }
-
- if (!$event->mayPropagate()) return;
- }
- }
- }
- }
-
- /**
- * Check if an event has any registered handlers
- *
- * When $advise is empty, both BEFORE and AFTER events will be considered,
- * otherwise only the given advisory is checked
- *
- * @param string $name Name of the event
- * @param string $advise BEFORE, AFTER or empty
- * @return bool
- */
- public function hasHandlerForEvent($name, $advise = '')
- {
- if ($advise) {
- return isset($this->hooks[$name . '_' . $advise]);
- }
-
- return isset($this->hooks[$name . '_BEFORE']) || isset($this->hooks[$name . '_AFTER']);
- }
-
- /**
- * Get all hooks and their currently registered handlers
- *
- * The handlers are sorted by sequence, then by register time
- *
- * @return array
- */
- public function getEventHandlers()
- {
- return $this->hooks;
- }
- }
|