Модуль добавляет на сайт функционал голосования "Лайк/Дизлайк". Позволяет пользователям ставить оценки различным сущностям (элементы инфоблоков, сообщения форумов, посты блогов и т.д.) с защитой от повторного голосования. Реализован с использованием PHP, JavaScript и MySQL (встроенные таблицы Битрикс).
Возможности:
- Автоматическое создание таблицы в БД при первом обращении
- Предотвращение повторного голосования (по пользователю или IP)
- Работа для авторизованных и анонимных пользователей
- Поддержка IPv4 и IPv6
- Простой API для использования
- Готовый компонент Битрикс
- Легкая стилизация под дизайн сайта
- 1С-Битрикс: Управление сайтом (редакция "Старт" и выше) версии 17.5.0+
- PHP 7.4+
- MySQL 5.6+ или MariaDB 10.0+
- Поддержка работы с local/ директорией
/local/
/php_interface/
/classes/
VoteManager.php
init.php
/ajax/
vote.php
/components/
/custom/
/vote/
.description.php
class.php
/templates/
/.default/
template.php
/templates/
/.default/
/js/
vote.js
- Скопируйте содержимое папки
local/в корень сайта Битрикс - Таблица
b_votes_likesсоздастся автоматически при первом обращении - Подключите JavaScript файл в шаблоне (если используете компонент, подключение происходит автоматически)
В нужном месте шаблона добавьте:
<?php
$APPLICATION->IncludeComponent(
'custom:vote',
'',
[
'ENTITY_TYPE' => 'IBLOCK_ELEMENT', // Тип сущности
'ENTITY_ID' => $arResult['ID'], // ID элемента
]
);
?>Компонент автоматически подключит необходимые стили и JavaScript.
<div class="vote-container" id="vote-<?= $arResult['ID'] ?>">
<button class="vote-btn vote-like" data-action="like">👍 <span class="vote-likes-count">0</span></button>
<span class="vote-rating">0</span>
<button class="vote-btn vote-dislike" data-action="dislike">👎 <span class="vote-dislikes-count">0</span></button>
</div>
<script src="/local/templates/.default/js/vote.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
new VoteSystem({
entityType: 'IBLOCK_ELEMENT',
entityId: <?= $arResult['ID'] ?>,
container: '#vote-<?= $arResult['ID'] ?>'
});
});
</script>async function vote(action, entityType, entityId) {
const response = await fetch('/local/ajax/vote.php', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams({
sessid: BX.bitrix_sessid(),
action: action,
entity_type: entityType,
entity_id: entityId
})
});
const result = await response.json();
if (result.success) {
console.log('Статистика:', result.stats);
// result.stats содержит: likes, dislikes, total, rating
} else {
console.error('Ошибка:', result.error);
}
}Добавляет голос. Возвращает массив с ключами:
success- успешность операцииvote_id- ID созданного голосаstats- статистика голосованияerror- текст ошибки (если есть)
Получает статистику голосования. Возвращает массив:
likes- количество лайковdislikes- количество дизлайковtotal- общее количество голосовrating- рейтинг (likes - dislikes)
Получает голос текущего пользователя. Возвращает:
1- лайк-1- дизлайкnull- пользователь не голосовал
Удаляет голос текущего пользователя. Возвращает статистику после удаления.
Параметры POST:
sessid- сессионный ID Битрикс (обязательно)action- действие:like,dislike,get_stats,remove_voteentity_type- тип сущности (обязательно)entity_id- ID сущности (обязательно)
Ответ в формате JSON:
{
"success": true,
"stats": {
"likes": 10,
"dislikes": 2,
"total": 12,
"rating": 8
}
}По умолчанию поддерживаются:
IBLOCK_ELEMENT- элементы инфоблоковFORUM_TOPIC- темы форумаBLOG_POST- посты блога
Для добавления новых типов сущностей отредактируйте константу ENTITY_TYPES в классе VoteManager.
Таблица b_votes_likes создается автоматически со следующей структурой:
ID- первичный ключENTITY_TYPE- тип сущности (VARCHAR 50)ENTITY_ID- ID сущности (INT)USER_ID- ID пользователя (INT, NULL для анонимных)IP_ADDRESS- IP адрес (VARCHAR 45, поддерживает IPv6)VOTE- значение голоса (1 - лайк, -1 - дизлайк)DATE_CREATE- дата создания
Индексы:
UX_ENTITY_USER- уникальный индекс по типу, ID сущности и пользователюUX_ENTITY_IP- уникальный индекс по типу, ID сущности и IPIX_ENTITY- индекс по типу и ID сущностиIX_USER- индекс по пользователю
- Все SQL запросы используют экранирование через
$DB->ForSql() - Проверка сессионного ID через
check_bitrix_sessid() - Валидация типов сущностей и значений голосов
- Защита от повторного голосования
- Корректная обработка IPv4 и IPv6 адресов