public function raiseEvent($name, $sender, $param, $responsetype = null, $postfunction = null)
{
$p = $param;
if (is_callable($responsetype)) {
$postfunction = $responsetype;
$responsetype = null;
}
if ($responsetype === null) {
$responsetype = TEventResults::EVENT_RESULT_FILTER;
}
$name = strtolower($name);
$responses = array();
$name = $this->dyPreRaiseEvent($name, $sender, $param, $responsetype, $postfunction);
if ($this->hasEventHandler($name) || $this->hasEventHandler(TComponent::GLOBAL_RAISE_EVENT_LISTENER)) {
$handlers = $this->getEventHandlers($name);
$handlerArray = $handlers->toArray();
if (strncasecmp($name, 'fx', 2) === 0 && $this->hasEventHandler(TComponent::GLOBAL_RAISE_EVENT_LISTENER)) {
$globalhandlers = $this->getEventHandlers(TComponent::GLOBAL_RAISE_EVENT_LISTENER);
$handlerArray = array_merge($globalhandlers->toArrayBelowPriority(0), $handlerArray, $globalhandlers->toArrayAbovePriority(0));
}
$response = null;
foreach ($handlerArray as $handler) {
if ($this->dyIntraRaiseEventTestHandler($handler, $sender, $param, $name) === false) {
continue;
}
if (is_string($handler)) {
if (($pos = strrpos($handler, '.')) !== false) {
$object = $this->getSubProperty(substr($handler, 0, $pos));
$method = substr($handler, $pos + 1);
if (method_exists($object, $method) || strncasecmp($method, 'dy', 2) === 0 || strncasecmp($method, 'fx', 2) === 0) {
if ($method == '__dycall') {
$response = $object->__dycall($name, array($sender, $param, $name));
} else {
$response = $object->{$method}($sender, $param, $name);
}
} else {
throw new TInvalidDataValueException('component_eventhandler_invalid', get_class($this), $name, $handler);
}
} else {
$response = call_user_func($handler, $sender, $param, $name);
}
} else {
if (is_callable($handler, true)) {
list($object, $method) = $handler;
if (is_string($object)) {
$response = call_user_func($handler, $sender, $param, $name);
} else {
if (($pos = strrpos($method, '.')) !== false) {
$object = $this->getSubProperty(substr($method, 0, $pos));
$method = substr($method, $pos + 1);
}
if (method_exists($object, $method) || strncasecmp($method, 'dy', 2) === 0 || strncasecmp($method, 'fx', 2) === 0) {
if ($method == '__dycall') {
$response = $object->__dycall($name, array($sender, $param, $name));
} else {
$response = $object->{$method}($sender, $param, $name);
}
} else {
throw new TInvalidDataValueException('component_eventhandler_invalid', get_class($this), $name, $handler[1]);
}
}
} else {
throw new TInvalidDataValueException('component_eventhandler_invalid', get_class($this), $name, gettype($handler));
}
}
$this->dyIntraRaiseEventPostHandler($name, $sender, $param, $handler, $response);
if ($postfunction) {
$response = call_user_func_array($postfunction, array($sender, $param, $this, $response));
}
if ($responsetype & TEventResults::EVENT_RESULT_ALL) {
$responses[] = array('sender' => $sender, 'param' => $param, 'response' => $response);
} else {
$responses[] = $response;
}
if ($response !== null && $responsetype & TEventResults::EVENT_RESULT_FEED_FORWARD) {
$param = $response;
}
}
} else {
if (strncasecmp($name, 'on', 2) === 0 && !$this->hasEvent($name)) {
throw new TInvalidOperationException('component_event_undefined', get_class($this), $name);
}
}
if ($responsetype & TEventResults::EVENT_RESULT_FILTER) {
$responses = array_filter($responses);
}
$responses = $this->dyPostRaiseEvent($responses, $name, $sender, $param, $responsetype, $postfunction);
return $responses;
}