109 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?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();          // 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 !== null) $plugin->register($this);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * register_hook
 | 
						|
     *
 | 
						|
     * register a hook for an event
 | 
						|
     *
 | 
						|
     * @param  string $event string   name used by the event, (incl '_before' or '_after' for triggers)
 | 
						|
     * @param  string $advise
 | 
						|
     * @param  object $obj object in whose scope method is to be executed,
 | 
						|
     *                             if NULL, method is assumed to be a globally available function
 | 
						|
     * @param  string $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][] = array($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) {
 | 
						|
                    list($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']);
 | 
						|
    }
 | 
						|
}
 |