Голосовать только за 1 ноду

Главные вкладки

Аватар пользователя artyomalin artyomalin 11 декабря 2013 в 13:35

Всем привет.
Установил модуль rate и voting api. Все отлично. Но начальство хочет, чтобы голосовать можно было только один раз и за конкретуню ноду. То есть, если показываются 10 картинок, то голосовать можно только за одну из них.
Поискал в инете, но что-то ничего не нашел.

Подскажите, пожалуйста, есть ли какие-нибудь решения для моделй голосования?

Заранее спасибо

Комментарии

Аватар пользователя Inj Inj 12 декабря 2013 в 15:10

через правило можно менять пользователям роли "голосовал/не голосовал" и дать право голосовать только первым, после голосования менять роль. Анонимов не выловишь вообще

Аватар пользователя artyomalin artyomalin 13 декабря 2013 в 13:29

На сайте посказали:
В документации по 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;
}

}
}

Но что-то не работает (((

Аватар пользователя toksoba toksoba 16 марта 2015 в 0:23

Добрый вечер! Прочитала предыдущие ответы, пересмотрела многие варианты и дошла до такого решения:

На случай, если надо обрабатывать голоса (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) загружаем этот модуль в директорию с модулями, включаем его и тестируем работу.