ModuleHook
Package | framework.modules |
---|---|
Inheritance | class ModuleHook » Module » LsObject |
Since | 1.0 |
Source Code | /framework/classes/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 |
---|---|---|---|
_aBehaviors | Список поведений в виде готовых объектов, формируется автоматически | LsObject | |
aBehaviors | array | Список поведений | LsObject |
aHooks | array( | Содержит список хуков | ModuleHook |
aHooksBehavior | array | Список хуков для поведений - в них есть привязка к конкретному объекту | ModuleHook |
aHooksObject | array | Список объектов обработки хукков, для их кешировани | ModuleHook |
bIsInit | bool | Указывает на то, была ли проведенна инициализация модуля | Module |
Public Methods
Method | Description | Defined 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
Method | Description | Defined By |
---|---|---|
PrepareBehaviors() | Инициализация поведений | LsObject |
RunType() | Запускает обработчик хука в зависимости от туипа обработчика | ModuleHook |
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 AddHookBehavior(string $sName, LsObject $oObject, array $aCallback, int $iPriority=1)
| ||
$sName | string | Имя хука |
$oObject | LsObject | Объект которому принадлежит хук |
$aCallback | array | Коллбек |
$iPriority | int | Приоритет |
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);
}
Добавление хука для поведения
public void Init()
|
public function Init()
{
}
Инициализация модуля
public bool RemoveHookBehavior(string $sName, LsObject $oObject, array|null $aCallback=NULL)
| ||
$sName | string | Имя хука |
$oObject | LsObject | Объект которому принадлежит хук |
$aCallback | array|null | Коллбек, если не задан, то будут удалены все коллбеки |
{return} | bool |
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;
}
Удаляет хук поведения
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;
}
Запускает обаботку хуков
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 |
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($aHooks, SORT_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;
}
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 '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;
}
Запускает обработчик хука в зависимости от туипа обработчика