ModuleHook

Package engine.modules
Inheritance class ModuleHook » Module » LsObject
Since 1.0
Source Code /engine/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
aHooks array( Содержит список хуков ModuleHook
aHooksObject array Список объектов обработки хукков, для их кешировани ModuleHook
bIsInit bool Указывает на то, была ли проведенна инициализация модуля Module
oEngine Engine Объект ядра Module

Public Methods

Hide inherited methods

MethodDescriptionDefined By
Add() Добавление обработчика на хук ModuleHook
AddDelegateFunction() Добавляет делегирующий обработчик хука с типом "function" ModuleHook
AddDelegateHook() Добавляет делегирующий обработчик хука с типом "hook" ModuleHook
AddDelegateModule() Добавляет делегирующий обработчик хука с типом "module" ModuleHook
AddExecFunction() Добавляет обработчик хука с типом "function" ModuleHook
AddExecHook() Добавляет обработчик хука с типом "hook" ModuleHook
AddExecModule() Добавляет обработчик хука с типом "module" ModuleHook
Init() Инициализация модуля ModuleHook
Run() Запускает обаботку хуков ModuleHook
SetInit() Помечает модуль как инициализированный Module
Shutdown() Метод срабатывает при завершении работы ядра Module
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля Module
__construct() При создании модуля передаем объект ядра Module
isInit() Возвращает значение флага инициализации модуля Module

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
RunType() Запускает обработчик хука в зависимости от туипа обработчика ModuleHook
__clone() Блокируем копирование/клонирование объекта Module

Property Details

aHooks property
protected array( $aHooks;

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

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: /engine/modules/hook/Hook.class.php#114 (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: /engine/modules/hook/Hook.class.php#189 (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: /engine/modules/hook/Hook.class.php#205 (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: /engine/modules/hook/Hook.class.php#175 (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: /engine/modules/hook/Hook.class.php#145 (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: /engine/modules/hook/Hook.class.php#160 (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: /engine/modules/hook/Hook.class.php#132 (show)
public function AddExecModule($sName,$sCallBack,$iPriority=1) {
    return 
$this->Add($sName,'module',$sCallBack,$iPriority);
}

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

See Also

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

}

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

Run() method
public array Run($sName $sName, array &$aVars=array ( ))
$sName $sName Имя хука
$aVars array Список параметров хука, передаются в обработчик
{return} array
Source Code: /engine/modules/hook/Hook.class.php#216 (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($aHookNum,SORT_NUMERIC);
        
arsort($aHookNumDelegate,SORT_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;
}

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

RunType() method
protected mixed|null RunType(array $aHook, array &$aVars)
$aHook array Данные хука
$aVars array Параметры переданные в хук
{return} mixed|null
Source Code: /engine/modules/hook/Hook.class.php#274 (show)
protected function RunType($aHook,&$aVars) {
    
$result=null;
    switch (
$aHook['type']) {
        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;
}

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