Skip to content
msViewCounter
msViewCounter
Счётчик просмотров и активных посетителей товара для MiniShop3
  • MODX 3
  • PHP 8.2
  • miniShop3
  1. Компоненты
  2. msViewCounter
  3. FAQ

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-очистку сессий.

Установка ​

Блок не выводится ​

Проверьте:

  1. Плагин msViewCounterBootstrap включён: Это → Плагины, строка msViewCounterBootstrap, колонка «Отключён» пустая. Плагин подключает bootstrap.php с загрузчиком классов и функцией msvc_get_service(), а также регистрирует ассеты на странице товара.

    Начиная с версии 1.0.1 сам сниппет подключает bootstrap.php, если функция ещё не объявлена. Поэтому выключенный плагин больше не приводит к фатальной ошибке Call to undefined function msvc_get_service(): блок и число всё равно появятся на странице, но не подключатся viewcounter.js и CSS, то есть не будет heartbeat и оформления.

  2. Сниппет msViewCounter установлен.

  3. В вызове передан pid > 0.

  4. Чанк из tpl существует.

  5. Кэш MODX очищен.

  6. Вызов некэшированный ([[!...]]).

Пустой вывод при pid <= 0

При pid <= 0 сниппет возвращает пустую строку без предупреждения. На странице, где сниппет вызывается вне контекста товара, добавьте проверку ID или убедитесь, что передан корректный ID.

CSS не подключается ​

  1. На странице есть вызов [[!msViewCounter]].
  2. В HTML есть /assets/components/msviewcounter/css/viewcounter.css.
  3. Файл существует в assets/components/msviewcounter/css/.
  4. Кэш MODX очищен.

Сниппет сам регистрирует CSS при выводе счётчика. Если выключены оба флага — msviewcounter_show_total и msviewcounter_show_online — не регистрируется даже CSS.

Просмотры и online ​

Просмотры не растут ​

  1. Ресурс — msProduct или страница с шаблоном, равным ms3_template_product_default из системных настроек MiniShop3. Плагин считает товаром ресурс по любому из двух признаков, поэтому просмотр может записываться и там, где вы его не ждёте, если этот шаблон назначен не только товарам.
  2. Плагин msViewCounterTrack включён и на OnLoadWebDocument.
  3. Режим не fake.
  4. dedup_session — refresh в той же сессии не увеличивает total (это ожидаемо).
  5. block_bots не отфильтровал ваш User-Agent (отключите временно для проверки). Проверка через PageSpeed Insights и Lighthouse всегда даст 0 просмотров: их User-Agent попадает в список ботов, и пустой User-Agent тоже считается ботом.

Online равен 0 ​

  1. msviewcounter_show_online включён.
  2. Режим не fake.
  3. viewcounter.js подключился на странице товара.
  4. Connector доступен: assets/components/msviewcounter/connector.php.
  5. online_ttl > heartbeat_interval.
  6. В исходнике страницы есть window.msViewCounterConfig. Если нет, JS не шлёт heartbeat: скрипт молча завершается при отсутствии connectorUrl, productId или sessionId, без ошибок в консоли.

Почему не подключается viewcounter.js? ​

Скрипт подключает плагин msViewCounterTrack на странице товара, а не наоборот. Условие подключения в ViewCounter::registerAssets(): online включён и режим не fake. В режиме fake активные сессии не пишутся в БД, поэтому heartbeat не нужен.

Начиная с версии 1.0.2 число обновляется само: коннектор возвращает актуальные счётчики, а скрипт подставляет их в блок, сохраняя формулировку. До этой версии значение фиксировалось при отрисовке страницы — heartbeat продлевал сессию, но ответ не читался.

В fake у нескольких товаров одинаковый online ​

  1. fake_online_min и fake_online_max — разные значения. При равных разброса нет, все товары получают одно и то же число.
  2. Если значения перепутаны местами, пакет поменяет их сам — проверьте, что диапазон осмысленный.
  3. После смены fake_salt значения пересчитываются.
  4. Очистите кэш MODX.

Компонент распределяет fake-online по ID товара и salt.

Можно ли накрутить online? ​

Начиная с версии 1.0.1 — нет, сверка сессии закрыта. Раньше connector.php принимал session_id из тела запроса как есть, и любой посетитель мог отправить POST с чужим product_id и произвольными session_id, раздув «сейчас смотрят» до любого числа.

Теперь коннектор не доверяет телу запроса:

  1. Сессия посетителя стартует на сервере, и идентификатор берётся из неё, а не из POST.
  2. Присланный session_id сверяется с серверным через hash_equals. Чужой или подделанный даёт {"success": false, "message": "Session mismatch"} и ничего не записывает.
  3. Один посетитель может обновить только свою строку в msviewcounter_active, то есть увеличить онлайн максимум на единицу — ровно так же, как обычный визит.
  4. Частота запросов ограничена: 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_text
  • msviewcounter_online_text
  • msviewcounter_view_word_1 / _2 / _5
  • msviewcounter_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 сохраняются, чтобы не потерять статистику.

См. также ​