ModuleHook

Package framework.modules
Inheritance class ModuleHook » Module » LsObject
Since 1.0
Source Code /framework/classes/modules/hook/Hook.class.php
Модуль обработки хуков(hooks) В различных местах кода могут быть определеные вызовы хуков, например:
$this->Hook_Run('topic_edit_before', array('oTopic'=>$oTopic,'oBlog'=>$oBlog));
Данный вызов "вешает" хук "topic_edit_before" Чтобы повесить обработчик на этот хук, его нужно объявить, например, через файл в /classes/hooks/HookTest.class.php
class HookTest extends Hook {
   // Регистрируем хуки (вешаем обработчики)
   public function RegisterHook() {
       $this->AddHook('topic_edit_before','TopicEdit');
   }
   // обработчик хука
   public function TopicEdit($aParams) {
       $oTopic=$aParams['oTopic'];
       $oTopic->setTitle('My title!');
   }
}
В данном примере после редактирования топика заголовок у него поменяется на "My title!"

Если хук объявлен в шаблоне, например,
{hook run='html_head_end'}
То к имени хука автоматически добаляется префикс "template_" и обработчик на него вешать нужно так:
$this->AddHook('template_html_head_end','InjectHead');


Так же существуют блочные хуки, который объявляются в шаблонах так:
{hookb run="registration_captcha"}
... html ...
{/hookb}
Они позволяют заменить содержимое между {hookb ..} {/hookb} или добавть к нему произвольный контент. К имени такого хука добавляется префикс "template_block_"
class HookTest extends Hook {
   // Регистрируем хуки (вешаем обработчики)
   public function RegisterHook() {
       $this->AddHook('template_block_registration_captcha','MyCaptcha');
   }
   // обработчик хука
   public function MyCaptcha($aParams) {
       $sContent=$aParams['content'];
       return $sContent.'My captcha!';
   }
}
В данном примере в конце вывода каптчи будет добавлено "My captcha!" Обратите внимаете, что в обработчик в параметре "content" передается исходное содержание блока.

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
_aBehaviors Список поведений в виде готовых объектов, формируется автоматически LsObject
aBehaviors array Список поведений LsObject
aHooks array( Содержит список хуков ModuleHook
aHooksBehavior array Список хуков для поведений - в них есть привязка к конкретному объекту ModuleHook
aHooksObject array Список объектов обработки хукков, для их кешировани ModuleHook
bIsInit bool Указывает на то, была ли проведенна инициализация модуля Module

Public Methods

Hide inherited methods

MethodDescriptionDefined By
Add() Добавление обработчика на хук ModuleHook
AddBehaviorHook() Добавляет хук поведения LsObject
AddDelegateFunction() Добавляет делегирующий обработчик хука с типом "function" ModuleHook
AddDelegateHook() Добавляет делегирующий обработчик хука с типом "hook" ModuleHook
AddDelegateModule() Добавляет делегирующий обработчик хука с типом "module" ModuleHook
AddExecFunction() Добавляет обработчик хука с типом "function" ModuleHook
AddExecHook() Добавляет обработчик хука с типом "hook" ModuleHook
AddExecModule() Добавляет обработчик хука с типом "module" ModuleHook
AddHookBehavior() Добавление хука для поведения ModuleHook
AttachBehavior() Присоединяет поведение к объекту LsObject
DetachBehavior() Отсоединяет поведение от объекта LsObject
GetBehavior() Возвращает объект поведения по его имени LsObject
GetBehaviors() Возвращает все объекты поведения LsObject
Init() Инициализация модуля ModuleHook
RemoveBehaviorHook() Удаляет хук поведения LsObject
RemoveHookBehavior() Удаляет хук поведения ModuleHook
Run() Запускает обаботку хуков ModuleHook
RunBehaviorHook() Запускает хук поведения на выполнение LsObject
RunHookBehavior() ModuleHook
SetInit() Помечает модуль как инициализированный Module
Shutdown() Метод срабатывает при завершении работы ядра Module
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля LsObject
__clone() Блокируем копирование/клонирование объекта Module
__construct() Конструктор, запускается автоматически при создании объекта LsObject
__get() Обработка доступа к объекты поведения LsObject
isInit() Возвращает значение флага инициализации модуля Module

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
PrepareBehaviors() Инициализация поведений LsObject
RunType() Запускает обработчик хука в зависимости от туипа обработчика ModuleHook

Property Details

aHooks property
protected array( $aHooks;

Содержит список хуков

aHooksBehavior property
protected array $aHooksBehavior;

Список хуков для поведений - в них есть привязка к конкретному объекту

aHooksObject property
protected array $aHooksObject;

Список объектов обработки хукков, для их кешировани

Method Details

Add() method
public bool Add(string $sName, string $sType, string $sCallBack, int $iPriority=1, array $aParams=array ( ))
$sName string Имя хука
$sType string Тип хука, возможны: module, function, hook
$sCallBack string Функция/метод обработки хука
$iPriority int Приоритер обработки, чем выше, тем раньше сработает хук относительно других
$aParams array Список дополнительных параметров, анпример, имя класса хука
{return} bool
Source Code: /framework/classes/modules/hook/Hook.class.php#211 (show)
public function Add($sName$sType$sCallBack$iPriority 1$aParams = array())
{
    
$sName strtolower($sName);
    
$sType strtolower($sType);
    if (!
in_array($sType, array('module''hook''function'))) {
        return 
false;
    }
    
$this->aHooks[$sName][] = array(
        
'type'     => $sType,
        
'callback' => $sCallBack,
        
'params'   => $aParams,
        
'priority' => (int)$iPriority
    
);
}

Добавление обработчика на хук

AddDelegateFunction() method
public bool AddDelegateFunction(string $sName, string $sCallBack, int $iPriority=1)
$sName string Имя хука
$sCallBack string Функция обработки хука, например, "var_dump"
$iPriority int Приоритер обработки, чем выше, тем раньше сработает хук относительно других
{return} bool
Source Code: /framework/classes/modules/hook/Hook.class.php#301 (show)
public function AddDelegateFunction($sName$sCallBack$iPriority 1)
{
    return 
$this->Add($sName'function'$sCallBack$iPriority, array('delegate' => true));
}

Добавляет делегирующий обработчик хука с типом "function" Делегирующий хук применяется для перекрытия метода модуля, результат хука возвращает вместо результата метода модуля Позволяет в качестве обработчика использовать функцию

See Also

AddDelegateHook() method
public bool AddDelegateHook(string $sName, string $sCallBack, int $iPriority=1, array $aParams=array ( ))
$sName string Имя хука
$sCallBack string Метод хука, например, "InitAction"
$iPriority int Приоритер обработки, чем выше, тем раньше сработает хук относительно других
$aParams array Параметры
{return} bool
Source Code: /framework/classes/modules/hook/Hook.class.php#319 (show)
public function AddDelegateHook($sName$sCallBack$iPriority 1$aParams = array())
{
    
$aParams['delegate'] = true;
    return 
$this->Add($sName'hook'$sCallBack$iPriority$aParams);
}

Добавляет делегирующий обработчик хука с типом "hook" Делегирующий хук применяется для перекрытия метода модуля, результат хука возвращает вместо результата метода модуля Позволяет в качестве обработчика использовать метод хука(класса хука из каталога /classes/hooks/)

See Also

AddDelegateModule() method
public bool AddDelegateModule(string $sName, string $sCallBack, int $iPriority=1)
$sName string Имя хука
$sCallBack string Полное имя метода обработки хука, например, "Mymodule_CallBack"
$iPriority int Приоритер обработки, чем выше, тем раньше сработает хук относительно других
{return} bool
Source Code: /framework/classes/modules/hook/Hook.class.php#285 (show)
public function AddDelegateModule($sName$sCallBack$iPriority 1)
{
    return 
$this->Add($sName'module'$sCallBack$iPriority, array('delegate' => true));
}

Добавляет делегирующий обработчик хука с типом "module" Делегирующий хук применяется для перекрытия метода модуля, результат хука возвращает вместо результата метода модуля Позволяет в качестве обработчика использовать метод модуля

AddExecFunction() method
public bool AddExecFunction(string $sName, string $sCallBack, int $iPriority=1)
$sName string Имя хука
$sCallBack string Функция обработки хука, например, "var_dump"
$iPriority int Приоритер обработки, чем выше, тем раньше сработает хук относительно других
{return} bool
Source Code: /framework/classes/modules/hook/Hook.class.php#251 (show)
public function AddExecFunction($sName$sCallBack$iPriority 1)
{
    return 
$this->Add($sName'function'$sCallBack$iPriority);
}

Добавляет обработчик хука с типом "function" Позволяет в качестве обработчика использовать функцию

See Also

AddExecHook() method
public bool AddExecHook(string $sName, string $sCallBack, int $iPriority=1, array $aParams=array ( ))
$sName string Имя хука
$sCallBack string Метод хука, например, "InitAction"
$iPriority int Приоритер обработки, чем выше, тем раньше сработает хук относительно других
$aParams array Параметры
{return} bool
Source Code: /framework/classes/modules/hook/Hook.class.php#268 (show)
public function AddExecHook($sName$sCallBack$iPriority 1$aParams = array())
{
    return 
$this->Add($sName'hook'$sCallBack$iPriority$aParams);
}

Добавляет обработчик хука с типом "hook" Позволяет в качестве обработчика использовать метод хука(класса хука из каталога /classes/hooks/)

See Also

AddExecModule() method
public bool AddExecModule(string $sName, string $sCallBack, int $iPriority=1)
$sName string Имя хука
$sCallBack string Полное имя метода обработки хука, например, "Mymodule_CallBack"
$iPriority int Приоритер обработки, чем выше, тем раньше сработает хук относительно других
{return} bool
Source Code: /framework/classes/modules/hook/Hook.class.php#236 (show)
public function AddExecModule($sName$sCallBack$iPriority 1)
{
    return 
$this->Add($sName'module'$sCallBack$iPriority);
}

Добавляет обработчик хука с типом "module" Позволяет в качестве обработчика использовать метод модуля

See Also

AddHookBehavior() method
public void AddHookBehavior(string $sName, LsObject $oObject, array $aCallback, int $iPriority=1)
$sName string Имя хука
$oObject LsObject Объект которому принадлежит хук
$aCallback array Коллбек
$iPriority int Приоритет
Source Code: /framework/classes/modules/hook/Hook.class.php#126 (show)
public function AddHookBehavior($sName$oObject$aCallback$iPriority 1)
{
    
$sName strtolower($sName);
    
$sObjectHash spl_object_hash($oObject);
    
$this->aHooksBehavior[$sName][$sObjectHash][] = array('callback' => $aCallback'priority' => (int)$iPriority);
}

Добавление хука для поведения

Init() method
public void Init()
Source Code: /framework/classes/modules/hook/Hook.class.php#113 (show)
public function Init()
{

}

Инициализация модуля

RemoveHookBehavior() method
public bool RemoveHookBehavior(string $sName, LsObject $oObject, array|null $aCallback=NULL)
$sName string Имя хука
$oObject LsObject Объект которому принадлежит хук
$aCallback array|null Коллбек, если не задан, то будут удалены все коллбеки
{return} bool
Source Code: /framework/classes/modules/hook/Hook.class.php#142 (show)
public function RemoveHookBehavior($sName$oObject$aCallback null)
{
    
$sName strtolower($sName);
    
$sObjectHash spl_object_hash($oObject);
    if (!isset(
$this->aHooksBehavior[$sName][$sObjectHash])) {
        return 
false;
    }
    if (
is_null($aCallback)) {
        unset(
$this->aHooksBehavior[$sName][$sObjectHash]);
        return 
true;
    }
    
$bRemoved false;
    foreach (
$this->aHooksBehavior[$sName][$sObjectHash] as $i => $aHook) {
        if (
$aHook['callback'] === $aCallback) {
            unset(
$this->aHooksBehavior[$sName][$sObjectHash][$i]);
            
$bRemoved true;
        }
    }
    if (
$bRemoved) {
        
$this->aHooksBehavior[$sName][$sObjectHash] = array_values($this->aHooksBehavior[$sName][$sObjectHash]);
    }
    return 
$bRemoved;
}

Удаляет хук поведения

Run() method
public array Run($sName $sName, array &$aVars=array ( ))
$sName $sName Имя хука
$aVars array Список параметров хука, передаются в обработчик
{return} array
Source Code: /framework/classes/modules/hook/Hook.class.php#332 (show)
public function Run($sName, &$aVars = array())
{
    
$result = array();
    
$sName strtolower($sName);
    
$bTemplateHook strpos($sName'template_') === true false;
    if (isset(
$this->aHooks[$sName])) {
        
$aHookNum = array();
        
$aHookNumDelegate = array();
        
/**
         * Все хуки делим на обычные(exec) и делигирующие(delegate)
         */
        
for ($i 0$i count($this->aHooks[$sName]); $i++) {
            if (isset(
$this->aHooks[$sName][$i]['params']['delegate']) and $this->aHooks[$sName][$i]['params']['delegate']) {
                
$aHookNumDelegate[$i] = $this->aHooks[$sName][$i]['priority'];
            } else {
                
$aHookNum[$i] = $this->aHooks[$sName][$i]['priority'];
            }
        }
        
arsort($aHookNumSORT_NUMERIC);
        
arsort($aHookNumDelegateSORT_NUMERIC);
        
/**
         * Сначала запускаем на выполнение простые
         */
        
foreach ($aHookNum as $iKey => $iPr) {
            
$aHook $this->aHooks[$sName][$iKey];
            if (
$bTemplateHook) {
                
/**
                 * Если это шаблонных хук то сохраняем результат
                 */
                
$result['template_result'][] = $this->RunType($aHook$aVars);
            } else {
                
$this->RunType($aHook$aVars);
            }
        }
        
/**
         * Теперь запускаем делигирующие
         * Делегирующий хук должен вернуть результат в формате:
         *
         */
        
foreach ($aHookNumDelegate as $iKey => $iPr) {
            
$aHook $this->aHooks[$sName][$iKey];
            
$result = array(
                
'delegate_result' => $this->RunType($aHook$aVars)
            );
            
/**
             * На данный момент только один хук может быть делегирующим
             */
            
break;
        }
    }
    return 
$result;
}

Запускает обаботку хуков

RunHookBehavior() method
public array RunHookBehavior(string $sName, LsObject $oObject, array $aVars=array ( ), bool $bWithGlobal=false)
$sName string Имя хука
$oObject LsObject Объект которому принадлежит хук
$aVars array Параметры хука. Конкретные параметры можно передавать по ссылке, например, array('bResult'=>&$bResult)
$bWithGlobal bool Запускать дополнительно одноименный глобальный (стандартный) хук
{return} array
Source Code: /framework/classes/modules/hook/Hook.class.php#174 (show)
public function RunHookBehavior($sName$oObject$aVars = array(), $bWithGlobal false)
{
    
$result = array();
    
$sName strtolower($sName);
    
$sObjectHash spl_object_hash($oObject);
    if (isset(
$this->aHooksBehavior[$sName][$sObjectHash])) {
        
$aHooks = array();
        for (
$i 0$i count($this->aHooksBehavior[$sName][$sObjectHash]); $i++) {
            
$aHooks[$i] = $this->aHooksBehavior[$sName][$sObjectHash][$i]['priority'];
        }
        
arsort($aHooksSORT_NUMERIC);
        
/**
         * Сначала запускаем на выполнение
         */

        
foreach ($aHooks as $iKey => $iPr) {
            
$aHook $this->aHooksBehavior[$sName][$sObjectHash][$iKey];
            
$aHook['type'] = 'callback';
            
$this->RunType($aHook$aVars);
        }
    }
    if (
$bWithGlobal) {
        
$this->Run($sName$aVars);
    }
    return 
$result;
}

RunType() method
protected mixed|null RunType(array $aHook, array &$aVars)
$aHook array Данные хука
$aVars array Параметры переданные в хук
{return} mixed|null
Source Code: /framework/classes/modules/hook/Hook.class.php#392 (show)
protected function RunType($aHook, &$aVars)
{
    
$result null;
    switch (
$aHook['type']) {
        case 
'callback':
            
$result call_user_func_array($aHook['callback'], array(&$aVars));
            break;
        case 
'module':
            
$result call_user_func_array(array($this$aHook['callback']), array(&$aVars));
            break;
        case 
'function':
            
$result call_user_func_array($aHook['callback'], array(&$aVars));
            break;
        case 
'hook':
            
$sHookClass = isset($aHook['params']['sClassName']) ? $aHook['params']['sClassName'] : null;
            if (
$sHookClass and class_exists($sHookClass)) {
                if (isset(
$this->aHooksObject[$sHookClass])) {
                    
$oHook $this->aHooksObject[$sHookClass];
                } else {
                    
$oHook = new $sHookClass;
                    
$this->aHooksObject[$sHookClass] = $oHook;
                }
                
$result call_user_func_array(array($oHook$aHook['callback']), array(&$aVars));
            }
            break;
        default:
            break;
    }
    return 
$result;
}

Запускает обработчик хука в зависимости от туипа обработчика