
FAQ
Общие
Работает ли с MiniShop2?
Нет. Только MiniShop3 и MODX 3.
Нужен ли composer install на сервере?
Нет. Transport-пакет содержит нужные файлы. Для установки через MODX composer на сервере не нужен.
Нужен ли CrawlerDetect?
Нет. Без CrawlerDetect работает встроенный fallback по User-Agent. С CrawlerDetect фильтрация точнее.
Чем msViewCounter отличается от TV «просмотры»?
Компонент ведёт агрегат в БД, считает active-сессии с heartbeat, фильтрует ботов, поддерживает режимы boost/fake, дедупликацию по сессии и готовый UI. Обычный TV не даёт live-online и batch-очистку сессий.
Установка
Блок не выводится
Проверьте:
Плагин
msViewCounterBootstrapвключён: Это → Плагины, строкаmsViewCounterBootstrap, колонка «Отключён» пустая. Плагин подключаетbootstrap.phpс загрузчиком классов и функциейmsvc_get_service(), а также регистрирует ассеты на странице товара.Начиная с версии 1.0.1 сам сниппет подключает
bootstrap.php, если функция ещё не объявлена. Поэтому выключенный плагин больше не приводит к фатальной ошибкеCall to undefined function msvc_get_service(): блок и число всё равно появятся на странице, но не подключатсяviewcounter.jsи CSS, то есть не будет heartbeat и оформления.Сниппет
msViewCounterустановлен.В вызове передан
pid> 0.Чанк из
tplсуществует.Кэш MODX очищен.
Вызов некэшированный (
[[!...]]).
Пустой вывод при pid <= 0
При pid <= 0 сниппет возвращает пустую строку без предупреждения. На странице, где сниппет вызывается вне контекста товара, добавьте проверку ID или убедитесь, что передан корректный ID.
CSS не подключается
- На странице есть вызов
[[!msViewCounter]]. - В HTML есть
/assets/components/msviewcounter/css/viewcounter.css. - Файл существует в
assets/components/msviewcounter/css/. - Кэш MODX очищен.
Сниппет сам регистрирует CSS при выводе счётчика. Если выключены оба флага — msviewcounter_show_total и msviewcounter_show_online — не регистрируется даже CSS.
Просмотры и online
Просмотры не растут
- Ресурс —
msProductили страница с шаблоном, равнымms3_template_product_defaultиз системных настроек MiniShop3. Плагин считает товаром ресурс по любому из двух признаков, поэтому просмотр может записываться и там, где вы его не ждёте, если этот шаблон назначен не только товарам. - Плагин
msViewCounterTrackвключён и наOnLoadWebDocument. - Режим не
fake. dedup_session— refresh в той же сессии не увеличивает total (это ожидаемо).block_botsне отфильтровал вашUser-Agent(отключите временно для проверки). Проверка через PageSpeed Insights и Lighthouse всегда даст 0 просмотров: ихUser-Agentпопадает в список ботов, и пустойUser-Agentтоже считается ботом.
Online равен 0
msviewcounter_show_onlineвключён.- Режим не
fake. viewcounter.jsподключился на странице товара.- Connector доступен:
assets/components/msviewcounter/connector.php. online_ttl>heartbeat_interval.- В исходнике страницы есть
window.msViewCounterConfig. Если нет, JS не шлёт heartbeat: скрипт молча завершается при отсутствииconnectorUrl,productIdилиsessionId, без ошибок в консоли.
Почему не подключается viewcounter.js?
Скрипт подключает плагин msViewCounterTrack на странице товара, а не наоборот. Условие подключения в ViewCounter::registerAssets(): online включён и режим не fake. В режиме fake активные сессии не пишутся в БД, поэтому heartbeat не нужен.
Начиная с версии 1.0.2 число обновляется само: коннектор возвращает актуальные счётчики, а скрипт подставляет их в блок, сохраняя формулировку. До этой версии значение фиксировалось при отрисовке страницы — heartbeat продлевал сессию, но ответ не читался.
В fake у нескольких товаров одинаковый online
fake_online_minиfake_online_max— разные значения. При равных разброса нет, все товары получают одно и то же число.- Если значения перепутаны местами, пакет поменяет их сам — проверьте, что диапазон осмысленный.
- После смены
fake_saltзначения пересчитываются. - Очистите кэш MODX.
Компонент распределяет fake-online по ID товара и salt.
Можно ли накрутить online?
Начиная с версии 1.0.1 — нет, сверка сессии закрыта. Раньше connector.php принимал session_id из тела запроса как есть, и любой посетитель мог отправить POST с чужим product_id и произвольными session_id, раздув «сейчас смотрят» до любого числа.
Теперь коннектор не доверяет телу запроса:
- Сессия посетителя стартует на сервере, и идентификатор берётся из неё, а не из POST.
- Присланный
session_idсверяется с серверным черезhash_equals. Чужой или подделанный даёт{"success": false, "message": "Session mismatch"}и ничего не записывает. - Один посетитель может обновить только свою строку в
msviewcounter_active, то есть увеличить онлайн максимум на единицу — ровно так же, как обычный визит. - Частота запросов ограничена: 30 ping в минуту на сессию, при превышении
429и заголовокRetry-After: 60, который скрипт учитывает и в паузу не шлёт запросы. Лимит намеренно считается по сессии, а не по IP: за одним публичным адресом мобильного оператора или офисного NAT сидят сотни реальных посетителей, и лимит по IP резал бы их честные запросы.
Остаточные ограничения, о которых стоит знать:
- Бот-фильтр смотрит только на
User-Agent. Он не пропускает честных краулеров, но подделать заголовок легко. На онлайн это больше не влияет: поддельный User-Agent даёт ту же одну сессию, а не новые посетители. - Endpoint остаётся публичным. Проверки прав в нём нет и не нужна: он не читает и не отдаёт никаких данных, только продлевает life сессии. Если нужен жёсткий барьер, добавьте правило веб-сервера на
limit_reqдля этого пути.
Формат ответа не изменился: при успехе {"success": true}, ответ клиенту не возвращается и используется только для продления сессии.
Счётчик не обновляется, в консоли пусто
Так и должно быть: по умолчанию скрипт молчит, чтобы не засорять консоль обычных посетителей.
Включите настройку msviewcounter_debug_mode — Конфигурация → Системные настройки, namespace msviewcounter. После очистки кэша в консоли появятся сообщения с префиксом [msViewCounter]:
| Сообщение | Что означает |
|---|---|
counts updated for N product(s) | запрос прошёл, числа обновлены |
connector refused the ping + message | коннектор отклонил запрос, приходит текст ответа |
rate limited, pausing for Ns | сработал лимит частоты, скрипт замолчит на указанное время |
ping failed: … | сетевая ошибка, запрос не дошёл |
no counters with data-product-id on the page | на странице нет блоков счётчика, отправлять нечего |
Идентификаторы сессий и секреты в консоль не выводятся. После диагностики настройку лучше выключить.
Тексты и локализация
Как изменить «Этот товар просмотрели…»?
Измените записи лексикона msviewcounter:
msviewcounter_total_textmsviewcounter_online_textmsviewcounter_view_word_1/_2/_5msviewcounter_person_word_1/_2/_5
Форму склонения пакет выбирает сам по последней цифре числа, отдельные записи под каждое значение не нужны.
Режимы
Включил boost, а числа не изменились
Дефолтные значения boost дают ровно то же, что и real: boost_total_base = 0, boost_total_multiplier = 1, boost_total_jitter_max = 0. Поднимите msviewcounter_boost_total_base или msviewcounter_boost_total_jitter_max — без этого переключение режима витрину не затронет.
Что означает «0 просмотров» на новом товаре?
В режиме real так и есть: статистика копится с момента установки, истории из-под сайта не подтягивается. Чтобы показывать правдоподобные числа без накопления, переключитесь на fake. Если важно сохранить реальные данные, а вид показывать приятнее, подойдёт boost с базой.
Сколько длится дедупликация?
Пока жива PHP-сессия сайта, то есть ориентировочно до session.gc_maxlifetime. Компонент сам вызывает session_start(), если сессия ещё не запущена, и хранит два ключа: $_SESSION['msviewcounter_viewed_products'] — флаги уже записанных товаров, и $_SESSION['msviewcounter_session_id'] — идентификатор для online. Если сайт использует свой обработчик сессий, проверьте совместимость.
Удаление пакета
Что будет при uninstall?
Системные настройки удаляются. Таблицы msviewcounter_totals и msviewcounter_active сохраняются, чтобы не потерять статистику.
