Skip to content

v0ff4k/bitrix-liker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

BITRIX plugin like-dislike any entity

INTRO

Модуль добавляет на сайт функционал голосования "Лайк/Дизлайк". Позволяет пользователям ставить оценки различным сущностям (элементы инфоблоков, сообщения форумов, посты блогов и т.д.) с защитой от повторного голосования. Реализован с использованием 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

Шаги установки:

  1. Скопируйте содержимое папки local/ в корень сайта Битрикс
  2. Таблица b_votes_likes создастся автоматически при первом обращении
  3. Подключите JavaScript файл в шаблоне (если используете компонент, подключение происходит автоматически)

ИСПОЛЬЗОВАНИЕ:

Способ 1: Через компонент Битрикс

В нужном месте шаблона добавьте:

<?php
$APPLICATION->IncludeComponent(
    'custom:vote',
    '',
    [
        'ENTITY_TYPE' => 'IBLOCK_ELEMENT', // Тип сущности
        'ENTITY_ID' => $arResult['ID'],    // ID элемента
    ]
);
?>

Компонент автоматически подключит необходимые стили и JavaScript.

Способ 2: Прямой вызов через AJAX

<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>

Способ 3: Прямой AJAX запрос

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);
    }
}

API:

VoteManager::addVote($entityType, $entityId, $voteValue)

Добавляет голос. Возвращает массив с ключами:

  • success - успешность операции
  • vote_id - ID созданного голоса
  • stats - статистика голосования
  • error - текст ошибки (если есть)

VoteManager::getVoteStats($entityType, $entityId)

Получает статистику голосования. Возвращает массив:

  • likes - количество лайков
  • dislikes - количество дизлайков
  • total - общее количество голосов
  • rating - рейтинг (likes - dislikes)

VoteManager::getUserVote($entityType, $entityId)

Получает голос текущего пользователя. Возвращает:

  • 1 - лайк
  • -1 - дизлайк
  • null - пользователь не голосовал

VoteManager::removeVote($entityType, $entityId)

Удаляет голос текущего пользователя. Возвращает статистику после удаления.

AJAX Endpoint: /local/ajax/vote.php

Параметры POST:

  • sessid - сессионный ID Битрикс (обязательно)
  • action - действие: like, dislike, get_stats, remove_vote
  • entity_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 сущности и IP
  • IX_ENTITY - индекс по типу и ID сущности
  • IX_USER - индекс по пользователю

БЕЗОПАСНОСТЬ:

  • Все SQL запросы используют экранирование через $DB->ForSql()
  • Проверка сессионного ID через check_bitrix_sessid()
  • Валидация типов сущностей и значений голосов
  • Защита от повторного голосования
  • Корректная обработка IPv4 и IPv6 адресов

About

Простой PHP-плагин для 1С-Битрикс, добавляющий функционал голосования «Лайк/Дизлайк» на любые страницы с защитой от повторных голосов. Работает через AJAX, использует MySQL, легко интегрируется через компонент или прямые вызовы.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors