beforeHooks = $data['EventManager.beforeHooks']; $this->afterHooks = $data['EventManager.afterHooks']; } /** * Gets object data for caching * * @return Array * @access public */ public function getToCache() { return Array ( 'EventManager.beforeHooks' => $this->beforeHooks, 'EventManager.afterHooks' => $this->afterHooks ); } /** * Returns hooks by mode * * @param int $mode * @return Array * @access protected */ protected function &getHooksByMode($mode) { if ($mode == hBEFORE) { return $this->beforeHooks; } return $this->afterHooks; } /** * Registers Hook from subprefix event to master prefix event * * @param string $hook_event * @param string $do_event * @param int $mode * @param bool $conditional * @access public */ public function registerHook($hook_event, $do_event, $mode = hAFTER, $conditional = false) { $hook_event = new kEvent($hook_event); $do_event = new kEvent($do_event); if ( ($hook_event->Prefix != '*') && !$this->Application->prefixRegistred($hook_event->Prefix) ) { if ($this->Application->isDebugMode()) { trigger_error('Prefix ' . $hook_event->Prefix . ' doesn\'t exist when trying to hook from ' . (string)$do_event . '', E_USER_WARNING); } return; } $hooks =& $this->getHooksByMode($mode); $hook_key = str_replace(':', '.', (string)$hook_event); $hooks[ strtolower($hook_key) ][] = Array ( 'DoPrefix' => $do_event->Prefix, 'DoSpecial' => $do_event->Special, 'DoEvent' => $do_event->Name, 'Conditional' => $conditional, ); } /** * Runs hooks for given event * * @param kEvent $event * @param int $mode hBEFORE or hAFTER * @access public */ public function runHooks($event, $mode) { // * - get hooks that are valid with any special of given prefix $hooks = array_merge( // given prefix, any special $this->_getHooks($event, $mode, $event->Prefix.'.*'), // given special, given special $this->_getHooks($event, $mode), // any prefix, any special $this->_getHooks($event, $mode, '*.*'), // any prefix, given special $this->_getHooks($event, $mode, rtrim('*.' . $event->Special, '.')) ); if (!$hooks) { return ; } 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; } if ( $this->Application->prefixRegistred($hook['DoPrefix']) ) { // run hook only, when it's config is found $hook_event = new kEvent($hook['DoPrefix'] . '.' . $hook['DoSpecial'] . ':' . $hook['DoEvent']); $hook_event->MasterEvent =& $event; $this->Application->HandleEvent($hook_event); } } } /** * Returns hooks for given event * * @param kEvent $event * @param int $mode hBEFORE or hAFTER * @param string $event_key * @return Array * @access protected */ protected function &_getHooks($event, $mode, $event_key = null) { $hooks =& $this->getHooksByMode($mode); $event_key = isset($event_key) ? $event_key : $event->getPrefixSpecial(); if (!isset($hooks[strtolower($event_key.'.'.$event->Name)])) { $ret = Array (); return $ret; } return $hooks[ strtolower($event_key.'.'.$event->Name) ]; } }