Допустим, у нас есть интернет-мессенджер и желание сформировать список контактов в нем произвольным образом: задать любые группы и любых пользователей. В текущей версии список контактов формируется 3-мя способами: структура компании в модуле «Интранет», группы «Экстранета», друзья пользователя в социальной сети.
В модуле «Интранет» группы формируются по структуре компании, каждой группе назначается id равное id раздела. Пользователи выбираются стандартным гетлистом и раскидываются по группам (поле UF_DEPARTMENT)
В модуле «Экстранет» группы формируются из тех, в которых состоит пользователь экстранета. Каждой группе присваивается id = SGид группы и название «Экстранет: имя группы». Пользователи раскидываются по полученным группам, а так же добавляются в группу extranet
Третий вариант создания групп – из списка друзей пользователя (если доступен функционал друзей в соцсети). Получаются все друзья и добавляются в группы friends и all
Дополнительно могут создаваться виртуальные группы: last – Последние контакты, all – Все контакты, other – Вне структуры / Вне списка, extranet – группа всех пользователей экстранета.
Т.е. задать какие-то произвольные значения, например, через события, нет возможности. Но бывает так, что либо очень хочется, либо очень требуют
Модуль, как обещают, разработчики будет переписан, поэтому сделаем добавление групп с минимальными потерями (вынеся все в отдельный класс). В любом случае, в дальнейшем хотелось бы иметь возможность делать добавление групп и пользователей стандартно через API ()
1. Копируем компонент bitrix:im.messenger в своё пространство имен и подключаем его в шаблоне сайта:
В данную структуру можно подмешивать любые данные, для чего и предназначен метод CIMModify::IMModifyContactList. Нас по сути интересуют ключи: users – список пользователей, groups – список групп и userInGroup – пользователи в группах Главное чтобы массив users включал в себя всех пользователей. Некоторые особенности:
Чтобы определить, открыта или свернута группа в контакте листе, необходимо вызвать
Массив с данными пользователя можно получить с помощью метода CIMContactList::GetUserData, передав в качестве параметра массив с ключом ID = ID пользователей.
Т.е. у тех пользователей, которые были выбраны гетлистом, надо проставить 'status' => 'online' 3. Компонент постоянно обновляет данные файлом /bitrix/js/im/im.js, запрашивая их у /bitrix/components/bitrix/im.messenger/im.ajax.php. К сожалению, данный путь жестко прописан в js файле. Чтобы напрямую не лезть в ядро, вставляем в кастомизированный компонент вместо строчки
Это код копирует файл в /bitrix/js/im/im.js папку компонента, изменяя путь, куда будет обращаться ajax и позволяет обновить js файл в любой момент, удалив его из папки компонента. 4. Модифицируем файл im.ajax.php для корректного обновления страницы: a. В блоке if ($_POST['IM_UPDATE_STATE'] == 'Y') находим строчку $arOnline = $CIMContactList->GetStatus(); Которая возвращает пользователей онлайн:
$CIMContactList = new CIMContactList();
$arOnline = CIMModify::IMGetStatus($CIMContactList);
В методе сначала получаем стандартный контакт-лист $arContactList = $CIMContactList->GetList(); А затем модифицируем его с помощью нашего CIMModify::IMModifyContactList Запрашиваем онлайн пользователей из модифицированного контакт-листа. b. В блоке else if ($_POST['IM_CONTACT_LIST'] == 'Y') после $arContactList = $CIMContactList->GetList(); Вызываем CIMModify::IMModifyContactList($arContactList); Контакт-лист готов
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».