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

Опрос на сайте - голосование, результаты, повторное участие

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

Что нужно знать заранее

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

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

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

Шаги

  1. Установить модуль голосований и создать группу опросов с правами доступа.
  2. Завести опрос, вопросы и варианты ответов внутри созданной группы.
  3. Задать сроки показа и способ ограничения повторного голосования.
  4. Поставить компонент опроса на нужную страницу публичной части сайта.
  5. Проверить голосование от гостя и от авторизованного пользователя отдельно.

Решение

Выводим текущий опрос на странице:

$APPLICATION->IncludeComponent('bitrix:voting.current', '', [
'VOTE_ID' => $voteId, // конкретный опрос из группы голосований
'CACHE_TIME' => 3600, // результаты обновятся не раньше этого срока
// идентификатор опроса удобно держать в настройках модуля, а не в шаблоне
]);

Компонент показывает форму, пока посетитель не проголосовал, и результаты после голосования. Это самый частый вариант вывода: один блок в колонке сайта закрывает весь сценарий целиком.

Разносим форму и результаты по разным местам:

$APPLICATION->IncludeComponent('bitrix:voting.form', '', [
'VOTE_ID' => $voteId,
]);
$APPLICATION->IncludeComponent('bitrix:voting.result', '', [
'VOTE_ID' => $voteId, // отдельная страница с итогами голосования
]);

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

Берём список активных опросов из кода:

\Bitrix\Main\Loader::includeModule('vote');
$by = 'ID'; $order = 'DESC'; $count = false;
$res = \CVote::GetList($by, $order, ['ACTIVE' => 'Y', 'CHANNEL_ID' => $channelId], $count);
while ($vote = $res->Fetch()) {
printf("%d %s\n", $vote['ID'], $vote['TITLE']); // проверка сроков и активности
}

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

Сбрасываем кэш опроса после правки вариантов:

BXClearCache(true, '/vote/'); // каталог кэша модуля голосований
// после правки вопросов и ответов витрина отдаёт старую разметку из кэша

Правка вариантов ответа в админке не сбрасывает кэш публичного блока сама. Сброс каталога кэша модуля возвращает витрине свежий вопрос, и это первое, что проверяют при жалобе «поменял, а на сайте старое».

Отключаем кэш на время проверки:

$APPLICATION->IncludeComponent('bitrix:voting.current', '', [
'VOTE_ID' => $voteId,
'CACHE_TIME' => 0, // на время проверки, на витрине так не оставляют
]);

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

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

Результаты не меняются после голосования.

Блок отдан из кэша компонента. Время жизни кэша сокращают или сбрасывают кэш после правки опроса.

Опрос не выводится на странице совсем.

Опрос неактивен или вышли сроки показа. Даты начала и окончания проверяют в настройках самого опроса.

Гость не может проголосовать.

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

Один человек голосует много раз подряд.

Ограничение повторного участия не настроено. Уникальность голоса задают настройкой опроса: по сеансу, адресу или пользователю.

Поиск по имени модуля не находит компонент.

Имена модуля и его компонентов различаются. Компонент ищут в дереве по разделу голосований, а не по названию модуля.

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

Чем опрос отличается от веб-формы?

Опрос считает голоса и показывает итоги, а веб-форма собирает произвольные ответы. Для сбора заявок берут веб-форму, для мнения посетителей - опрос.

Как запретить повторное голосование?

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

Можно ли вывести несколько опросов сразу?

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

Где посмотреть итоги голосования?

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

Как оценивать статьи и товары звёздами?

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

Смежное

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