• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_history.php
  • Класс: CIMHistory
  • Вызов: CIMHistory::GetMoreMessage
function GetMoreMessage($pageId, $toUserId, $fromUserId = false, $bTimeZone = true)
{
	global $DB;

	$iNumPage = 1;
	if (intval($pageId) > 0)
		$iNumPage = intval($pageId);

	$fromUserId = intval($fromUserId);
	if ($fromUserId <= 0)
		$fromUserId = $this->user_id;

	$toUserId = intval($toUserId);
	if ($toUserId <= 0)
	{
		$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_HISTORY_ERROR_TO_USER_ID"), "ERROR_TO_USER_ID");
		return false;
	}

	$chatId = 0;
	$arMessages = Array();
	$arMessageId = Array();
	$arUnreadMessage = Array();
	$arMessageFiles = Array();
	$arUsers = Array();

	$limitById = '';

	if ($toUserId == $fromUserId)
	{
		$chat = new CIMChat();
		$chatId = $chat->GetPersonalChat();
		if (!$chatId)
		{
			return false;
		}
		$startId = 0;
	}
	else
	{
		$arRelation = CIMChat::GetPrivateRelation($fromUserId, $toUserId);
		$chatId = $arRelation['CHAT_ID'] ?? null;
		$startId = $arRelation['START_ID'];
	}

	if ($chatId > 0)
	{
		if ($startId > 0)
		{
			$limitById = 'AND M.ID >= '.intval($startId);
		}
		$sqlStr = "
			SELECT COUNT(M.ID) as CNT
			FROM b_im_message M
			WHERE M.CHAT_ID = ".$chatId."
			".$limitById."
		";
		$res_cnt = $DB->Query($sqlStr);
		$res_cnt = $res_cnt->Fetch();
		$cnt = $res_cnt["CNT"];

		if ($cnt > 0 && ceil($cnt/30) >= $iNumPage)
		{
			if (!$bTimeZone)
				CTimeZone::Disable();
			$strSql ="
				SELECT
					M.ID,
					M.CHAT_ID,
					M.MESSAGE,
					".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
					M.AUTHOR_ID,
					M.NOTIFY_EVENT,
					".$fromUserId." R1_USER_ID,
					".$toUserId." R2_USER_ID
				FROM b_im_message M
				WHERE
					M.CHAT_ID = ".$chatId."
					".$limitById."
				ORDER BY M.DATE_CREATE DESC, M.ID DESC
			";
			if (!$bTimeZone)
				CTimeZone::Enable();
			$dbRes = new CDBResult();
			$dbRes->NavQuery($strSql, $cnt, Array('iNumPage' => $iNumPage, 'nPageSize' => 30));

			while ($arRes = $dbRes->Fetch())
			{
				if ($fromUserId == $arRes['AUTHOR_ID'])
				{
					$arRes['TO_USER_ID'] = $arRes['R2_USER_ID'];
					$arRes['FROM_USER_ID'] = $arRes['R1_USER_ID'];
					$convId = $arRes['TO_USER_ID'];
				}
				else
				{
					$arRes['TO_USER_ID'] = $arRes['R1_USER_ID'];
					$arRes['FROM_USER_ID'] = $arRes['R2_USER_ID'];
					$convId = $arRes['FROM_USER_ID'];
				}
				$arMessages[$arRes['ID']] = Array(
					'id' => $arRes['ID'],
					'chatId' => $arRes['CHAT_ID'],
					'senderId' => $arRes['FROM_USER_ID'],
					'recipientId' => $arRes['TO_USER_ID'],
					'date' => BitrixMainTypeDateTime::createFromTimestamp($arRes['DATE_CREATE']),
					'system' => $arRes['NOTIFY_EVENT'] == 'private'? 'N': 'Y',
					'text' => BitrixImText::parse($arRes['MESSAGE']),
					'textLegacy' => BitrixImText::parseLegacyFormat($arRes['MESSAGE'])
				);
				$arUsers[$convId][] = $arRes['ID'];
				$arMessageId[] = $arRes['ID'];
				$chatId = $arRes['CHAT_ID'];
			}

			$params = CIMMessageParam::Get($arMessageId);
			$arFiles = Array();
			foreach ($params as $messageId => $param)
			{
				$arMessages[$messageId]['params'] = $param;
				if (isset($param['FILE_ID']))
				{
					foreach ($param['FILE_ID'] as $fileId)
					{
						$arFiles[$fileId] = $fileId;
					}
				}
			}
			$arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles);
			$arMessages = CIMMessageLink::prepareShow($arMessages, $params);
		}
	}


	return Array('chatId' => $chatId, 'message' => $arMessages, 'usersMessage' => $arUsers, 'files' => $arMessageFiles);
}