Index: trunk/core/kernel/event_manager.php =================================================================== diff -u -N -r3905 -r3907 --- trunk/core/kernel/event_manager.php (.../event_manager.php) (revision 3905) +++ trunk/core/kernel/event_manager.php (.../event_manager.php) (revision 3907) @@ -70,6 +70,9 @@ */ var $afterHooks = Array(); + + var $recursionStack = Array(); + function kEventManager() { parent::kBase(); @@ -153,13 +156,41 @@ } /** + * Check if event is called twice, that causes recursion + * + * @param kEvent $event + */ + function isRecursion(&$event) + { + $event_key = $event->getPrefixSpecial().':'.$event->Name; + return in_array($event_key, $this->recursionStack) ? true : false; + } + + function pushEvent(&$event) + { + $event_key = $event->getPrefixSpecial().':'.$event->Name; + array_push($this->recursionStack, $event_key); + } + + function popEvent() + { + array_pop($this->recursionStack); + } + + /** * Allows to process any type of event * * @param kEvent $event * @access public */ function HandleEvent(&$event) { + if ($this->isRecursion($event)) { + return true; + } + + $this->pushEvent($event); + if( !$this->Application->prefixRegistred($event->Prefix) ) { trigger_error('Prefix '.$event->Prefix.' not registred (requested event '.$event->Name.')', E_USER_NOTICE); @@ -179,6 +210,8 @@ $this->processHooks($event, hAFTER); } + $this->popEvent(); + return true; } @@ -346,6 +379,11 @@ if ($hooks) { foreach ($hooks as $hook) { + if ($hook['DoSpecial'] == '*') { + // use same special as master event + $hook['DoSpecial'] = $event->Special; + } + $prefix_special = rtrim($hook['DoPrefix'].'_'.$hook['DoSpecial'], '_'); if ( $hook['Conditional'] && !$this->Application->GetVar($prefix_special) ) { continue;