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

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

	$chatId = intval($chatId);

	$orm = IMModelChatTable::getById($chatId);
	if (!($chatData = $orm->fetch()))
	{
		$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_CHAT_NOT_EXISTS"), "ERROR_CHAT_NOT_EXISTS");
		return false;
	}

	$limitById = '';
	$ar = CIMChat::GetRelationById($chatId, $this->user_id, true, false);
	if ($ar && $ar['START_ID'] > 0)
	{
		$limitById = 'AND M.ID >= '.intval($ar['START_ID']);
	}

	if (!$bTimeZone)
	{
		CTimeZone::Disable();
	}

	$lineId = 0;
	if (
		$chatData['TYPE'] == IM_MESSAGE_OPEN_LINE
		&& BitrixMainLoader::includeModule('imopenlines')
	)
	{
		$lineId = BitrixImOpenLinesChat::parseLinesChatEntityId($chatData['ENTITY_ID'])['lineId'];
	}

	if ($chatData['TYPE'] == IM_MESSAGE_OPEN)
	{
		$strCountSql ="
			SELECT COUNT(M.ID) as CNT
			FROM b_im_message M
			INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN."'
			WHERE M.CHAT_ID = ".$chatId." ".$limitById."
		";

		$strResultSql ="
			SELECT
				M.ID,
				M.CHAT_ID,
				M.MESSAGE,
				".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
				M.AUTHOR_ID,
				C.ENTITY_TYPE CHAT_ENTITY_TYPE
			FROM b_im_message M
			INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN."'
			LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$this->user_id."
			WHERE 
				M.CHAT_ID = ".$chatId."
				".$limitById."
			ORDER BY M.DATE_CREATE DESC, M.ID DESC
		";
	}
	elseif (
		$chatData['TYPE'] == IM_MESSAGE_OPEN_LINE
		&& BitrixMainLoader::includeModule('imopenlines')
		&& BitrixImOpenLinesConfig::canJoin($lineId)
	)
	{
		$strCountSql ="
			SELECT COUNT(M.ID) as CNT
			FROM b_im_message M
			INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN_LINE."'
			WHERE M.CHAT_ID = ".$chatId." ".$limitById."
		";

		$strResultSql ="
			SELECT
				M.ID,
				M.CHAT_ID,
				M.MESSAGE,
				".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
				M.AUTHOR_ID,
				C.ENTITY_TYPE CHAT_ENTITY_TYPE
			FROM b_im_message M
			INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN_LINE."'
			LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$this->user_id."
			WHERE 
				M.CHAT_ID = ".$chatId."
				".$limitById."
			ORDER BY M.DATE_CREATE DESC, M.ID DESC
		";
	}
	else
	{
		$strCountSql ="
			SELECT COUNT(M.ID) as CNT
			FROM b_im_message M
			INNER JOIN b_im_relation R1 ON M.CHAT_ID = R1.CHAT_ID
			WHERE R1.CHAT_ID = ".$chatId." AND R1.USER_ID = ".$this->user_id." ".$limitById."
		";

		$strResultSql ="
			SELECT
				M.ID,
				M.CHAT_ID,
				M.MESSAGE,
				".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
				M.AUTHOR_ID,
				C.ENTITY_TYPE CHAT_ENTITY_TYPE
			FROM b_im_message M
			LEFT JOIN b_im_chat C ON M.CHAT_ID = C.ID
			WHERE 
				M.CHAT_ID = ".$chatId."
				".$limitById."
			ORDER BY M.DATE_CREATE DESC, M.ID DESC
		";
	}
	if (!$bTimeZone)
		CTimeZone::Enable();

	$res_cnt = $DB->Query($strCountSql);
	$res_cnt = $res_cnt->Fetch();
	$cnt = $res_cnt["CNT"];

	$arMessages = Array();
	$arMessageFiles = Array();
	$arMessageId = Array();
	$usersMessage = Array();
	if ($cnt > 0 && ceil($cnt/30) >= $iNumPage)
	{
		$dbRes = new CDBResult();
		$dbRes->NavQuery($strResultSql, $cnt, Array('iNumPage' => $iNumPage, 'nPageSize' => 30));

		while ($arRes = $dbRes->Fetch())
		{
			if ($arRes['CHAT_ENTITY_TYPE'] != 'LIVECHAT' && BitrixImUser::getInstance($this->user_id)->isConnector())
			{
				return false;
			}
			$arMessages[$arRes['ID']] = Array(
				'id' => $arRes['ID'],
				'chatId' => $arRes['CHAT_ID'],
				'senderId' => $arRes['AUTHOR_ID'],
				'recipientId' => $arRes['CHAT_ID'],
				'date' => BitrixMainTypeDateTime::createFromTimestamp($arRes['DATE_CREATE']),
				'system' => $arRes['AUTHOR_ID'] > 0? 'N': 'Y',
				'text' => BitrixImText::parse($arRes['MESSAGE']),
				'textLegacy' => BitrixImText::parseLegacyFormat($arRes['MESSAGE'])
			);

			$usersMessage[$arRes['CHAT_ID']][] = $arRes['ID'];
			$arMessageId[] = $arRes['ID'];
			$arUsersIds[] = $arRes['AUTHOR_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);

	}

	$users = CIMContactList::GetUserData(array(
		 'ID' => $arUsersIds,
		 'DEPARTMENT' => 'Y',
		 'USE_CACHE' => 'N',
		 'PHONES' => IsModuleInstalled('voximplant')? 'Y': 'N'
	 ));

	return Array(
		'chatId' => $chatId,
		'message' => $arMessages,
		'usersMessage' => $usersMessage,
		'users' => $users['users'],
		'userInGroup' => $users['userInGroup'],
		'phones' => $users['phones'],
		'files' => $arMessageFiles
	);
}