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;