• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_chat.php
  • Класс: CIMChat
  • Вызов: CIMChat::GetLastMessageLimit
function GetLastMessageLimit($chatId, $messageStartId, $messageEndId = 0, $loadExtraData = false, $bTimeZone = true, $order = 'DESC')
{
	$messageStartId = intval($messageStartId);
	$messageEndId = intval($messageEndId);
	$chatId = intval($chatId);

	if ($chatId <= 0)
	{
		$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_EMPTY_CHAT_ID"), "ERROR_TO_CHAT_ID");
		return false;
	}

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

	global $DB;
	if (!$bTimeZone)
		CTimeZone::Disable();

	$strSql = "
		SELECT
			M.ID,
			M.CHAT_ID,
			M.MESSAGE,
			".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
			M.AUTHOR_ID,
			C.TYPE CHAT_TYPE
		FROM b_im_message M
		INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID
		WHERE
			M.CHAT_ID = ".$chatId."
			AND M.ID >= ".$messageStartId."
			".($messageEndId > 0? "AND M.ID <= ".$messageEndId: "")."
		ORDER BY M.DATE_CREATE ".($order == 'ASC'? 'ASC': 'DESC')."
	";

	if (!$bTimeZone)
		CTimeZone::Enable();

	$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $arMessages = Array(); $arMessageId = Array(); $arUsers = Array(); $arUsersMessage = Array(); while ($arRes = $dbRes->Fetch()) { $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']), 'text' => BitrixImText::parse($arRes['MESSAGE']), 'textLegacy' => BitrixImText::parseLegacyFormat($arRes['MESSAGE']), ); $arMessageId[] = $arRes['ID']; $arUsersMessage[$arRes['CHAT_ID']][] = $arRes['ID']; $arUsers[$arRes['CHAT_ID']][] = $arRes['AUTHOR_ID']; } if ($chatData['TYPE'] == IM_MESSAGE_OPEN_LINE) { BitrixImDiskNoRelationPermission::add($chatId, $this->user_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; } } } $arChatFiles = CIMDisk::GetFiles($chatId, $arFiles); // TODO get files for sessions $arMessages = CIMMessageLink::prepareShow($arMessages, $params); $arResult = Array( 'chatId' => $chatId, 'message' => $arMessages, 'usersMessage' => $arUsersMessage, 'users' => Array(), 'userInGroup' => Array(), 'files' => $arChatFiles ); if (is_array($loadExtraData) || is_bool($loadExtraData) && $loadExtraData == true) { $bDepartment = true; if (is_array($loadExtraData) && $loadExtraData['DEPARTMENT'] == 'N') $bDepartment = false; $arChat = self::GetChatData(array( 'ID' => $chatId, 'USE_CACHE' => 'N' )); $arResult['lines'] = $arChat['lines']; $arResult['userInChat'] = $arChat['userInChat']; $arResult['userChatBlockStatus'] = $arChat['userChatBlockStatus']; $ar = CIMContactList::GetUserData(array( 'ID' => $arUsers[$chatId], 'DEPARTMENT' => ($bDepartment? 'Y': 'N'), 'USE_CACHE' => 'N' ) ); $arResult['users'] = $ar['users']; $arResult['userInGroup'] = $ar['userInGroup']; $arResult['chat'] = $arChat['chat']; } return $arResult; }