• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/controller/onlyoffice.php
  • Класс: BitrixDiskControllerOnlyOffice
  • Вызов: OnlyOffice::handleDocumentIsEditing
protected function handleDocumentIsEditing(ModelsDocumentSession $documentSession, array $payloadData): void
{
	if ($payloadData['status'] !== self::STATUS_IS_BEING_EDITED)
	{
		return;
	}

	$onlineUsers = $payloadData['users'] ?? [];
	$onlineUsers = array_map('intval', $onlineUsers);

	$documentInfo = $documentSession->getInfo();
	if ($documentInfo)
	{
		$documentInfo->markAsEditing();
		$documentInfo->setUserCount(count($onlineUsers));
	}

	$userIds = [];
	$actions = $payloadData['actions'] ?? [];
	foreach ($actions as $action)
	{
		$userId = (int)($action['userid'] ?? null);
		$userIds[] = $userId;
	}

	if (!$userIds)
	{
		return;
	}

	$sessions = $this->getDocumentSessionsByKeyForUsers($documentSession->getExternalHash(), $userIds);

	$actions = $payloadData['actions'] ?? [];
	foreach ($actions as $action)
	{
		$type = $action['type'] ?? null;
		$userId = (int)($action['userid'] ?? null);
		$userSession = $sessions[$userId] ?? null;

		if (!$userSession)
		{
			continue;
		}

		if ($type === self::ACTION_TYPE_DISCONNECT)
		{
			if (!in_array($userId, $onlineUsers, true))
			{
				$userSession->setAsNonActive();
			}
		}
		elseif (($type === self::STATUS_IS_BEING_EDITED) && $userSession->isNonActive())
		{
			$userSession->setAsActive();
		}
	}
}