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

	$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;
	}

	$searchText = trim($searchText);
	if (mb_strlen($searchText) < 3)
	{
		$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_HISTORY_SEARCH_EMPTY"), "ERROR_SEARCH_EMPTY");
		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'];
		$startId = $arRelation['START_ID'];
	}
	if ($chatId > 0)
	{
		$where = [
			'=CHAT_ID'	=> $chatId,
			'*%MESSAGE'	=> $searchText,
		];
		if ($this->checkFullText($searchText))
		{
			$searchText = BitrixMainSearchContent::prepareStringToken($searchText);
			$where = [
				'=CHAT_ID' => $chatId,
				'*INDEX.SEARCH_CONTENT' => $searchText,
			];
		}
		if ($startId)
		{
			$where['>=ID'] = intval($startId);
		}

		$orm = BitrixImModelMessageTable::getList(
			[
				'select' => [
					'ID',
					'CHAT_ID',
					'MESSAGE',
					'AUTHOR_ID',
					'NOTIFY_EVENT',
					'DATE_CREATE'
				],
				'filter' => $where,
				'order' => ['DATE_CREATE' => 'DESC', 'ID' => 'DESC'],
				'limit' => 1000,
			]
		);

		while ($arRes = $orm->fetch())
		{
			if ($fromUserId == $arRes['AUTHOR_ID'])
			{
				$arRes['TO_USER_ID'] = $toUserId;
				$arRes['FROM_USER_ID'] = $fromUserId;
				$convId = $arRes['TO_USER_ID'];
			}
			else
			{
				$arRes['TO_USER_ID'] = $fromUserId;
				$arRes['FROM_USER_ID'] = $toUserId;
				$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' => $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, 'unreadMessage' => $arUnreadMessage, 'usersMessage' => $arUsers, 'files' => $arMessageFiles);
}