Всем привет.
Установил модуль rate и voting api. Все отлично. Но начальство хочет, чтобы голосовать можно было только один раз и за конкретуню ноду. То есть, если показываются 10 картинок, то голосовать можно только за одну из них.
Поискал в инете, но что-то ничего не нашел.
Подскажите, пожалуйста, есть ли какие-нибудь решения для моделй голосования?
Заранее спасибо
Комментарии
через правило можно менять пользователям роли "голосовал/не голосовал" и дать право голосовать только первым, после голосования менять роль. Анонимов не выловишь вообще
На сайте посказали:
В документации по voting api расписаны хуки
https://drupal.org/node/68877
Можете на insert добавить обработку для вычисления количества голосов пользователя.
hook_votingapi_insert($vote)
Здесь пример для модуля flag:
https://drupal.org/node/955724
Пытался сделать так:
function hook_votingapi_insert($votes) {
foreach ($votes as $vote) {
$curip = ip_address();
$result = db_query("SELECT count(vote_source) as 'count' FROM {votingapi_vote} WHERE vote_source = '$curip'");
$fetch = db_fetch_object($result);
$count = $fetch->count;
if ($count >= 2) {
return FALSE;
}
}
}
Но что-то не работает (((
Добрый вечер! Прочитала предыдущие ответы, пересмотрела многие варианты и дошла до такого решения:
На случай, если надо обрабатывать голоса (Rate + Voting API).
1) Создаем модуль [название_модуля]
в нем 3 файла: [название_модуля].info (оформляем по стандарту), [название_модуля].install (пустой), [название_модуля].module (в нем будут хуки)
2) в [название_модуля].module пишем функцию [название_модуля]_rate_vote_alter($vote, $context) (этот хук конкретно отвечает за обработку голоса перед сохранением).
Дальнейший пример описывает возможность голосовать 1 раз в ограниченное время за 1 нод или другую сущность. Постаралась расписать поподробнее, чтобы любой человек, у которого возникал подобный вопрос, имел возможность разобраться в нем достаточно быстро.
function [название_модуля]_rate_vote_alter($vote, $context) {
$ip_user = ip_address(); // берем ip адрес
$sql = db_select('votingapi_vote', 'v')
->fields('v', array('timestamp'))
->condition('v.vote_source', $ip_user)
->orderBy('v.timestamp', 'DESC')
->execute()
->fetchObject();
$timevote = $sql->timestamp; // получаем последнее значение времени из таблицы голосов, где ip, отданного голоса равен ip голосующего
$timevotingapi = variable_get('votingapi_anonymous_window', 0); // берем время, в течение которого пользователь не может голосовать (в настройках voting api)
$timenow = time(); // берем текущее время
$time = $timenow - $timevotingapi; // получаем значение
if($sql) {
if((int)$timevote > (int)$time) { // и если это значение будет меньше времени последнего голосования...
$context['save'] = FALSE; // то не сохраняем голос
}
}
// в противном голосование происходит в штатном режиме
}
3) загружаем этот модуль в директорию с модулями, включаем его и тестируем работу.