Задача: показать на странице сайта пользователей которые сейчас находятся на сайте. Используется штатный модуль "Веб-аналитика" - должен быть установлен.
Онлайн ли автор элемента инфоблока
Предположим у нас сайт, где любой пользователь может написать новость или добавить любой элемент инфоблока. На детальной странице нужно вывести статус автора в виде "в сети / не в сети".
В шаблоне детальной новости (сработает и с шаблоном детальной карточки товара) создаем файл result_modifier.php и добавляем него следующий код
use \Bitrix\Main\Loader;
Loader::includeModule('statistic');
$rsData = CUserOnline::GetList(
$guest_count,
$session_count,
false,
array (
'LAST_USER_ID' => $arResult['CREATED_BY'],
'USER_AUTH' => 'Y',
),
);
while ($ar = $rsData->Fetch())
{
$arResult['AUTHOR_IS_ONLINE'] = 'Y';
}
Далее, в template.php добавляем:
if ($arResult['AUTHOR_IS_ONLINE']) {
echo 'Автор в сети';
} else {
echo 'Автор не сети';
}
С помощью метода CUserOnline::GetList, модуля веб аналитики, отфильтровали ID пользователя который создал запись (хранится в $arResult['CREATED_BY']) и убедились что он сейчас авторизован.
Дальше можно дополнить массив и остальными полями автора, как пользователя (Ф.И.О. дату рождения итд) используя примеры из заметки:
Поля пользователя через API D7
Кто из авторизованных просматривает новость
Предположим, хотим на странице новости вывести имена пользователей, которые прямо сейчас просматривают конкретную новость. В result_modifier.php добавляем:
use \Bitrix\Main\Loader;
use Bitrix\Main\UserTable;
Loader::includeModule('statistic');
$rsData = CUserOnline::GetList(
$guest_count,
$session_count,
false, // можно сортировать
array(
'USER_AUTH' => 'Y',
'URL_LAST' => $APPLICATION->GetCurUri()
),
);
while ($ar = $rsData->Fetch()) {
$arResult['ONLINE_USERS'][] = UserTable::getList([
'filter' => [
'ID' => $ar['LAST_USER_ID']
],
'select' => [
'NAME' // Можно выбрать все поля через '*'
]
])->fetch();
}
В template.php добавляем:
echo implode(
',' ,
$arResult['ONLINE_USERS']
);
В фильтр передали URL_LAST в нем находится последняя посещенная пользователем страница, по факту текущая активная в его сессии и сравнили с текущей страницей сайта. Тут используйте CMain::GetCurPage, CMain::GetCurDir, GetDirPath в зависимости от настроек ЧПУ детального показа новости. Либо можно получить текущий адрес новости из настроек компонента (наверное, так даже правильнее).
Дальше получили имя пользователя (можете получить любые поля в 'select') и наполнили массив $arResult['ONLINE_USERS']. Этот массив вывели в нужном месте шаблона добавив запятую в перечиследние пользователей. Само собой, здесь можете использовать foreach что бы сделать красивее.
Все поля метода CUserOnline::GetList, по которым можно фильтровать и получать данные:
[ID] => ID сессии
[HITS] => количество хитов сессии
[LAST_USER_ID] => ID пользователя, под которым последний раз был авторизован посетитель
[USER_AUTH] => флаг авторизован ли посетитель в данной сессии (Y - да; N - нет)
[STOP_LIST_ID] => ID записи стоп-листа, под которую попал посетитель (если это имело место быть)
[GUEST_ID] => ID посетителя
[NEW_GUEST] => флаг новый посетитель (Y - новый; N - вернувшийся)
[FAVORITES] => флаг добавлял ли посетитель сайт в Избранное в данной сессии
[COUNTRY_ID] => ID страны посетителя
[COUNTRY_NAME] => название страны посетителя
[ADV_ID] => ID рекламной кампании
[ADV_BACK] => флаг прямого захода (N) или возврата (Y) по рекламной кампании
[REFERER1] => идентификатор referer1 рекламной кампании
[REFERER2] => идентификатор referer2 рекламной кампании
[REFERER3] => дополнительный параметр рекламной кампании
[FIRST_URL_FROM] => ссылающаяся страница, с которой посетитель впервые пришел на сайт
[URL_FROM] => откуда пришел, самая первая старница захода в сессию
[FIRST_SITE_ID] => если был переход из сайта в многосайтовости, будет id сайта откуда
[URL_LAST] => страница последнего хита сессии
[URL_LAST_404] => флаг 404 ошибки на последней странице сессии (Y - да; N - нет)
[LAST_SITE_ID] => ID сайта на последнем хите сессии
[IP_LAST] => IP адрес посетителя на последнем хите сессии (в виде: XXX.XXX.XXX.XXX)
[DATE_LAST] => время последнего хита
[SESSION_TIME] => разница во времени между первым и последним хитом сессии (сек.)