- Модуль: rest
- Путь к файлу: ~/bitrix/modules/rest/lib/api/event.php
- Класс: BitrixRestApiEvent
- Вызов: Event::eventBind
static function eventBind($query, $n, CRestServer $server)
{
global $USER;
if($server->getAuthType() !== BitrixRestOAuthAuth::AUTH_TYPE)
{
throw new AuthTypeException();
}
$query = array_change_key_case($query, CASE_UPPER);
$eventName = ToUpper($query['EVENT']);
$eventType = ToLower($query['EVENT_TYPE']);
$eventUser = intval($query['AUTH_TYPE']);
$eventCallback = $query['HANDLER'];
$options = is_array($query['OPTIONS']) ? $query['OPTIONS'] : [];
if($eventUser > 0)
{
if(!CRestUtil::isAdmin() && $eventUser !== intval($USER->GetID()))
{
throw new AccessException('Event binding with AUTH_TYPE requires administrator access rights');
}
}
elseif(!CRestUtil::isAdmin())
{
$eventUser = intval($USER->GetID());
}
$authData = $server->getAuthData();
$connectorId = isset($authData['auth_connector']) ? $authData['auth_connector'] : '';
if($eventName == '')
{
throw new ArgumentNullException("EVENT");
}
if($eventType <> '')
{
if(!in_array($eventType, array(EventTable::TYPE_ONLINE, EventTable::TYPE_OFFLINE)))
{
throw new ArgumentException('Value must be one of {'.EventTable::TYPE_ONLINE.'|'.EventTable::TYPE_OFFLINE.'}', 'EVENT_TYPE');
}
}
else
{
$eventType = EventTable::TYPE_ONLINE;
}
if($eventType === EventTable::TYPE_OFFLINE)
{
if(!CRestUtil::isAdmin())
{
throw new AccessException('Offline events binding requires administrator access rights');
}
$eventCallback = '';
$eventUser = 0;
}
elseif($eventCallback == '' && $eventType === EventTable::TYPE_ONLINE)
{
throw new ArgumentNullException("HANDLER");
}
$clientInfo = AppTable::getByClientId($server->getClientId());
if($eventCallback == '' || HandlerHelper::checkCallback($eventCallback, $clientInfo))
{
$scopeList = $server->getAuthScope();
$scopeList[] = CRestUtil::GLOBAL_SCOPE;
$serviceDescription = $server->getServiceDescription();
foreach($scopeList as $scope)
{
if(
isset($serviceDescription[$scope])
&& is_array($serviceDescription[$scope][CRestUtil::EVENTS])
&& array_key_exists($eventName, $serviceDescription[$scope][CRestUtil::EVENTS])
)
{
$eventInfo = $serviceDescription[$scope][CRestUtil::EVENTS][$eventName];
if(is_array($eventInfo))
{
$eventHandlerFields = array(
'APP_ID' => $clientInfo['ID'],
'EVENT_NAME' => $eventName,
'EVENT_HANDLER' => $eventCallback,
'CONNECTOR_ID' => $connectorId,
'OPTIONS' => []
);
if($eventUser > 0)
{
$eventHandlerFields['USER_ID'] = $eventUser;
}
if (
$eventCallback === ''
&& isset($eventInfo[3]['disableOffline'])
&& $eventInfo[3]['disableOffline'] === true
)
{
throw new RestException('Offline event cannot be registered for this event.', RestException::ERROR_ARGUMENT);
}
if (!empty($options) && isset($eventInfo[3]['allowOptions']) && is_array($eventInfo[3]['allowOptions']))
{
foreach ($eventInfo[3]['allowOptions'] as $code => $type)
{
if (isset($options[$code]))
{
if ($type === 'int')
{
$eventHandlerFields['OPTIONS'][$code] = (int) $options[$code];
}
elseif($type === 'str' && is_string($options[$code]))
{
$eventHandlerFields['OPTIONS'][$code] = $options[$code];
}
}
}
}
$result = EventTable::add($eventHandlerFields);
if($result->isSuccess())
{
BitrixRestEventSender::bind($eventInfo[0], $eventInfo[1]);
}
else
{
$errorMessage = $result->getErrorMessages();
throw new RestException('Unable to set event handler: '.implode('. ', $errorMessage), RestException::ERROR_CORE);
}
}
return true;
}
}
throw new RestException('Event not found', EventTable::ERROR_EVENT_NOT_FOUND);
}
else
{
return false;
}
}