[ViewsOnline] Статистика кто онлайн для страницы
Задался таким вопросом в связи с необходимостью вывести следующую надпись для форума:Читают тему гостей 15, пользователей 2 (user1, user5)
В итоге родился небольшой сниппет на базе таблицы просмотров от Tickets.
Для работы скрипту нужны:
- установленный pdoTools
- включённый Fenom в настройках pdoTools
- установленный Tickets
- разрешён в настройках Tickets подсчёт просмотров гостями
<?php
// подключаем pdoTools для работы INLINE чанков
if (file_exists(MODX_CORE_PATH . 'components/pdotools')) {$pdoTools = $modx->getService('pdoTools');}
// все возможные параметры для сниппета
if (!empty($tpl)) {$tpl = $scriptProperties['tpl'];} else {$tpl = '@INLINE Читают тему {$guests|declension:\'гость|гостя|гостей\':true}, {$users|declension:\'пользователь|пользователя|пользователей\':true}{if $users} ({$userlist}){/if}';}
if (!empty($tpl_userlist)) {$tpl_userlist = $scriptProperties['tpl_userlist'];} else {$tpl_userlist = '@INLINE {$separator}{$user|user:\'fullname\'}';}
if (!empty($pid)) {$pid = $scriptProperties['pid'];} else {$pid = $modx->resource->id;}
if (!empty($separator)) {$separator = $scriptProperties['separator'];} else {$separator = ', ';}
if (!empty($min)) {$min = $scriptProperties['min'];} else {$min = 15;}
$min = date('Y-m-d H:i:s', strtotime("-15 min") );
$output = "";
// Выборка просмотров за последние 15 минут
$q = $modx->prepare("SELECT * FROM modx_tickets_views WHERE parent = '{$pid}' AND timestamp > '{$min}' ORDER BY timestamp DESC");
$q->execute();
$r = $q->fetchAll(PDO::FETCH_ASSOC);
$users = $arr = array();
$arr['total'] = count($r);
$arr['guests'] = $arr['users'] = $i = 0;
$arr['userlist'] = '';
foreach($r as $row){
$i++;
if($row['uid'] > 0) {
if($id > 1) {$userslist['separator'] = $separator;}
$userslist[] = $row['uid'];
$arr['userlist'] .= $pdoTools->getChunk($tpl_userlist, $userslist); // список пользователей
$arr['users']++;
} else {
$arr['guests']++;
}
}
return $pdoTools->getChunk($tpl, $arr);Параметры сниппета
- tpl — чанк для вывода информации, активно используются возможности Fenom. Плейсхолдеры чанка: total, guests, users и userlist. По умолчанию:
@INLINE Читают тему {$guests|declension:\'гость|гостя|гостей\':true}, {$users|declension:\'пользователь|пользователя|пользователей\':true}{if $users} ({$userlist}){/if} - tpl_userlist — чанк для вывода списка пользователей, принимает 2 плейсхолдера: separator и user. По умолчанию:
@INLINE {$separator}{$user|user:\'fullname\'} - separator — разделитель для списка пользователей. По умолчанию: ', '
- pid — от page id, id страницы для вывода статистики. По умолчанию текущая
- min — от minutes, количество минут, в течении которых пользователь считается на сайте. По умолчанию: 15
Теперь вызываем сниппет некэшируемым на нужной нам странице:
{'!view_online'|snippet}Пример вызова статистики для какой-то другой страницы:
{'!view_online'|snippet: [
'pid' => 1,
]}Вот и всё! Всю работу за нас делают pdoTols и Tickets (за что не забываем денно и ношно благодарить Василия), а наш сниппет-надстройка просто выводит и правильно структурирует нужную нам информацию. Поэтому и не думаю что есть смысл его оформлять отдельным пакетом для репозитория.
***
— UPD. Переписал весь код и собрал всё это дело в пакет. Теперь сниппет называется ViewsOnline! Появились чанки, новые параметры, исправлены ошибки. (подробнее смотри в changlog)
- Документация для пакета (отличается от примеров на этой странице)
- Скачать пакет можно здесь >
- Посмотреть в работе можно тут
Комментарии: 22
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Нужно заметочку, что бы не забыли изменить префикс у кого он не modx
А в целом, Василий, благодарю хорошая работа, дал в репу!
Там много изменений в параметрах, их названиях и в названии самого сниппета. Посмотрим как отреагирует магазин и примет ли его…
Нормально показывает там, где есть вызов getTickets и почему-то еще AjaxForm (FormIt). При этом на всех страницах есть вызов TicketLatest.
И при parents=0 всё равно считает посетителей для каждой страницы, а я хотел показать сколько всего в данный момент на сайте гостей и юзеров.
Этот конфликт и мешает запуску сниппета на тех неработающих страницах. Именно там и ищи.
А что делать с parents=0?