Допустим, у нас есть интернет-мессенджер и желание сформировать список контактов в нем произвольным образом: задать любые группы и любых пользователей. В текущей версии список контактов формируется 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); Контакт-лист готов
Пока нет, я обращался в Т.П - они говорят что все что связано в модификацией модулей обратиться с идеей, на
Кстати я предложил идею, вот как раз ссылка.
Я подумывал может написать с нуля, но пока не в полной мере разобрался с имеющимся кодом веб-мессенджера. Первый делом бы понять каким образом отправляются сообщения пользователям. Если знаешь как, ты бы очень помог мне.
С уведомлениями разобрался, да и была статья на счет этого.
Такой вопрос по поводу контакт листа. Стоит такая задача - у пользователя, в зависимости от языка интерфейса подставляется соответствующее имя. Для этого создал дополнительные поля типа - "UF_FULLNAME_RU","UF_FULLNAME_EN"... Так вот хочу туже самую процедуру проделать для мессенджера, т.е заменить в готовом массиве имена на соответствующие языку интерфейса. Чтобы поменять имя пользователя, создаю событие "OnAfterContactListGetList". -
Изменения вступают только тогда когда я жамкаю на "контакты". Только вот если жамкнуть на конкретного пользователя то имя повторно береться из полей NAME, LAST_NAME.
Для теста сделал замену имен пользователей в самом методе - $CIMContactList->GetList();, т.е в конце данного метода вставил свой метод, вот так -
Но все равно такая же ситуация. Видимо массив ее где то формируется.
Есть ли какой нить решение, данной задаче. Буду очень благодарен за любую помощь. Заранее спасибо.
Мда... столько времени прошло, а воз и ныне там, пришлось тоже костыль вставлять, дабы отделить офисных сотрудников от внешних клиентов Все это можно сделать, не перемещая компонент в свое пространство имен. Достаточно в своем шаблоне создать шаблон компоненты, а далее все просто. В файле template.php, перед строкой
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».