Init($prefix, $special); } $this->Name = isset($params['name']) ? $params['name'] : ''; } elseif ( is_string($params) ) { if (preg_match('/([^.:]*)[.]{0,1}([^:]*):(.*)/', $params, $regs)) { $prefix = $regs[1]; $special = $regs[2]; if ($prefix) { $this->Init($prefix, $special); } $this->Name = $regs[3]; } else { throw new Exception('Invalid event string: "' . $params . '". Should be in "prefix[.special]:OnEvent" format'); } } } if ( isset($specific_params) ) { $this->specificParams = $specific_params; } } /** * Returns joined prefix and special if any * * @param bool $from_submit if true, then joins prefix & special by "_", uses "." otherwise * @return string * @access public */ public function getPrefixSpecial($from_submit = false) { if (!$from_submit) { return parent::getPrefixSpecial(); } return rtrim($this->Prefix . '_' . $this->Special, '_'); } /** * Sets event parameter * * @param string $name * @param mixed $value * @access public */ public function setEventParam($name,$value) { $this->specificParams[$name] = $value; } /** * Returns event parameter by name (supports digging) * * @param string $name * @return mixed * @access public */ public function getEventParam($name) { $args = func_get_args(); if (count($args) > 1) { kUtil::array_unshift_ref($args, $this->specificParams); return call_user_func_array('getArrayValue', $args); // getArrayValue($this->specificParams, $name); } return array_key_exists($name, $this->specificParams) ? $this->specificParams[$name] : false; } /** * Returns all event parameters * * @return Array * @access public */ public function getEventParams() { return $this->specificParams; } /** * Set's pseudo class that differs from * the one specified in $Prefix * * @param string $appendix * @access public */ public function setPseudoClass($appendix) { $this->pseudoClass = $this->Prefix . $appendix; } /** * Performs event initialization * Also sets pseudo class same $prefix * * @param string $prefix * @param string $special * @access public */ public function Init($prefix, $special) { $this->pseudoClass = $prefix; parent::Init($prefix, $special); } /** * Returns object used in event * * @param Array $params * @return kDBBase * @access public */ public function getObject(array $params = Array()) { if ( !$this->Application->hasObject($this->prefixSpecial) ) { $top_event = $this; // when OnSave calls OnPreSave in first line, then this would make sure OnSave is used while ( is_object($top_event->MasterEvent) ) { $top_event = $top_event->MasterEvent; } $params['parent_event'] = $top_event; } return $this->Application->recallObject($this->prefixSpecial, $this->pseudoClass, $params); } /** * Executes given event in context of current event * Sub-event gets this event in "kEvent::MasterEvent" attribute. * Sub-event execution results (status and redirect* properties) are copied back to current event. * * @param string $name name of callable event (optionally could contain prefix_special as well) * @see kEvent::MasterEvent * @todo Will overwrite master event data with called event data, which makes 'parent_event' useless in most cases */ public function CallSubEvent($name) { if ( strpos($name, ':') === false ) { // PrefixSpecial not specified -> use from current event $name = $this->getPrefixSpecial() . ':' . $name; } $child_event = new kEvent($name); $child_event->copyFrom($this, true); $this->Application->HandleEvent($child_event); $this->copyFrom($child_event); $this->specificParams = $child_event->specificParams; } /** * Allows to copy data between events * * @param kEvent $source_event * @param bool $inherit * @access public */ public function copyFrom($source_event, $inherit = false) { if ( $inherit ) { $this->MasterEvent = $source_event; } else { $this->status = $source_event->status; } $this->redirect = $source_event->redirect; $this->redirectParams = $source_event->redirectParams; $this->redirectScript = $source_event->redirectScript; $this->specificParams = $source_event->specificParams; } /** * Returns all redirect parameters * * @return Array * @access public */ public function getRedirectParams() { return $this->redirectParams; } /** * Returns redirect parameter * * @param string $name * @return mixed * @access public */ public function getRedirectParam($name) { return array_key_exists($name, $this->redirectParams) ? $this->redirectParams[$name] : false; } /** * Set's redirect param for event * * @param string $name * @param string $value * @access public */ public function SetRedirectParam($name, $value) { $this->redirectParams[$name] = $value; } /** * Allows to merge passed redirect params hash with existing ones * * @param Array $params * @param bool $append * @access public */ public function setRedirectParams($params, $append = true) { if ( $append ) { // append new parameters to parameters set before $params = kUtil::array_merge_recursive($this->redirectParams, $params); } $this->redirectParams = $params; } /** * Allows to tell if this event was called some how (e.g. subevent, hook) from event requested * * @param string $event_key event key in format [prefix[.special]:]event_name * @return bool * @access public */ public function hasAncestor($event_key) { if ( strpos($event_key, ':') === false ) { $event_key = $this->getPrefixSpecial() . ':' . $event_key; } return $this->Application->EventManager->eventRunning($event_key); } /** * Returns permission section associated with event * * @return string * @access public */ public function getSection() { $perm_section = $this->getEventParam('PermSection'); if ($perm_section) { return $perm_section; } // 1. get section by current top_prefix $top_prefix = $this->getEventParam('top_prefix'); if ($top_prefix == false) { $top_prefix = $this->Application->GetTopmostPrefix($this->Prefix, true); $this->setEventParam('top_prefix', $top_prefix); } $section = $this->Application->getUnitOption($top_prefix.'.main', 'PermSection'); // 2. check if this section has perm_prefix mapping to other prefix $sections_helper = $this->Application->recallObject('SectionsHelper'); /* @var $sections_helper kSectionsHelper */ $section_data =& $sections_helper->getSectionData($section); if ($section_data && isset($section_data['perm_prefix']) && $section_data['perm_prefix'] != $top_prefix) { $this->setEventParam('top_prefix', $section_data['perm_prefix']); $section = $this->Application->getUnitOption($section_data['perm_prefix'].'.main', 'PermSection'); } if (!$section) { throw new Exception('Permission section not specified for prefix ' . $top_prefix . ''); } return $section; } public function __toString() { return $this->getPrefixSpecial() . ':' . $this->Name; } }