Page MenuHomeIn-Portal Phabricator

event.php
No OneTemporary

File Metadata

Created
Wed, Oct 8, 5:35 AM

event.php

<?php
/**
* @version $Id: event.php 16519 2017-01-20 20:21:46Z alex $
* @package In-Portal
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
final class kEvent extends kBase
{
/**
* Event finished working successfully.
*/
const erSUCCESS = 0;
/**
* Event finished working, but result is unsuccessful.
*/
const erFAIL = -1;
/**
* Event experienced FATAL error - no hooks should continue!
*/
const erFATAL = -2;
/**
* Event failed on internal permission checking (user has no permission).
*/
const erPERM_FAIL = -3;
/**
* Event requested to stop processing (don't parse templates).
*/
const erSTOP = -4;
/**
* Flag, set as event parameter, that indicates that ID is coming from Web Request.
*/
const FLAG_ID_FROM_REQUEST = 'id_from_request';
/**
* Reference to event, that created given event.
*
* @var self
*/
public $MasterEvent;
/**
* Event name.
*
* @var string
*/
public $Name;
/**
* Don't execute hooks, before event processing.
*
* @var boolean
*/
public $SkipBeforeHooks = false;
/**
* Don't execute hooks, after event processing.
*
* @var boolean
*/
public $SkipAfterHooks = false;
/**
* Perform redirect after event processing.
*
* Redirect after event processing allows to prevent same event being
* present in resulting url. Also could contain template name, that
* needs to be shown after redirect.
*
* @var mixed
*/
public $redirect = true;
/**
* Params, used during redirect url building after event successful processing.
*
* @var array
*/
private $_redirectParams = array();
/**
* PHP file to redirect to. Defaults to "index.php".
*
* @var string
*/
public $redirectScript = null;
/**
* Event processing status.
*
* @var integer
*/
public $status = self::erSUCCESS;
/**
* Event parameters.
*
* Usually indicate, how particular event should be processed.
*
* @var array
*/
private $_specificParams = array();
/**
* Pseudo class used, to create object, based on event contents.
*
* @var string
*/
private $_pseudoClass = '';
/**
* Creates an event from array.
*
* @param array $params Event string in array format with 'prefix', 'special' (optional) and 'name' keys.
* @param array $specific_params Specific params.
*
* @return self
*/
public static function fromArray(array $params, array $specific_params = array())
{
$prefix = isset($params['prefix']) ? $params['prefix'] : false;
$special = isset($params['special']) ? $params['special'] : false;
$name = isset($params['name']) ? $params['name'] : '';
return new self($prefix . '.' . $special . ':' . $name, $specific_params);
}
/**
* 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();
if ( preg_match('/([^.:]*)[.]{0,1}([^:]*):(.*)/', $event_string, $regs) ) {
$prefix = $regs[1];
$special = $regs[2];
if ( $prefix ) {
$this->Init($prefix, $special);
}
$this->Name = $regs[3];
$this->_specificParams = $specific_params;
}
else {
$error_msg = 'Invalid event string: "<strong>' . $event_string . '</strong>". ';
$error_msg .= 'Should be in "prefix[.special]:OnEvent" format';
throw new InvalidArgumentException($error_msg);
}
}
/**
* 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();
}
return rtrim($this->Prefix . '_' . $this->Special, '_');
}
/**
* Sets event parameter.
*
* @param string $name Name.
* @param mixed $value Value.
*
* @return void
*/
public function setEventParam($name, $value)
{
$this->_specificParams[$name] = $value;
}
/**
* Returns event parameter by name (supports digging).
*
* @param string $name Name.
*
* @return mixed
*/
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);
}
return array_key_exists($name, $this->_specificParams) ? $this->_specificParams[$name] : false;
}
/**
* Returns all event parameters.
*
* @return array
*/
public function getEventParams()
{
return $this->_specificParams;
}
/**
* 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;
}
/**
* 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;
parent::Init($prefix, $special);
}
/**
* 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;
}
$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).
*
* @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;
}
$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 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;
}
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
*/
public function getRedirectParams()
{
return $this->_redirectParams;
}
/**
* Returns redirect parameter.
*
* @param string $name Name.
*
* @return mixed
*/
public function getRedirectParam($name)
{
return array_key_exists($name, $this->_redirectParams) ? $this->_redirectParams[$name] : false;
}
/**
* 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;
}
/**
* 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);
}
$this->_redirectParams = $params;
}
/**
* 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;
}
return $this->Application->EventManager->eventRunning($event_key);
}
/**
* 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');
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->getUnitConfig($top_prefix)->getPermSectionByName('main');
// 2. check if this section has perm_prefix mapping to other prefix.
/** @var kSectionsHelper $sections_helper */
$sections_helper = $this->Application->recallObject('SectionsHelper');
$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');
}
if ( !$section ) {
$error_msg = 'Permission <strong>section</strong> not specified for';
$error_msg .= ' prefix <strong>' . $top_prefix . '</strong>';
throw new Exception($error_msg);
}
return $section;
}
/**
* Casts object to string.
*
* @return string
*/
public function __toString()
{
return $this->getPrefixSpecial() . ':' . $this->Name;
}
}

Event Timeline