N°4756 - Global event listeners

This commit is contained in:
Eric Espie
2022-09-21 10:34:38 +02:00
parent b01627f39d
commit fac455da48

View File

@@ -372,7 +372,7 @@ class MFCompiler
} }
$this->LoadSnippets(); $this->LoadSnippets();
$this->LoadHooks(); $this->LoadGlobalEventListeners();
// Compile, module by module // Compile, module by module
// //
@@ -3616,102 +3616,76 @@ EOF;
/** /**
* @throws \DOMFormatException * @throws \DOMFormatException
*/ */
protected function LoadHooks() protected function LoadGlobalEventListeners()
{ {
$sClassName = 'GlobalEventHooks'; $sClassName = 'GlobalEventListeners';
$sModuleId = '_core_'; $sModuleId = '_core_';
if (!array_key_exists($sModuleId, $this->aSnippets)) if (!array_key_exists($sModuleId, $this->aSnippets)) {
{ $this->aSnippets[$sModuleId] = ['before' => [], 'after' => []];
$this->aSnippets[$sModuleId] = array('before' => array(), 'after' => array());
} }
$oHooks = $this->oFactory->GetNodes('/itop_design/hooks/hook'); $oEventListeners = $this->oFactory->GetNodes('/itop_design/event_listeners/listener');
$aHooks = array(); $aEventListeners = [];
foreach($oHooks as $oHook) foreach ($oEventListeners as $oListener) {
{ /** @var \DOMElement $oListener */
/** @var \DOMElement $oHook */ $sListenerId = $oListener->getAttribute('id');
$sEventName = $oHook->getAttribute('id'); $sEventName = $oListener->GetChildText('event');
$oListeners = $oHook->GetOptionalElement('listeners');
if ($oListeners)
{
foreach ($oListeners->getElementsByTagName('listener') as $oListener)
{
/** @var \DOMElement $oListener */
$sListenerId = $oListener->getAttribute('id');
$oExecute = $oListener->GetUniqueElement('execute', true);
$sExecute = trim($oExecute->GetText());
$sCallback = "{$sEventName}_{$sListenerId}";
$sCallbackFct = preg_replace('@^function\s*\(@', "public static function {$sCallback}(", $sExecute);
if ($sExecute == $sCallbackFct)
{
throw new DOMFormatException("Malformed tag <execute> in hook: {$sEventName} listener: {$sListenerId}");
}
$fPriority = (float)($oListener->GetChildText('priority', '0'));
$aFilters = array(); $oExecute = $oListener->GetUniqueElement('execute');
$oFilters = $oListener->GetOptionalElement('filters'); $sExecute = trim($oExecute->GetText());
if ($oFilters) $sCallback = "{$sEventName}_{$sListenerId}";
{ $sCallbackFct = preg_replace('@^function\s*\(@', "public static function $sCallback(", $sExecute);
foreach ($oFilters->getElementsByTagName('filter') as $oFilter) if ($sExecute == $sCallbackFct) {
{ throw new DOMFormatException("Malformed tag <execute> in event: $sEventName listener: $sListenerId");
$aFilters[] = $oFilter->GetText();
}
}
if (empty($aFilters))
{
$sEventSource = 'null';
}
else
{
$sEventSource = '["'.implode('", "', $aFilters).'"]';
}
$aContexts = array();
$oContexts = $oListener->GetOptionalElement('contexts');
if ($oContexts)
{
foreach ($oContexts->getElementsByTagName('context') as $oContext)
{
$aContexts[] = $oContext->GetText();
}
}
if (empty($aContexts))
{
$sContext = 'null';
}
else
{
$sContext = '["'.implode('", "', $aContexts).'"]';
}
$aHooks[] = array(
'event_name' => $sEventName,
'callback' => $sCallback,
'content' => $sCallbackFct,
'priority' => $fPriority,
'source' => $sEventSource,
'context' => $sContext,
);
}
} }
$fPriority = (float)($oListener->GetChildText('priority', '0'));
$aFilters = [];
$oFilters = $oListener->GetNodes('filters/filter');
foreach ($oFilters as $oFilter) {
$aFilters[] = $oFilter->GetText();
}
if (empty($aFilters)) {
$sEventSource = 'null';
} else {
$sEventSource = '["'.implode('", "', $aFilters).'"]';
}
$aContexts = [];
$oContexts = $oListener->GetNodes('contexts/context');
foreach ($oContexts as $oContext) {
$aContexts[] = $oContext->GetText();
}
if (empty($aContexts)) {
$sContext = 'null';
} else {
$sContext = '["'.implode('", "', $aContexts).'"]';
}
$aEventListeners[] = array(
'event_name' => $sEventName,
'callback' => $sCallback,
'content' => $sCallbackFct,
'priority' => $fPriority,
'source' => $sEventSource,
'context' => $sContext,
);
} }
if (empty($aHooks)) if (empty($aEventListeners)) {
{
return; return;
} }
$sRegister = ''; $sRegister = '';
$sMethods = ''; $sMethods = '';
foreach ($aHooks as $aHook) foreach ($aEventListeners as $aListener) {
{ $sCallback = $aListener['callback'];
$sCallback = $aHook['callback']; $sEventName = $aListener['event_name'];
$sEventName = $aHook['event_name']; $sEventSource = $aListener['source'];
$sEventSource = $aHook['source']; $sContext = $aListener['context'];
$sContext = $aHook['context']; $sPriority = $aListener['priority'];
$sPriority = $aHook['priority'];
$sRegister .= "\nCombodo\iTop\Service\EventService::RegisterListener(\"$sEventName\", '$sClassName::$sCallback', $sEventSource, null, $sContext, $sPriority, '$sModuleId');"; $sRegister .= "\nCombodo\iTop\Service\EventService::RegisterListener(\"$sEventName\", '$sClassName::$sCallback', $sEventSource, null, $sContext, $sPriority, '$sModuleId');";
$sCallbackFct = $aHook['content']; $sCallbackFct = $aListener['content'];
$sMethods .= "\n {$sCallbackFct}\n\n"; $sMethods .= "\n $sCallbackFct\n\n";
} }
$sContent = <<<PHP $sContent = <<<PHP
@@ -3726,12 +3700,11 @@ PHP;
$fOrder = 0; $fOrder = 0;
$this->aSnippets[$sModuleId]['after'][] = array( $this->aSnippets[$sModuleId]['after'][] = array(
'rank' => $fOrder, 'rank' => $fOrder,
'content' => $sContent, 'content' => $sContent,
'snippet_id' => $sClassName, 'snippet_id' => $sClassName,
); );
foreach($this->aSnippets as $sModuleId => $void) foreach ($this->aSnippets as $sModuleId => $void) {
{
uasort($this->aSnippets[$sModuleId]['after'], array(get_class($this), 'SortOnRank')); uasort($this->aSnippets[$sModuleId]['after'], array(get_class($this), 'SortOnRank'));
} }
} }