Index: branches/5.3.x/core/kernel/utility/event.php =================================================================== diff -u -N -r16181 -r16222 --- branches/5.3.x/core/kernel/utility/event.php (.../event.php) (revision 16181) +++ branches/5.3.x/core/kernel/utility/event.php (.../event.php) (revision 16222) @@ -1,6 +1,6 @@ Init($prefix, $special); - } + /** + * Create event from given prefix, special, name and specific params. + * Parameter $params could be be an an array with following keys: "prefix", "special" (optional), "name". + * Parameter $params could be a string in format: "prefix:name" or "prefix.special:name". + * + * @param mixed $event_string Params. + * @param array $specific_params Event specific params (none by default). + * + * @throws InvalidArgumentException When incorrect event string given. + */ + public function __construct($event_string, array $specific_params = array()) + { + parent::__construct(); - $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 ( preg_match('/([^.:]*)[.]{0,1}([^:]*):(.*)/', $event_string, $regs) ) { + $prefix = $regs[1]; + $special = $regs[2]; - if ( $prefix ) { - $this->Init($prefix, $special); - } - - $this->Name = $regs[3]; - } - else { - $error_msg = 'Invalid event string: "' . $params . '". '; - $error_msg .= 'Should be in "prefix[.special]:OnEvent" format'; - throw new InvalidArgumentException($error_msg); - } - } + if ( $prefix ) { + $this->Init($prefix, $special); } - if ( isset($specific_params) ) { - $this->specificParams = $specific_params; - } + $this->Name = $regs[3]; + $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, '_'); + else { + $error_msg = 'Invalid event string: "' . $event_string . '". '; + $error_msg .= 'Should be in "prefix[.special]:OnEvent" format'; + throw new InvalidArgumentException($error_msg); } + } - /** - * Sets event parameter - * - * @param string $name - * @param mixed $value - * @access public - */ - public function setEventParam($name,$value) - { - $this->specificParams[$name] = $value; + /** + * Returns joined prefix and special if any. + * + * @param boolean $from_submit If true, then joins prefix & special by "_", uses "." otherwise. + * + * @return string + */ + public function getPrefixSpecial($from_submit = false) + { + if ( !$from_submit ) { + return parent::getPrefixSpecial(); } - /** - * Returns event parameter by name (supports digging) - * - * @param string $name - * @return mixed - * @access public - */ - public function getEventParam($name) - { - $args = func_get_args(); + return rtrim($this->Prefix . '_' . $this->Special, '_'); + } - if (count($args) > 1) { - kUtil::array_unshift_ref($args, $this->specificParams); + /** + * Sets event parameter. + * + * @param string $name Name. + * @param mixed $value Value. + * + * @return void + */ + public function setEventParam($name, $value) + { + $this->_specificParams[$name] = $value; + } - return call_user_func_array('getArrayValue', $args); // getArrayValue($this->specificParams, $name); - } + /** + * Returns event parameter by name (supports digging). + * + * @param string $name Name. + * + * @return mixed + */ + public function getEventParam($name) + { + $args = func_get_args(); - return array_key_exists($name, $this->specificParams) ? $this->specificParams[$name] : false; - } + if ( count($args) > 1 ) { + kUtil::array_unshift_ref($args, $this->_specificParams); - /** - * Returns all event parameters - * - * @return Array - * @access public - */ - public function getEventParams() - { - return $this->specificParams; + return call_user_func_array('getArrayValue', $args); } - /** - * 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; - } + return array_key_exists($name, $this->_specificParams) ? $this->_specificParams[$name] : false; + } - /** - * 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; + /** + * Returns all event parameters. + * + * @return array + */ + public function getEventParams() + { + return $this->_specificParams; + } - parent::Init($prefix, $special); - } + /** + * Set's pseudo class that differs from the one specified in $Prefix. + * + * @param string $appendix Appendix. + * + * @return void + */ + public function setPseudoClass($appendix) + { + $this->_pseudoClass = $this->Prefix . $appendix; + } - /** - * 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; + /** + * Performs event initialization. + * + * Also sets pseudo class same $prefix. + * + * @param string $prefix Prefix. + * @param string $special Special. + * + * @return void + */ + public function Init($prefix, $special) + { + $this->_pseudoClass = $prefix; - // 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; - } + parent::Init($prefix, $special); + } - $params['parent_event'] = $top_event; + /** + * Returns object used in event. + * + * @param array $params Params. + * + * @return kDBBase + */ + 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; } - return $this->Application->recallObject($this->prefixSpecial, $this->pseudoClass, $params); + $params['parent_event'] = $top_event; } - /** - * 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; - } + return $this->Application->recallObject($this->prefixSpecial, $this->_pseudoClass, $params); + } - $child_event = new kEvent($name); - $child_event->copyFrom($this, true); - - $this->Application->HandleEvent($child_event); - $this->copyFrom($child_event); - $this->specificParams = $child_event->specificParams; + /** + * 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). + * + * @return void + * @see kEvent::MasterEvent + * @todo Overwrites 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; } - /** - * 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; - } + $child_event = new kEvent($name); + $child_event->copyFrom($this, true); - $this->redirect = $source_event->redirect; - $this->redirectParams = $source_event->redirectParams; - $this->redirectScript = $source_event->redirectScript; - $this->specificParams = $source_event->specificParams; - } + $this->Application->HandleEvent($child_event); + $this->copyFrom($child_event); + $this->_specificParams = $child_event->_specificParams; + } - /** - * Returns all redirect parameters - * - * @return Array - * @access public - */ - public function getRedirectParams() - { - return $this->redirectParams; + /** + * Allows to copy data between events. + * + * @param kEvent $source_event Source event. + * @param boolean $inherit Keep reference to source event in copied event. + * + * @return void + */ + public function copyFrom(kEvent $source_event, $inherit = false) + { + if ( $inherit ) { + $this->MasterEvent = $source_event; } - - /** - * 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; + else { + $this->status = $source_event->status; } - /** - * Set's redirect param for event - * - * @param string $name - * @param string $value - * @access public - */ - public function SetRedirectParam($name, $value) - { - $this->redirectParams[$name] = $value; - } + $this->redirect = $source_event->redirect; + $this->_redirectParams = $source_event->_redirectParams; + $this->redirectScript = $source_event->redirectScript; + $this->_specificParams = $source_event->_specificParams; + } - /** - * 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); - } + /** + * Returns all redirect parameters. + * + * @return array + */ + public function getRedirectParams() + { + return $this->_redirectParams; + } - $this->redirectParams = $params; - } + /** + * Returns redirect parameter. + * + * @param string $name Name. + * + * @return mixed + */ + public function getRedirectParam($name) + { + return array_key_exists($name, $this->_redirectParams) ? $this->_redirectParams[$name] : false; + } - /** - * 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; - } + /** + * Set's redirect param for event. + * + * @param string $name Name. + * @param string $value Value. + * + * @return void + */ + public function SetRedirectParam($name, $value) + { + $this->_redirectParams[$name] = $value; + } - return $this->Application->EventManager->eventRunning($event_key); + /** + * Allows to merge passed redirect params hash with existing ones. + * + * @param array $params Params. + * @param boolean $append Append to existing parameters. + * + * @return void + */ + public function setRedirectParams(array $params, $append = true) + { + if ( $append ) { + $params = kUtil::array_merge_recursive($this->_redirectParams, $params); } - /** - * Returns permission section associated with event - * - * @return string - * @access public - */ - public function getSection() - { - $perm_section = $this->getEventParam('PermSection'); + $this->_redirectParams = $params; + } - if ( $perm_section ) { - return $perm_section; - } + /** + * Allows to tell if this event was called some how (e.g. sub-event, hook) from event requested. + * + * @param string $event_key Event key in format: "[prefix[.special]:]event_name". + * + * @return boolean + */ + public function hasAncestor($event_key) + { + if ( strpos($event_key, ':') === false ) { + $event_key = $this->getPrefixSpecial() . ':' . $event_key; + } - // 1. get section by current top_prefix - $top_prefix = $this->getEventParam('top_prefix'); + return $this->Application->EventManager->eventRunning($event_key); + } - if ( $top_prefix == false ) { - $top_prefix = $this->Application->GetTopmostPrefix($this->Prefix, true); - $this->setEventParam('top_prefix', $top_prefix); - } + /** + * Returns permission section associated with event. + * + * @return string + * @throws Exception When permission section not specified for event's unit. + */ + public function getSection() + { + $perm_section = $this->getEventParam('PermSection'); - $section = $this->Application->getUnitConfig($top_prefix)->getPermSectionByName('main'); + if ( $perm_section ) { + return $perm_section; + } - // 2. check if this section has perm_prefix mapping to other prefix - $sections_helper = $this->Application->recallObject('SectionsHelper'); - /* @var $sections_helper kSectionsHelper */ + // 1. get section by current top_prefix. + $top_prefix = $this->getEventParam('top_prefix'); - $section_data =& $sections_helper->getSectionData($section); + if ( $top_prefix == false ) { + $top_prefix = $this->Application->GetTopmostPrefix($this->Prefix, true); + $this->setEventParam('top_prefix', $top_prefix); + } - 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->getUnitConfig($section_data['perm_prefix'])->getPermSectionByName('main'); - } + $section = $this->Application->getUnitConfig($top_prefix)->getPermSectionByName('main'); - if ( !$section ) { - throw new Exception('Permission section not specified for prefix ' . $top_prefix . ''); - } + // 2. check if this section has perm_prefix mapping to other prefix. + $sections_helper = $this->Application->recallObject('SectionsHelper'); + /* @var $sections_helper kSectionsHelper */ - return $section; + $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->getUnitConfig($section_data['perm_prefix'])->getPermSectionByName('main'); } - public function __toString() - { - return $this->getPrefixSpecial() . ':' . $this->Name; + if ( !$section ) { + $error_msg = 'Permission section not specified for'; + $error_msg .= ' prefix ' . $top_prefix . ''; + throw new Exception($error_msg); } + + return $section; } + + /** + * Casts object to string. + * + * @return string + */ + public function __toString() + { + return $this->getPrefixSpecial() . ':' . $this->Name; + } + +}