Подборка методов для работы с модулем «Веб-мессенджер» (im) коробочной версии «Битрикс24». Для работы с методами обязательно подключение модуля: CModule::IncludeModule('im');
$pic = $_SERVER['DOCUMENT_ROOT'] . '/test.jpg'; $avatarId = \CFile::SaveFile(\CFile::MakeFileArray($pic), 'im'); $chat = new \CIMChat; $chat->Add(array( 'TITLE' => 'Тестовый чат', 'DESCRIPTION' => 'Описание тестового чата', 'COLOR' => 'RED',//цвет 'TYPE' => IM_MESSAGE_OPEN,//тип чата 'AUTHOR_ID' => '1',//владелец чата 'AVATAR_ID' => $avatarId //иконка чата )); //TYPE = IM_MESSAGE_CHAT – закрытый чат //список доступных цветов: \Bitrix\Im\Color::getSafeColors()
$change = CIMChat::SetOwner($chatID, $userID, $checkPermission);
Подробный мануал представлен в этой статье.
\Bitrix\Im\Model\ChatTable::update($chatID, array('TITLE' => $new_name));
Обратите внимание на возвращаемый методом массив данных, так как он позволяет решить сразу несколько задач:
userInChat
)mute_list
)avatar
)owner
)name
)extranet
)Пример вызова метода:
$ChatData = CIMChat::GetChatData(array('ID'=>$chatID));
Метод CIMChat::AddUser
достаточно специфичный, подробности — в документации.
Для добавления пользователя в чат без системного уведомления о добавлении нового пользователя:
$chat = new \CIMChat(0); $chat->AddUser($chatID, $userID, null, true, true);
В данном примере пользователь добавляется без доступа к истории сообщений чата. За это отвечает третий параметр, который задан как null
. Для добавления пользователя в чат с доступом к старой переписке — этот параметр нужно убрать.
Для добавления пользователя с системным комментарием вида «Иванов Иван присоединился к чату»:
$chat = new \CIMChat(0); $chat->AddUser($chatID, $userID, null, false, false);
Используем метод CIMChat::DeleteUser
. Ссылка на документацию.
$chat = new \CIMChat(); $chat->DeleteUser($chatId, $userID, false, true, true);
Данное решение будет полезно для того, чтобы добавить ссылку на определенный чат в документацию или Базу Знаний вашего портала. Все просто:
<a href="/online/?IM_DIALOG=chat[CHAT_ID]">Открыть чат</a>
где [CHAT_ID]
— уникальный идентификатор чата.
/*сообщения, старше 10-ти дней*/ $days = 10; $dateCreate = new DateTime(); $dateCreate->sub(new DateInterval("P".$days."D")); $filter = [ /*ID чата из которого получать сообщения*/ "=CHAT_ID" => $chatID; /*выборка сообщений старше указанного кол-ва дней*/ "<=DATE_CREATE" => \Bitrix\Main\Type\DateTime::createFromUserTime(date("d.m.Y H:i:s", $dateCreate->getTimestamp())); ]; /*сколько сообщений получать*/ $limit = 50; $params = Array( 'filter' => $filter, 'limit' => $limit, 'order' => Array('ID' => 'ASC'), ); $message_list = \Bitrix\Im\Model\MessageTable::getList($params); while($message = $message_list->Fetch()){ //вывод данных }
Массив $message
будет содержать выборку списка сообщений чата.
Рассмотрим несколько методов для работы с сообщениями по их уникальному идентификатору. ID сообщения можно посмотреть через исходный код страницы:
$message = CIMMessenger::GetById($id);
Результат выполнения:
Array ( [ID] => 26066083 [CHAT_ID] => 12345 [AUTHOR_ID] => 1 [MESSAGE] => Текст тестового сообщения. [MESSAGE_OUT] => [DATE_CREATE] => 1620737943 [EMAIL_TEMPLATE] => [NOTIFY_TYPE] => 0 [NOTIFY_MODULE] => im [NOTIFY_EVENT] => private [NOTIFY_TAG] => [NOTIFY_SUB_TAG] => [NOTIFY_TITLE] => [NOTIFY_BUTTONS] => [NOTIFY_READ] => N [IMPORT_ID] => [MESSAGE_TYPE] => P [CHAT_AUTHOR_ID] => 1 [CHAT_ENTITY_TYPE] => [CHAT_ENTITY_ID] => [CHAT_PARENT_ID] => 0 [CHAT_PARENT_MID] => 0 [CHAT_ENTITY_DATA_1] => [CHAT_ENTITY_DATA_2] => [CHAT_ENTITY_DATA_3] => [PARAMS] => Array ( ) )
Стоит обратить внимание на параметры функции:
$id
— идентификатор редактируемого сообщения$text
— новый текст сообщения$urlPreview
— показывать превью ссылок$editFlag
— показывать что сообщение было отредактировано$userId
— идентификатор пользователя (автора)Если в качестве $text
передать пустое значение, то это будет равносильно удалению сообщения. Однако, это не совсем полноценное удаление, так как в чате останутся следы в виде фразы «Это сообщение было удалено».
Для редактирования сообщения других пользователей обязательно передавать ID автора сообщения в параметре$userId
.
Пример вызова метода:
$edit_message = CIMMessenger::Update($id, "Текст сообщения", false, false, $userId);
Разберем параметры:
$id
— идентификатор удаляемого сообщения$userId
— идентификатор пользователя (автора)$completeDelete
— полное удаление / замена на сообщение-заглушкуЗдесь все по аналогии с редактированием сообщения, если сообщение нужно удалить полностью, то третьим параметром передаем значение true
. Если передать false
, то будет выполнена замена текста сообщения на «Это сообщение было удалено». Исходный код метода.
Пример вызова:
$delete_message = CIMMessenger::Delete($id, $userID, true);
Есть и альтернативный вариант, в котором требуется указать только идентификатор сообщения:
$delete_message = \Bitrix\Im\Model\MessageTable::delete($id);
Сообщение в чат от имени пользователя:
$ar = Array( "TO_CHAT_ID" => 21441, // ID чата "FROM_USER_ID" => 1, // ID пользователя состоящего в чате "MESSAGE" => "Сообщение от пользователя", // Произвольный текст ); CIMChat::AddMessage($ar);
Отправка системного уведомления в чат:
$ar = Array( "TO_CHAT_ID" => 21441, // ID чата "FROM_USER_ID" => 0, "SYSTEM" => Y, "MESSAGE" => "Системное сообщение", // Произвольный текст ); CIMChat::AddMessage($ar);
Ошибка вылазить при добавлении пользователя:
Class 'Bitrix\Im\chatTable' not found (0)
Убедитесь, что в начале скрипта выполнено подключение модуля IM:
\Bitrix\Main\Loader::includeModule('im');
Добрый день.
Подскажите пожалуйста, как удалить сообщение методом $delete_message = CIMMessenger::Delete ($id, $userID, true);
Как метод понимает из какого чата удалять?
Добрый день. Методу не нужно этого понимать. Нумерация комментариев «сквозная». У каждого сообщения уникальный идентификатор. Потому нет необходимости указывать ID чата.
Подскажите как прикрепить чат к сущности CRM?
Здравствуйте.
Не сталкивался с такой задачей, нужно разбираться.
Добрый день, а как это сделать в облаке? Возможно ли такое?
Добрый день. По идее в облаке это все тоже реализуемо, но через REST API. Документация тут. Готовых примеров у меня нет, т.к. не сталкивался.
У вас есть метод в статье $chat->Add а есть возможность получить ID только что созданного чата?
Метод возвращает ID созданного чата.
Для этого сохраните значение в виде переменной. А после выведите его.
$res = $chat->Add(....); print_r($res);
спасибо, а есть способ вставить ссылку в message? при попытке вставить тег a он выводится как текст
Нужно использовать не html-теги, а BB-коды.
[URL=https://www.site.ru/]Ссылка[/URL]
спасибо, я наверно вас уже замучил но возник ещё один вопрос. Я написал функционал который работает, но работает он только если его вызывает авторизованный пользователь, если исполняемый файл вызван сторонним сервисом то создание чата не происходит, причём сам запрос проходит и данные тоже, можно ли это как-то обойти?
Скорее всего при вызове вашего скрипта он не выполняется т.к. его блокирует страница авторизации. Проверить это можно обратившись к скрипту через браузер, в котором нет авторизации на портале.
Если так, то самый просто вариант решения:
1. Обратите внимание, что в корне портала есть директория /pub/ (это стандартная папке, она уже должна быть). Внутри нее можно создать свою папку, например, /pub/script/ и разместить там свой скрипт.
2. Не используете в таких скриптах подключение стандартного header/footer.php. Вместо этого используете prolog_before.php.
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
Есть и более правильные пути решения, которые позволяют размещать подобные скрипты в других директория, но объяснять это я буду долго.
Да при написании одного скрипта я сталкивался с такой проблемой, но проблема в том что при запросе авторизации он скорее всего прервал бы выполнение моего скрипта, у меня прописаны такие заголовки
define («NO_KEEP_STATISTIC», true);
define («NOT_CHECK_PERMISSIONS», true);
define ('BX_NO_ACCELERATOR_RESET', true);
define ('CHK_EVENT', true);
define ('BX_WITH_ON_AFTER_EPILOG', true);
require ($_SERVER["DOCUMENT_ROOT"] . «/bitrix/modules/main/include/prolog_before.php»);
параметр define («NOT_CHECK_PERMISSIONS», true)
как раз должен отрубать проверку авторизации,
в этом у меня и загвоздка, такое ощущение что создание чата требует авторизацию
Тогда идей нет. Видимо есть нюансы с которыми я не сталкивался. Надо разбираться.
Подскажите, а возможно ли создать тег для чата? И затем найти чаты по этому тегу?
Не сталкивался с подобными задачами.