Поки документація по «Рейтингам» в розробці, хочу викласти приклад реалізацій власного критерію рейтингування.
Для початку розповім, що таке рейтинг і як він обчислюється.
Рейтинг це оцінка, що складається з безлічі критеріїв, наприклад, таких як «голосування за повідомлення користувача» або «активність на форумі».
Кожен критерій, розраховуючи свої результати, використовує власну логіку. Завдяки такому підходу можливо реалізувати будь-які формули.
Критерії рейтингу і формули
Коли результати критеріїв розраховані, підраховується підсумкова оцінка.
Вона може бути або сумою критеріїв, або їх середнім значенням.
Тепер перейдемо до того, як створити свій критерій рейтингування.
Для прикладу створимо новий критерій «Голосування за користувача».
Подивитися приклади інших критеріїв ви можете в модулі forum і blog.
Створення критерію складається з трьох етапів:
1. Створити клас і зареєструвати події;
2. Налаштувати критерії і написати функції розрахунку;
3. Додайте зміст рейтингового голосування в потрібних частинах коду;
Створюємо клас і реєструємо події.
Створення файлу критеріїв рейтингу
У корені вашого модуля, в файлі include.php необхідно підключити цей клас.
У функцію подається масив $ arConfigs. в якому є дані про рейтинг і дані про налаштування критерію.
Перед підрахунком необхідно виконати функцію CRatings :: AddComponentResults ($ arConfigs); і видалити всі старі розрахунки.
Далі ви пишете логіку підрахунку, результат додаєте в таблицю b_rating_component_results
RATING_ID - ідентифікатор рейтингу.
MODULE_ID - ідентифікатор модуля, для якого йде за рахунками.
RATING_TYPE - тип голосування.
NAME - ідентифікатор критерію.
COMPLEX_NAME - комплексний ідентифікатор критерію.
ENTITY_TYPE_ID - Об'єкт оцінки.
ENTITY_ID - ідентифікатор об'єкта оцінки, в нашому випадку це ID користувача.
CURRENT_VALUE - підсумок підрахунку критерію до конкретного ENTITY_ID, в нашому випадку це сума всіх голосів за користувача помножена на коефіцієнт зазначений в налаштуванні рейтингу.
При додаванні результатів, настійно рекомендую використовувати конструкцію INSERT ... SELECT для мінімізації навантаження на проект при перерахунку рейтингу. На прикладі підрахунку активності на форумі (з великим кол-вом записів), використання такої конструкції дозволило скоротити час підрахунку з 30 до 0.6 секунди!
function OnGetRatingObject
Функція віддає доступні об'єкти для рейтингування
Швидше за все в майбутніх оновленнях дана функція буде перенесена в клас CRatings.
function OnAfterAddRating
function OnAfterUpdateRating
У цих функціях викликається перевірка введених користувачем даних (полів зазначених в конфігураційному масиві), спрацьовує при додаванні і редагуванні рейтингу.
function __CheckFields
Перевірка введених користувачем даних (полів зазначених в конфігураційному масиві) при збереженні або редагуванні рейтингу.
Тут необхідно перевірити всі поля які ви використовуєте в критерії.
function __AssembleConfigDefault
Допоміжна функція, яка збирає значення за замовчуванням для полів зазначених конфигурационном масиві.
Швидше за все в майбутніх оновленнях дана функція буде перенесена в клас CRatings.
Додаємо компонент «рейтингове голосування» (bitrix: rating.vote)
У всіх місцях де ви хочете вивести рейтингове голосування необхідно додати виклик компонента bitrix: rating.vote.
Компонент bitrix: rating.vote працює в двох режимах:
1. Автоматично отримує дані - необхідно використовувати при одиничному виклику, наприклад в картці користувача.
2. У компонент потрібно подавати дані - необхідно використовувати при множині виклику, наприклад в повідомленнях форуму.
Як приклад, вкажу який код необхідно додати в свій шаблон комплексного компонента forum (заснований на шаблоні .default).
Відкриваємо файл forum \ templates \ (ваш шаблон) \ bitrix \ forum.topic.read \ (ваш шаблон) \ template_message.php
Як часто відбувається перерахунок рейтингів?
Хороше запитання, розповім як саме відбувається розрахунок.
Розрахунок рейтингів відбувається в два етапи:
1. Підрахунок результатів критеріїв на підставі своєї логіки;
2. Підрахунок результатів рейтингу на підставі результатів підрахунку критеріїв;
Перерахунок результатів критеріїв відбувається на підставі значення REFRESH_TIME (з округленням до години в більшу сторону).
Наприклад якщо ви виставите REFRESH_TIME = 3600 - критерій буде розраховуватися кожну годину, якщо ви виставите REFRESH_TIME = 7000 - кожен другий годину.
Підрахунок результату рейтингу відбувається щогодини, на підставі вже підрахованих результатів «критеріїв рейтингування». Якщо якийсь критерій в даний запуск не підраховується, дані беруться з його останнього розрахунку.
Я бачив Агент, в списку агентів, то він ставиться не періодичний
Агент - періодичний, він виконується щогодини функцію CRatings :: Calculate (ID-рейтингу), яка зрушує час наступного виконання на годину.
І ще один, момент:
При створенні, редагуванні і перерахунку рейтингу з адмінки - все критерії рейтингу примусово перераховуються, зроблено це для того що б була можливість побачити результат моментально.