2009-05-10 10:50:39 +03:00
|
|
|
|
<?php
|
2009-05-09 20:04:04 +03:00
|
|
|
|
/*-------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* LiveStreet Engine Social Networking
|
|
|
|
|
* Copyright © 2008 Mzhelskiy Maxim
|
|
|
|
|
*
|
|
|
|
|
*--------------------------------------------------------
|
|
|
|
|
*
|
|
|
|
|
* Official site: www.livestreet.ru
|
|
|
|
|
* Contact e-mail: rus.engine@gmail.com
|
|
|
|
|
*
|
|
|
|
|
* GNU General Public License, version 2:
|
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
|
*
|
|
|
|
|
---------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
/**
|
|
|
|
|
* Модуль поддержки хуков(hooks)
|
|
|
|
|
*
|
|
|
|
|
*/
|
2010-05-27 17:02:43 +03:00
|
|
|
|
class ModuleHook extends Module {
|
2009-05-09 20:04:04 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Содержит список хуков
|
|
|
|
|
*
|
|
|
|
|
* @var array( 'name' => array(
|
|
|
|
|
* array(
|
|
|
|
|
* 'type' => 'module' | 'hook' | 'function',
|
|
|
|
|
* 'callback' => 'callback_name',
|
|
|
|
|
* 'priority' => 1,
|
|
|
|
|
* 'params' => array()
|
|
|
|
|
* ),
|
|
|
|
|
* ),
|
|
|
|
|
* )
|
|
|
|
|
*/
|
|
|
|
|
protected $aHooks=array();
|
2010-08-21 10:26:37 +03:00
|
|
|
|
/**
|
|
|
|
|
* Hook objects
|
|
|
|
|
*
|
|
|
|
|
* @var unknown_type
|
|
|
|
|
*/
|
|
|
|
|
protected $aHooksObject=array();
|
2009-05-09 20:04:04 +03:00
|
|
|
|
/**
|
|
|
|
|
* Инициализация модуля
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public function Init() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function Add($sName,$sType,$sCallBack,$iPriority=1,$aParams=array()) {
|
2010-03-26 16:08:16 +02:00
|
|
|
|
$sName=strtolower($sName);
|
2009-05-09 20:04:04 +03:00
|
|
|
|
$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 function AddExecModule($sName,$sCallBack,$iPriority=1) {
|
|
|
|
|
return $this->Add($sName,'module',$sCallBack,$iPriority);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function AddExecFunction($sName,$sCallBack,$iPriority=1) {
|
|
|
|
|
return $this->Add($sName,'function',$sCallBack,$iPriority);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function AddExecHook($sName,$sCallBack,$iPriority=1,$aParams=array()) {
|
|
|
|
|
return $this->Add($sName,'hook',$sCallBack,$iPriority,$aParams);
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-26 16:08:16 +02:00
|
|
|
|
public function AddDelegateModule($sName,$sCallBack,$iPriority=1) {
|
|
|
|
|
return $this->Add($sName,'module',$sCallBack,$iPriority,array('delegate'=>true));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function AddDelegateFunction($sName,$sCallBack,$iPriority=1) {
|
|
|
|
|
return $this->Add($sName,'function',$sCallBack,$iPriority,array('delegate'=>true));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function AddDelegateHook($sName,$sCallBack,$iPriority=1,$aParams=array()) {
|
|
|
|
|
$aParams['delegate']=true;
|
|
|
|
|
return $this->Add($sName,'hook',$sCallBack,$iPriority,$aParams);
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-28 00:13:36 +02:00
|
|
|
|
public function Run($sName,&$aVars=array()) {
|
2010-03-26 16:08:16 +02:00
|
|
|
|
$result=array();
|
|
|
|
|
$sName=strtolower($sName);
|
2010-04-18 15:42:42 +03:00
|
|
|
|
$bTemplateHook=strpos($sName,'template_')===0 ? true : false;
|
2009-05-09 20:04:04 +03:00
|
|
|
|
if (isset($this->aHooks[$sName])) {
|
|
|
|
|
$aHookNum=array();
|
2010-03-26 16:08:16 +02:00
|
|
|
|
$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'];
|
|
|
|
|
}
|
2009-05-09 20:04:04 +03:00
|
|
|
|
}
|
|
|
|
|
arsort($aHookNum,SORT_NUMERIC);
|
2010-03-26 16:08:16 +02:00
|
|
|
|
arsort($aHookNumDelegate,SORT_NUMERIC);
|
|
|
|
|
/**
|
|
|
|
|
* Сначала запускаем на выполнение простые
|
|
|
|
|
*/
|
2009-05-09 20:04:04 +03:00
|
|
|
|
foreach ($aHookNum as $iKey => $iPr) {
|
|
|
|
|
$aHook=$this->aHooks[$sName][$iKey];
|
2010-04-18 15:42:42 +03:00
|
|
|
|
if ($bTemplateHook) {
|
|
|
|
|
/**
|
|
|
|
|
* Если это шаблонных хук то сохраняем результат
|
|
|
|
|
*/
|
|
|
|
|
$result['template_result'][]=$this->RunType($aHook,$aVars);
|
|
|
|
|
} else {
|
|
|
|
|
$this->RunType($aHook,$aVars);
|
|
|
|
|
}
|
2010-03-26 16:08:16 +02:00
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Теперь запускаем делигирующие
|
|
|
|
|
* Делегирующий хук должен вернуть результат в формате:
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
foreach ($aHookNumDelegate as $iKey => $iPr) {
|
|
|
|
|
$aHook=$this->aHooks[$sName][$iKey];
|
|
|
|
|
$result=array(
|
|
|
|
|
'delegate_result'=>$this->RunType($aHook,$aVars)
|
|
|
|
|
);
|
|
|
|
|
/**
|
|
|
|
|
* На данный момент только один хук может быть делегирующим
|
|
|
|
|
*/
|
|
|
|
|
break;
|
2009-05-09 20:04:04 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
2010-03-26 16:08:16 +02:00
|
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-28 00:13:36 +02:00
|
|
|
|
protected function RunType($aHook,&$aVars) {
|
2010-03-26 16:08:16 +02:00
|
|
|
|
$result=null;
|
|
|
|
|
switch ($aHook['type']) {
|
|
|
|
|
case 'module':
|
2010-03-28 00:13:36 +02:00
|
|
|
|
$result=call_user_func_array(array($this,$aHook['callback']),array(&$aVars));
|
2010-03-26 16:08:16 +02:00
|
|
|
|
break;
|
|
|
|
|
case 'function':
|
2010-03-28 00:13:36 +02:00
|
|
|
|
$result=call_user_func_array($aHook['callback'],array(&$aVars));
|
2010-03-26 16:08:16 +02:00
|
|
|
|
break;
|
|
|
|
|
case 'hook':
|
2010-08-21 10:26:37 +03:00
|
|
|
|
$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;
|
|
|
|
|
}
|
2010-03-28 00:13:36 +02:00
|
|
|
|
$result=call_user_func_array(array($oHook,$aHook['callback']),array(&$aVars));
|
2010-03-26 16:08:16 +02:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
2009-05-09 20:04:04 +03:00
|
|
|
|
}
|
|
|
|
|
?>
|