ModuleHook
Package | engine.modules |
---|---|
Inheritance | class ModuleHook » Module » LsObject |
Since | 1.0 |
Source Code | /engine/modules/hook/Hook.class.php |
$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
Property | Type | Description | Defined By |
---|---|---|---|
aHooks | array( | Содержит список хуков | ModuleHook |
aHooksObject | array | Список объектов обработки хукков, для их кешировани | ModuleHook |
bIsInit | bool | Указывает на то, была ли проведенна инициализация модуля | Module |
oEngine | Engine | Объект ядра | Module |
Public Methods
Method | Description | Defined 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
Method | Description | Defined By |
---|---|---|
RunType() | Запускает обработчик хука в зависимости от туипа обработчика | ModuleHook |
__clone() | Блокируем копирование/клонирование объекта | Module |
Property Details
Содержит список хуков
Список объектов обработки хукков, для их кешировани
Method Details
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 |
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);
}
Добавление обработчика на хук
public bool AddDelegateFunction(string $sName, string $sCallBack, int $iPriority=1)
| ||
$sName | string | Имя хука |
$sCallBack | string | Функция обработки хука, например, "var_dump" |
$iPriority | int | Приоритер обработки, чем выше, тем раньше сработает хук относительно других |
{return} | bool |
public function AddDelegateFunction($sName,$sCallBack,$iPriority=1) {
return $this->Add($sName,'function',$sCallBack,$iPriority,array('delegate'=>true));
}
Добавляет делегирующий обработчик хука с типом "function" Делегирующий хук применяется для перекрытия метода модуля, результат хука возвращает вместо результата метода модуля Позволяет в качестве обработчика использовать функцию
See Also
public bool AddDelegateHook(string $sName, string $sCallBack, int $iPriority=1, array $aParams=array (
))
| ||
$sName | string | Имя хука |
$sCallBack | string | Метод хука, например, "InitAction" |
$iPriority | int | Приоритер обработки, чем выше, тем раньше сработает хук относительно других |
$aParams | array | Параметры |
{return} | bool |
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
public bool AddDelegateModule(string $sName, string $sCallBack, int $iPriority=1)
| ||
$sName | string | Имя хука |
$sCallBack | string | Полное имя метода обработки хука, например, "Mymodule_CallBack" |
$iPriority | int | Приоритер обработки, чем выше, тем раньше сработает хук относительно других |
{return} | bool |
public function AddDelegateModule($sName,$sCallBack,$iPriority=1) {
return $this->Add($sName,'module',$sCallBack,$iPriority,array('delegate'=>true));
}
Добавляет делегирующий обработчик хука с типом "module" Делегирующий хук применяется для перекрытия метода модуля, результат хука возвращает вместо результата метода модуля Позволяет в качестве обработчика использовать метод модуля
See Also
public bool AddExecFunction(string $sName, string $sCallBack, int $iPriority=1)
| ||
$sName | string | Имя хука |
$sCallBack | string | Функция обработки хука, например, "var_dump" |
$iPriority | int | Приоритер обработки, чем выше, тем раньше сработает хук относительно других |
{return} | bool |
public function AddExecFunction($sName,$sCallBack,$iPriority=1) {
return $this->Add($sName,'function',$sCallBack,$iPriority);
}
Добавляет обработчик хука с типом "function" Позволяет в качестве обработчика использовать функцию
See Also
public bool AddExecHook(string $sName, string $sCallBack, int $iPriority=1, array $aParams=array (
))
| ||
$sName | string | Имя хука |
$sCallBack | string | Метод хука, например, "InitAction" |
$iPriority | int | Приоритер обработки, чем выше, тем раньше сработает хук относительно других |
$aParams | array | Параметры |
{return} | bool |
public function AddExecHook($sName,$sCallBack,$iPriority=1,$aParams=array()) {
return $this->Add($sName,'hook',$sCallBack,$iPriority,$aParams);
}
Добавляет обработчик хука с типом "hook" Позволяет в качестве обработчика использовать метод хука(класса хука из каталога /classes/hooks/)
See Also
public bool AddExecModule(string $sName, string $sCallBack, int $iPriority=1)
| ||
$sName | string | Имя хука |
$sCallBack | string | Полное имя метода обработки хука, например, "Mymodule_CallBack" |
$iPriority | int | Приоритер обработки, чем выше, тем раньше сработает хук относительно других |
{return} | bool |
public function AddExecModule($sName,$sCallBack,$iPriority=1) {
return $this->Add($sName,'module',$sCallBack,$iPriority);
}
Добавляет обработчик хука с типом "module" Позволяет в качестве обработчика использовать метод модуля
See Also
public void Init()
|
public function Init() {
}
Инициализация модуля
public array Run($sName $sName, array &$aVars=array (
))
| ||
$sName | $sName | Имя хука |
$aVars | array | Список параметров хука, передаются в обработчик |
{return} | array |
public function Run($sName,&$aVars=array()) {
$result=array();
$sName=strtolower($sName);
$bTemplateHook=strpos($sName,'template_')===0 ? 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;
}
Запускает обаботку хуков
protected mixed|null RunType(array $aHook, array &$aVars)
| ||
$aHook | array | Данные хука |
$aVars | array | Параметры переданные в хук |
{return} | mixed|null |
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;
}
Запускает обработчик хука в зависимости от туипа обработчика