Запрещаем авторам голосовать за свои посты и комментарии

  • strict warning: Declaration of views_handler_field_user_name::init() should be compatible with views_handler_field_user::init(&$view, $data) in /var/www/shvabrashvabr.ru/sites/all/modules/views/modules/user/views_handler_field_user_name.inc on line 61.
  • strict warning: Declaration of views_handler_argument_many_to_one::init() should be compatible with views_handler_argument::init(&$view, $options) in /var/www/shvabrashvabr.ru/sites/all/modules/views/handlers/views_handler_argument_many_to_one.inc on line 169.


По умолчанию, если для голосования используется модуль Vote Up/Down, авторы могут голосовать за свои материалы и комментарии. Теоретически, в этом нет ничего плохого, так как в настройках модуля Views можно задать фильтры с учетом этой особенности, но избавиться от этой фичи достаточно просто.

В модуле Vote Up/Down в файле vote_up_down.module есть функция theme_vote_up_down_widget. Я уже не раз говорил о том, что в Друпале можно легко переопределить внешний вид любого элемента не изменяя код ядра и модулей. Для этого как раз и нужны функции, начинающиеся с префикса "theme". Эту функцию надо скопировать и перенести в файл template.php, расположенный в папке с темой. Если такого файла еще нет, то его надо создать вручную.

Если вы используете тему, которая работает не с помощью движка PHPTemplate, например chameleon, то эту функцию надо скопировать в файл имя_темы.theme.

Далее префикс theme надо заменить на имя темы. В случае Швабрышвабр, использующей тему aberdeen, функция получила имя aberdeen_vote_up_down_widget. Теперь с виджетом голосовалки можно делать все что угодно, например можно изменить пути к картинкам, имена используемых классов или полностью переопределить верстку. В моем примере я убираю возможность авторам голосовать за свои посты и комментарии:


function aberdeen_vote_up_down_widget($cid, $type) {
global $user;

if (user_access('view up-down vote')) {

$b = TRUE;
if($type == 'node') $r = db_fetch_object(db_query("SELECT `uid` FROM {node} WHERE nid = %d LIMIT 0,1", $cid));
if($type == 'comment') $r = db_fetch_object(db_query("SELECT `uid` FROM {comments} WHERE cid = %d LIMIT 0,1", $cid));
if($user->uid == $r->uid) $b = FALSE;

$output = '

';

if (user_access('use up-down vote') && ($user->uid || variable_get('vote_up_down_anonymous_vote', 0)) && $b) {
$user_vote = votingapi_get_user_votes($type, $cid, _vote_up_down_get_uid());

if ($user_vote[0]->value > 0) {
$class = 'vote-up-act';
$class2 = 'vote-down-inact';
}
else if ($user_vote[0]->value < 0) {
$class = 'vote-up-inact';
$class2 = 'vote-down-act';
}
else {
$class = 'vote-up-inact';
$class2 = 'vote-down-inact';
}

$output .= ''. l('', "vote_up_down/$type/$cid/1", array('class' => $class, 'title' => t('Vote up')), drupal_get_destination(), NULL, FALSE, TRUE) .'';
$output .= ''. l('', "vote_up_down/$type/$cid/-1", array('class' => $class2, 'title' => t('Vote down')), drupal_get_destination(), NULL, FALSE, TRUE) .'';
}
else if(!$b) {
$output .= '';
$output .= '';
} else {
$output .= '';
$output .= '';
}

$output .= '

';

return $output;
}
}

Комментарии

Спасибо. Изменил похожим образом Extra Voting Forms. Он как-то поживее кажется, чем Vote Up/Down :)

Back to top