Допустим, у нас есть интернет-мессенджер и желание сформировать список контактов в нем произвольным образом: задать любые группы и любых пользователей. В текущей версии список контактов формируется 3-мя способами: структура компании в модуле «Интранет», группы «Экстранета», друзья пользователя в социальной сети.
В модуле «Интранет» группы формируются по структуре компании, каждой группе назначается id равное id раздела. Пользователи выбираются стандартным гетлистом и раскидываются по группам (поле UF_DEPARTMENT)
В модуле «Экстранет» группы формируются из тех, в которых состоит пользователь экстранета. Каждой группе присваивается id = SGид группы и название «Экстранет: имя группы». Пользователи раскидываются по полученным группам, а так же добавляются в группу extranet
Третий вариант создания групп – из списка друзей пользователя (если доступен функционал друзей в соцсети). Получаются все друзья и добавляются в группы friends и all
Дополнительно могут создаваться виртуальные группы: last – Последние контакты, all – Все контакты, other – Вне структуры / Вне списка, extranet – группа всех пользователей экстранета.
Т.е. задать какие-то произвольные значения, например, через события, нет возможности. Но бывает так, что либо очень хочется, либо очень требуют
Модуль, как обещают, разработчики будет переписан, поэтому сделаем добавление групп с минимальными потерями (вынеся все в отдельный класс). В любом случае, в дальнейшем хотелось бы иметь возможность делать добавление групп и пользователей стандартно через API (http://idea.1c-bitrix.ru/kontaktlist-...sendzhere/)
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". - http://i.imgur.com/vwR15Cv.png
Изменения вступают только тогда когда я жамкаю на "контакты". Только вот если жамкнуть на конкретного пользователя то имя повторно береться из полей NAME, LAST_NAME.
Для теста сделал замену имен пользователей в самом методе - $CIMContactList->GetList();, т.е в конце данного метода вставил свой метод, вот так - http://i.imgur.com/qwcRG1L.png
Но все равно такая же ситуация. Видимо массив ее где то формируется.
Есть ли какой нить решение, данной задаче. Буду очень благодарен за любую помощь. Заранее спасибо.
Мда... столько времени прошло, а воз и ныне там, пришлось тоже костыль вставлять, дабы отделить офисных сотрудников от внешних клиентов Все это можно сделать, не перемещая компонент в свое пространство имен. Достаточно в своем шаблоне создать шаблон компоненты, а далее все просто. В файле template.php, перед строкой
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».