Показать пользователей онлайн на странице сайта

Просмотров: 2063

Задача: показать на странице сайта пользователей которые сейчас находятся на сайте. Используется штатный модуль "Веб-аналитика" - должен быть установлен.

Пользователи онлайн, показать на странице сайта

Онлайн ли автор элемента инфоблока

Предположим у нас сайт, где любой пользователь может написать новость или добавить любой элемент инфоблока. На детальной странице нужно вывести статус автора в виде "в сети / не в сети".

В шаблоне детальной новости (сработает и с шаблоном детальной карточки товара) создаем файл result_modifier.php и добавляем него следующий код

use \Bitrix\Main\Loader;
Loader::includeModule('statistic');

$rsData = CUserOnline::GetList(
    $guest_count,
    $session_count,
    false,
    array (
        'USER_AUTH' => 'Y',
    ),
);
while ($ar = $rsData->Fetch())
{
    if ($ar['LAST_USER_ID'] === $arResult['CREATED_BY']) {
        $arResult['AUTHOR_IS_ONLINE'] = 'Y';
    }
}

Далее, в template.php добавляем:

if ($arResult['AUTHOR_IS_ONLINE']) {
    echo 'Автор в сети';
} else {
    echo 'Автор не сети';
}

С помощью метода CUserOnline::GetList, модуля веб аналитики, отфильтровали авторизованных пользователей и если в результате есть ID автора элемента (хранится в $arResult['CREATED_BY']) заполнили и вывели новый ключ массива $arResult['AUTHOR_IS_ONLINE'].

Дальше можно дополнить массив и остальными полями автора, как пользователя (Ф.И.О. дату рождения итд) используя примеры из заметки:
Поля пользователя через 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] => разница во времени между первым и последним хитом сессии (сек.)

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 500 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 150 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 550 000 руб. от 5-ти недель

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 300 000 руб. от 2-х недель

Корпоративный сайт с информационными разделами, каталогом товаров или услуг. Включает формы обратной связи карточек каталога, любое количество статичных и динамичных разделов.

Инфоресурс

от 300 000 руб. от 4-х недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

3D‑моделирование, визуализация

от 25 000 руб. от 3-х дней

По вашим фото, чертежам или описанию создадим 3D‑модели и отрендерим набор изображений для каталога товаров: общий вид, крупные планы и технические ракурсы или 360°‑обзор товара.