Перейти к содержимому

Рейтинги и голоса за материалы - нормированный голос, авторитет, правила

Разбираем голосование за материалы: откуда берётся вес голоса, что такое авторитет, когда пересчитываются числа и как настраивают правила и звания.

Механика

Голосование за материалы устроено сложнее простого счётчика лайков. Вес голоса зависит не от числа проголосовавших, а от размера активного сообщества сайта, и это сделано намеренно.

Голос каждого пользователя нормируется по размеру активного сообщества сайта. Общий коэффициент делится на число активных участников, поэтому на маленьком сайте один голос весит больше, чем на многолюдном.

Размером сообщества считаются пользователи с правом голоса, заходившие в последние девяносто дней. Забытые учётные записи в расчёт не попадают, и уход активных участников меняет вес голосов у оставшихся.

У каждого пользователя ограниченное число нормированных голосов на весь период. По умолчанию их три, и это защита от накрутки: один участник не может поднять материал в одиночку.

Авторитет считается по своему правилу и учитывает не каждый голос. В авторитет попадает голос за материал, набравший заметную сумму баллов за те же девяносто дней, а разовая единичная оценка авторитета не даёт.

Числа пересчитываются фоновыми заданиями платформы примерно раз в час. Сразу после голосования итог меняется не везде, и это нормальное поведение, а не ошибка настройки.

Голосование за материал и авторитет автора считаются раздельно и по разным правилам. Первое отвечает на вопрос «хорош ли материал», второе - «стоит ли доверять его автору», и смешивать их при выводе не стоит.

Правила обработки здесь декларативные, а не написанные кодом. В административном разделе задают пороги: выдать звание при таком-то числе голосов, перевести пользователя в другую группу при таком-то авторитете.

Полная смена общих настроек влечёт за собой полный пересчёт рейтингов. На большом сайте это долгая операция, и её планируют на ночь, а не на утро рабочего дня.

Шаги

  1. Решить, за что голосуют: за материалы, за комментарии или за самих авторов.
  2. Включить поддержку рейтингов у нужных объектов и проверить права на голосование.
  3. Поставить компоненты голосования и вывода результата в шаблон материала.
  4. Настроить правила обработки: звания, пороги авторитета и перевод между группами.
  5. Проверить пересчёт: числа появляются только после отработки фонового задания.

Код

Смотрим настройки рейтингов и размер сообщества:

\Bitrix\Main\Loader::includeModule('rating');
printf("коэффициент=%s голосов на пользователя=%s\n",
\Bitrix\Main\Config\Option::get('rating', 'RATING_VOTE_WEIGHT', '1000'),
\Bitrix\Main\Config\Option::get('rating', 'RATING_VOTES_PER_USER', '3'));
// значения по умолчанию видны, если настройку ни разу не меняли руками

Настройки рейтингов живут в опциях модуля и меняются в административном разделе. Смотреть их из кода удобно при разборе: значение по умолчанию и явно заданное значение выглядят на странице настроек одинаково.

Ставим голосование в шаблон материала:

$APPLICATION->IncludeComponent('bitrix:rating.vote', '', [
'ENTITY_TYPE_ID' => 'IBLOCK_ELEMENT', // за что голосуем
'ENTITY_ID' => $element['ID'],
'OWNER_ID' => $element['CREATED_BY'], // автор материала получает авторитет
'USER_VOTE' => $userVote, // текущий голос посетителя, если он есть
'PATH_TO_USER_PROFILE' => '/company/personal/user/#user_id#/',
]);

Голосование привязано к объекту и к его автору одновременно. Первое даёт рейтинг самому материалу, второе - авторитет автору, и путать эти два числа при выводе не стоит.

Выводим результат голосования:

$APPLICATION->IncludeComponent('bitrix:rating.result', '', [
'ENTITY_TYPE_ID' => 'IBLOCK_ELEMENT',
'ENTITY_ID' => $element['ID'],
'CACHE_TIME' => 300, // короткий кэш: числа и так пересчитываются не мгновенно
]);

Результат голосования кэшируют коротким сроком, на считаные минуты. Держать его часами бессмысленно: посетитель проголосовал и хочет увидеть изменение, а сутки кэша делают голосование бессмысленным занятием.

Считаем активных участников сообщества:

$count = \Bitrix\Main\UserTable::getCount([
'>LAST_LOGIN' => (new \Bitrix\Main\Type\DateTime())->add('-90 days'),
'=ACTIVE' => 'Y',
]);
printf("активных за 90 дней: %d\n", $count); // от этого числа зависит вес голоса

Число активных участников напрямую влияет на вес голоса. На новом сайте оно мало, голоса весят много, и первые оценки выглядят неожиданно крупными для владельца проекта.

Описываем правило обработки в административном разделе:

Сервисы → Рейтинги → Правила обработки:
Условие - число нормированных голосов или значение авторитета
Действие - выдать звание либо добавить в группу пользователей
Порог - например: авторитет ≥ 10 → перевод во вторую группу
# правила декларативные: код их не пишет, система применяет их при пересчёте

Правила удобны тем, что не требуют кода и правятся редакцией. Опасны они тем же: неверный порог тихо раздаёт права, и заметить это можно спустя недели.

Проверяем фоновые задания модуля:

SELECT NAME, ACTIVE, LAST_EXEC, NEXT_EXEC FROM b_agent
WHERE MODULE_ID = 'rating'; -- задания пересчёта рейтингов
-- давняя дата последнего запуска объясняет застывшие числа на витрине

Застывшие числа почти всегда означают остановленные фоновые задания. Это первое, что проверяют при жалобе «голоса не считаются», и только потом смотрят настройки самого модуля.

Запускаем пересчёт руками:

// служебный скрипт: пересчёт после смены общих настроек
// рейтинги живут в главном модуле, отдельного модуля подключать не нужно
$rs = \CRatings::GetList(['ID' => 'ASC'], ['ACTIVE' => 'Y']);
while ($rating = $rs->Fetch()) {
\CRatings::Calculate($rating['ID']); // пересчёт одного рейтинга целиком
}
// на большом сайте операция долгая, поэтому её ставят на ночное время
// прогресс смотрят по журналу и по датам запуска фоновых заданий

Ручной пересчёт нужен после смены настроек и при разборе расхождений. В обычной работе числа обновляют фоновые задания, и вмешательство требуется редко.

Ограничения

Рейтинги считаются по своим правилам, а не как обычные счётчики. Объяснить владельцу сайта, почему у материала «полтора голоса», получается не всегда, и это стоит обсудить до включения.

Пересчёт занимает время и нагружает базу на большом сайте. Полный проход после смены настроек планируют как отдельную работу, а не как мгновенное действие.

Голоса привязаны к учётным записям, а не к посетителям. Анонимное голосование этим механизмом не решается: для него берут опрос или собственный счётчик с защитой от повторов.

Правила перевода между группами меняют права пользователей полностью автоматически. За порогами следят: неудачная настройка легко раздаёт лишние права активным комментаторам.

Механизм рассчитан на сообщество, а не на витрину магазина. Там, где важна оценка товара покупателем, дешевле собрать свои отзывы со звёздами: их проще объяснить и проще выводить в списках и фильтрах.

Числа рейтинга плохо переносятся между проектами и площадками. При переезде на новый сайт голоса обычно оставляют позади, а не пытаются перенести вместе с материалами и учётными записями.

Типичные проблемы

Голос учтён, а число рядом с материалом прежнее.

Итог пересчитывается фоновым заданием, а не в момент голосования. Числа появляются после отработки задания, обычно в течение часа.

Вес голоса кажется неправдоподобно большим.

На сайте мало активных пользователей, а голос нормируется по размеру сообщества. С ростом активной аудитории вес одного голоса постепенно снижается.

Авторитет автора не растёт при единичных оценках.

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

После правки настроек числа поехали по всему сайту.

Смена общих настроек запускает полный пересчёт рейтингов по сайту. Такие правки планируют на ночь и предупреждают редакцию заранее.

Активные комментаторы получили лишние права.

Правило перевода между группами настроено со слишком низким порогом авторитета. Пороги проверяют на копии сайта ещё до включения правила.

Частые вопросы

Чем рейтинг отличается от опроса?

Рейтинг оценивает конкретный материал и влияет на авторитет автора. Опрос собирает мнение по вопросу и с материалами никак не связан.

Можно ли дать голосовать гостям?

Механизм рассчитан на учётные записи, поэтому анонимное голосование им не решают. Для гостей берут опрос или свой счётчик с защитой от повторов.

Как быстро увидеть результат при отладке?

Запустить пересчёт вручную служебным скриптом на стенде. На боевом сайте лучше дождаться фонового задания.

Что показывать посетителю: голоса или авторитет?

Посетителю понятнее рейтинг материала, авторитет полезен внутри сообщества. Выводить оба числа рядом обычно только путает.

Нужны ли рейтинги обычному магазину?

Редко: там полезнее отзывы с оценкой товара. Рейтинги хорошо ложатся на сайты с авторами, статьями и обсуждениями.

Смежное

Первоисточник