Вход Регистрация
Файл: library/XenForo/CodeEvent.php
Строк: 187
<?php

/**
 * Fires code events and executes event listener callbacks.
 *
 * @package XenForo_CodeEvents
 */
class XenForo_CodeEvent
{
    
/**
     * The list of event listeners for all events.
     *
     * @var array Format: [event id][hint][] => callback
     */
    
protected static $_listeners false;

    
/**
     * Private constructor, use statically.
     */
    
private function __construct()
    {
    }

    
/**
     * Fires the specified code event and calls any listener callbacks that are attached to it.
     *
     * The listener may return false, which will prevent any further listeners from
     * running and cause this function (fire) to return false. This indicates that
     * the listener handled the job the built-in code was going to do and if applicable,
     * the built-in code need not run. (This will only apply in limited circumstances.)
     *
     * Note that if you want to allow arguments to be modified, they must be passed by reference. Eg:
     *         array($value, &$reference)
     * If you do this, the receiving function will always be given the arguments by reference!
     *
     * @param string $event Name of the event to first
     * @param array $args List of arguments to pass to the callback.
     *             If you want to make something modifiable, you must pass it by reference to the array.
     * @param string|null $hint If provided, only global events and events with this hint will be run
     *
     * @return boolean
     */
    
public static function fire($event, array $args = array(), $hint null)
    {
        if (!
self::$_listeners || empty(self::$_listeners[$event]))
        {
            return 
true;
        }

        if (
$hint !== null)
        {
            if (!empty(
self::$_listeners[$event]['_']))
            {
                foreach (
self::$_listeners[$event]['_'] AS $callback)
                {
                    if (
is_callable($callback))
                    {
                        
$return call_user_func_array($callback$args);
                        if (
$return === false)
                        {
                            return 
false;
                        }
                    }
                }
            }

            if (
$hint !== '_' && !empty(self::$_listeners[$event][$hint]))
            {
                foreach (
self::$_listeners[$event][$hint] AS $callback)
                {
                    if (
is_callable($callback))
                    {
                        
$return call_user_func_array($callback$args);
                        if (
$return === false)
                        {
                            return 
false;
                        }
                    }
                }
            }
        }
        else
        {
            foreach (
self::$_listeners[$event] AS $callbacks)
            {
                foreach (
$callbacks AS $callback)
                {
                    if (
is_callable($callback))
                    {
                        
$return call_user_func_array($callback$args);
                        if (
$return === false)
                        {
                            return 
false;
                        }
                    }
                }
            }
        }

        return 
true;
    }

    
/**
     * Gets the listeners for a specific event.
     *
     * @param string $event
     *
     * @return array|false List of listener callbacks or false
     */
    
public static function getEventListeners($event)
    {
        if (isset(
self::$_listeners[$event]))
        {
            return 
self::$_listeners[$event];
        }
        else
        {
            return 
false;
        }
    }

    
/**
     * Sets the list of listeners for all events.
     *
     * @param array $listeners Format: [event id][] => callback
     * @param boolean $keepExisting
     */
    
public static function setListeners(array $listeners$keepExisting true)
    {
        if (!
self::$_listeners || !$keepExisting)
        {
            
self::$_listeners $listeners;
        }
        else
        {
            
self::$_listeners array_merge_recursive(self::$_listeners$listeners);
        }
    }

    
/**
     * Adds a listener for the specified event. This method takes an arbitrary
     * callback, so can be used with more advanced things like object-based
     * callbacks (and simple function-only callbacks).
     *
     * @param string $event Event to listen to
     * @param callback $callback Function/method to call.
     * @param string $hint If specified (value other than an _), will only be run when the specified hint is provided
     */
    
public static function addListener($event$callback$hint '_')
    {
        if (!
is_array(self::$_listeners))
        {
            
self::$_listeners = array();
        }

        
self::$_listeners[$event][$hint][] = $callback;
    }

    
/**
     * Removes all listeners.
     */
    
public static function removeListeners()
    {
        
self::$_listeners false;
    }
}
Онлайн: 3
Реклама