Index: trunk/core/kernel/event_manager.php =================================================================== diff -u -r939 -r1339 --- trunk/core/kernel/event_manager.php (.../event_manager.php) (revision 939) +++ trunk/core/kernel/event_manager.php (.../event_manager.php) (revision 1339) @@ -88,12 +88,23 @@ */ function HandleEvent(&$event) { + if (!$event->SkipBeforeHooks) { + $this->processHooks($event, hBEFORE); + if ($event->status == erFATAL) return; + } + $event_handler =& $this->Application->recallObject($event->Prefix.'_EventHandler'); - $event_handler->processEvent(&$event); + $event_handler->processEvent($event); + if ($event->status == erFATAL) return; + if (!$event->SkipAfterHooks) { + $this->processHooks($event, hAFTER); + } } function ProcessRequest() { + $this->processOpener(); + // 1. get events from $_POST $events=$this->Application->GetVar('events'); if($events===false) $events=Array(); @@ -111,7 +122,7 @@ } } - //print_pre($events); + $passed = explode(',', $this->Application->GetVar('passed')); foreach($events as $prefix_special => $event_name) { if(!$event_name) continue; @@ -121,27 +132,93 @@ $prefix_special=explode('.',$prefix_special); $event->Prefix=$prefix_special[0]; + array_push($passed, $prefix_special[0]); $event->Special=isset($prefix_special[1])?$prefix_special[1]:''; - $event->redirect=$this->Application->RecallVar('redirect_to'); - $this->HandleEvent(&$event); + $event->redirect_params = Array('opener'=>'s', 'pass'=>'all'); + $event->redirect = true; + $this->HandleEvent($event); + + if($event->status==erSUCCESS && ($event->redirect === true || strlen($event->redirect) > 0) ) + { + $this->Application->Redirect($event->redirect, $event->redirect_params, null, $event->redirect_script); + } } + $this->Application->SetVar('passed', implode(',', $passed)); } - function registerHook($hookto_unit, $hookto_event_name, $mode, $do_unit, $do_event_name) + function processOpener() { - - - - + $opener_action=$this->Application->GetVar('m_opener'); + $opener_stack=$this->Application->RecallVar('opener_stack'); + $opener_stack=$opener_stack?unserialize($opener_stack):Array(); + switch($opener_action) + { + case 'r': // "reset" opener stack + $opener_stack=Array(); + break; + + case 'd': // "down/push" new template to opener stack, deeplevel++ + array_push($opener_stack, $this->Application->RecallVar('last_template') ); + break; + + case 'u': // "up/pop" last template from opener stack, deeplevel-- + array_pop($opener_stack); + break; + + default: // "s/0," stay on same deep level + break; + } + $this->Application->SetVar('m_opener','s'); + $this->Application->StoreVar('opener_stack',serialize($opener_stack)); } + function registerHook($hookto_prefix, $hookto_special, $hookto_event, $mode, $do_prefix, $do_special, $do_event, $conditional) + { + $hookto_prefix_special = rtrim($hookto_prefix.'.'.$hookto_special, '.'); + if ($mode == hBEFORE) { + $this->beforeHooks[strtolower($hookto_prefix_special.'.'.$hookto_event)][] = Array( + 'DoPrefix' => $do_prefix, + 'DoSpecial' => $do_special, + 'DoEvent' => $do_event, + 'Conditional' => $conditional, + ); + } + elseif ($mode == hAFTER) { + $this->afterHooks[strtolower($hookto_prefix_special.'.'.$hookto_event)][] = Array( + 'DoPrefix' => $do_prefix, + 'DoSpecial' => $do_special, + 'DoEvent' => $do_event, + 'Conditional' => $conditional, + ); + } + } + + /** + * Enter description here... + * + * @param kEvent $event + * @param int $mode hBEFORE or hAFTER + */ function processHooks(&$event, $mode) { - - - - + if ($mode == hBEFORE) { + $mode_hooks =& $this->beforeHooks; + } + else { + $mode_hooks =& $this->afterHooks; + } + if ( $hooks = getArrayValue($mode_hooks, strtolower($event->Prefix_Special.'.'.$event->Name)) ) { + foreach($hooks as $hook) + { + $prefix_special = rtrim($hook['DoPrefix'].'_'.$hook['DoSpecial'],'_'); + if( $hook['Conditional'] && !$this->Application->GetVar($prefix_special) ) continue; + $hook_event = new kEvent( Array('name'=>$hook['DoEvent'],'prefix'=>$hook['DoPrefix'],'special'=>$hook['DoSpecial']) ); + $hook_event->MasterEvent =& $event; + + $this->HandleEvent($hook_event); + } + } } /**