На ***цатый день вместо Fivestar я поставил Vote Up/Down и понял, что он лучше. Но не был он идеален – не увидел я суммы голосов под нодой, ибо искал их на самом виджете. Альтернативный виджет не порадовал меня, ибо не дает возможности ругать посты и комменты. Так выбор пал на темизацию оригинальной голосовалки.
В модуле нашлись функции theme_vote_up_down_widget и theme_vote_up_down_points.
В template.php добавились функции
global $user;
$output ='';
if (isset($GLOBALS['aqua_vote_up_down_hide'])){
if (user_access('view up-down vote')) {
$output = '<div class="vote-up-down-widget">';
$vote_result = votingapi_get_voting_result($type, $cid, 'points', variable_get('vote_up_down_tag', 'vote'), 'sum');
$value = $vote_result->value?$vote_result->value:'0';
if (user_access('use up-down vote') && ($user->uid || variable_get('vote_up_down_anonymous_vote', 0))) {
$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 .= '<span id="vote_up_'. $cid .'" class="'. $class .'" title="'.url("vote_up_down/$type/$cid/1/1") .'">'. l('', "vote_up_down/$type/$cid/1", array('class' => $class, 'title' => t('Vote up')), drupal_get_destination(), NULL, FALSE, TRUE) .'</span>';
$output .= '<span id="vote_down_'. $cid .'" class="'. $class2 .'" title="'. url("vote_up_down/$type/$cid/-1/1") .'">'. l('', "vote_up_down/$type/$cid/-1", array('class' => $class2, 'title' => t('Vote down')), drupal_get_destination(), NULL, FALSE, TRUE) .'</span>';
$output .= '<span class="vote-points" title="'.t('points').'">'.$value.'</span>';
}
else {
$output .= '<span class="up-inact" title="'. t('You must login to vote.') .'"></span>';
$output .= '<span class="down-inact" title="'. t('You must login to vote.') .'"></span>';
$output .= '<span class="vote-points" title="'.t('points').'">'.$value.'</span>';
}
$output .= '</div>';
#return $output;
}
};//if not hide
return $output;
}
function aqua_hobby_info_vote_up_down_points($cid, $type, $nodelink = FALSE) {
return '';
}
Первая функция выдает собственно виджет с суммой голосов. Вторая убирает их из-под текста. Тема, соответственно, зовется aqua_hobby_info.
Понадобилась дописка в style.css
padding:0px;
text-align:center;
margin:4px 4px 0 2px;
background:#011F39;
}
.vote-up-down-widget .vote-up-act,
.vote-up-down-widget .vote-up-inact,
.vote-up-down-widget .vote-down-act,
.vote-up-down-widget .vote-down-inact,
.vote-up-down-widget .up-inact,
.vote-up-down-widget .down-inact{
margin:0; padding:0;
float:left;
clear:left;
}
.vote-up-down-widget .vote-points {
margin:0px;
padding:0 2px;
line-height:32px;
vertical-align:middle;
display:block;
font-weight:bold;
}
Самое главное тут – float:left; и clear:left; для кнопок. Желающие могут тут же, написав например «.vote-up-down-widget .vote-up-act{background-image:utl(1.gif)}», поменять иконки кнопок. Так получился виджет наподобие того, что на www.Drupal.ru
Но это было ещё не всё. Кнопки для голосования с суммой стали шире и уже мешали нормальному показу страницы, на которой была группа полей CCK. Пришлось вновь обратиться к template.php. Вот что я добавил к _phptemplate_variables
$GLOBALS['aqua_vote_up_down_hide'] = ture;
switch($hook) {
case 'comment':
// my own restyle
#if (variable_get('vote_up_down_widget_comment', 1)) {
$style = variable_get('vote_up_down_widget_style_comment', 0) == 1 ? '_alt' : '';
$vars['vote_up_down_widget'] = theme("vote_up_down_widget$style", $vars['comment']->cid, 'comment') . $comment->comment;
#}
break;
case 'node':
$node_type = in_array($vars['node']->type, variable_get('vote_up_down_node_types', array()), TRUE);
if ($node_type) {
$style = variable_get('vote_up_down_widget_style_node', 0) == 1 ? '_alt' : '';
};
$vars['vote_up_down_widget'] = theme("vote_up_down_widget$style", $vars['node']->nid, 'node');
break;
case 'page':
if (arg(0)=='node' and is_numeric(arg(1)) and strlen(arg(2))<1) {
$node = node_load(arg(1));
$node_type = in_array($node->type, variable_get('vote_up_down_node_types', array()), TRUE);
if ($node_type) {
$style = variable_get('vote_up_down_widget_style_node', 0) == 1 ? '_alt' : '';
$vars['vote_up_down_widget'] .= theme("vote_up_down_widget$style", $node->nid, 'node');
};
};
break;
};
unset($GLOBALS['aqua_vote_up_down_hide']);
Так к переменным, доступным в node.tpl.php comment.tpl.php и page.tpl.php добавилась $vote_up_down_widget. Хочу также упомянуть про $GLOBALS['aqua_vote_up_down_hide'] – без установки этой переменной в True виджет не формируется. Так что вне зависимости от настроек сайта он не появляется в теле материала. При переключении на другую тему оформления никаких настроек менять не надо. Если перейти на альтернативный (+1) режим отображения, то все остается, как и было до темизации. Живьем можно глянуть на www.aquasphere.info
Комментарии
Хм... действуя по инструкции результата не добился... ничего переименовывать не надо? новый видж не появляется, старый не исчезает...
Надо. Как минимум - aqua_hobby_info на название темы. Если не поможет - пойду на принцип. Сделаем.
UPD Код в посте позволяет голосовать за собственный коментарий.
Сейчас исправляю.UPD Это поведение по-умолччанию. Кроме того, так можно накрутить только одни голос. Так что пусть его будет. как есть. Отправлю в багрепорт.
Не стану создавать новую тему, расскажу здесь как отдавать виджет в comment.tpl.php отдельной переменной и как сделать для комментариев свой стиль оформления виджета.
1. Отделяем виджет от контента
В файле модуля ищем переменную vote_up_down_comment и заменяем на следующий код:
<?php
function vote_up_down_comment(&$comment, $op) {
switch ($op) {
case 'view':
if (variable_get('vote_up_down_widget_comment', 1)) {
$comment->comment = $comment->comment;
$comment->vud = theme("vote_up_down_widget_comm", $comment->cid, 'comment');
}
break;
}
}
?>
2. Копируем из файла модуля в theme.php функцию theme_vote_up_down_widget, переименовываем ее в [вашатема]_vote_up_down_widget_comm и настраиваем по вашему вкусу.
3. Теперь в файл comment.tpl.php виджет у нас передается в массиве $comment->vud.
Помещаем его в див
<?php
?>
4. Дальше, в CSS прописываем перекрывающие стили:
background: url(comm_up_act.gif) no-repeat 0px 0px;
}
.commvote .vote-up-inact, .commvote .up-inact {
background: url(comm_up_inact.gif) no-repeat 0px 0px;
}
.commvote .vote-down-act, .commvote .vote-down-inact:hover {
background: url(comm_down_act.gif) no-repeat 0px 0px;
}
.commvote .vote-down-inact, .commvote .down-inact {
background: url(comm_down_inact.gif) no-repeat 0px 0px;
}
.commvote .vote-up-act, .commvote .vote-up-inact, .commvote .vote-down-act, .commvote .vote-down-inact, .commvote .up-inact, .commvote .down-inact {
display: block;
text-decoration: none;
width: 14px;
height: 14px;
float: left;
margin: 0 0.2em;
}
В этом примере я заменил картинки вверх-вниз на свои.
То что получилось, можете увидеть в прикрепленном файле.
Вопросы по модулю такие:
1. Как поправить глюк, когда при положительном голосовании за запись с -5 пойнтами, счетчик обнуляется?
2. Как сделать, что бы нельзя было голосовать за себя?
1. Пока не наблюдал. Как повторить?
2. Баг-репорт отправлен. http://drupal.org/node/218014 У кого есть патч - пишите туда тоже. Будет время, возможно напишу патч.
bnku, Ваш "замыленный" текст легко читается. Примите к сведению.
fasdalf, у меня такой воапрос:
После применения Ваших изменений результат голосования виден только после полного релоада страницы, как пофиксить?
В настройках Voting API, как и раньше
Vote tallying:
(х) Tally results whenever a vote is cast
Любопытно. Голоса действительно не обновляются в IE и Opera. В FireFox голосование вызывает reload (там js выключен)
Пока подозрение пало на JS - роясь в нем.
Итак, ajax-скрипт меняет содержимое элемента с ID vote_points_XX
Так что с вводом голосов пришлось ещё раз поработать.
Во-первых вернул и переписал vote_up_down_points
$vote_result = votingapi_get_voting_result($type, $cid, 'points', variable_get('vote_up_down_tag', 'vote'), 'sum');
if ($nodelink) {
if ($vote_result) {
$output = array(
'title' => '<span id="vote_points_'. $cid .'" class="vote-points">'. ($vote_result->value) .'</span>',
'html' => TRUE
);
}
else {
$output = array(
'title' => '<span id="vote_points_'. $cid .'" class="vote-points">'. ('0') .'</span>',
'html' => TRUE
);
}
}
else {
if ($vote_result) {
$output = '<span id="vote_points_'. $cid .'" class="vote-points">'. $vote_result->value .'</span>';
}
else {
$output = '<span id="vote_points_'. $cid .'" class="vote-points">'. '0' .'</span>';
}
}
return $output;
}
Во-вторых заменил отрисовку голосов на видежете (vote_up_down_widget) с этого
$output .= '<span class="vote-points" title="'.t('points').'">'.$value.'</span>';
на это
$output .= theme('vote_up_down_points', $cid, $type);
А к phptemplate_variables приписал
$vars['links'] = preg_replace('/<li class="last vote_up_down_points">.*<\/li>/','', $vars['links']);
}
В самом конце, перед return $vars чтобы не было дублровангия голосов.
Так что фикс касается только phptemplate.php
P.S. Хорошо бы кнопку для
<code>
в этот БуЭдитор добавить.P.P.S. Спасибо за баг!
подскажите плз в какой переменной число голосов, чтоб можно было в theme_vote_up_down_widget добавить?
theme_vote_up_down_widget, строка 2
$vote_result = votingapi_get_voting_result($type, $cid, 'points', variable_get('vote_up_down_tag', 'vote'), 'sum');
Переменные $type и $cid передаются снаружи. В $vote_result->value отдается сумма голосов.
А у меня такая проблема: при нажатии на кнопки голосования, в исходник дублируются код, тем самым панелька голосов разбухает прямо на глазах, вокруг слоя вывода очков образуется подобная корка:
<span id="vote_points_4" class="vote-points">
<span id="vote_points_4" class="vote-points">
<span id="vote_points_4" class="vote-points">
<span id="vote_points_4" class="vote-points">
1 point
</span>
</span>
</span>
</span>
</span>
Голоса за статью, вывожу в функции theme_vote_up_down_widget() ,
посредством - $output .= theme('vote_up_down_points', $cid, $type);
Подскажите, пожалуйста - как можно исправить эффект дублирования слоев?
P.S кстати, интересным для меня показалось то, что если вместо
<span>
, в выводе кнопок голосавания, использовать<div>
, то кнопка голосования стает обычной ссылкой, у которой виден адрес, в этом случае при голосовании, пользователя перебрасывает на страницу голоса и мгновенно редиректет обратно (видимо, в этом случае AJAX бездействует при использовании<div>
).Насчет дублирования кода. В моем случае нужно было убрать все тэги из функции виджета очков и переместить их в функцию theme_vote_up_down_widget()
У меня вобще исчезло голосование после изменений template.php
p.s. начал с первого изменения
По поводу пропадения голосов.
Ещё раз замечу, что нужно также добавить к выводу нод и коментариев вывод переменной $vote_up_down_widget - отдельно от $content
вариант №21:
<?php print theme_vote_up_down_widget($node->vid, 'node'). theme_vote_up_down_points($node->vid, 'node') ?>
в node.tpl и<?php print theme_vote_up_down_widget($comment->cid, 'comment') . theme_vote_up_down_points($comment->cid, 'comment') ?>
в comment.tplдля исправления нужно шаменить в vote_up_down.module
$vote_result = votingapi_get_voting_result($type, $cid, 'points', variable_get('vote_up_down_tag', 'vote'), 'sum');
if ($nodelink) {
if ($vote_result) {
$output = array(
'title' => '<span id="vote_points_'. $cid .'" class="vote-points">'. format_plural($vote_result->value, '1 point', 'count points') .'</span>',
'html' => TRUE
);
}
else {
$output = array(
'title' => '<span id="vote_points_'. $cid .'" class="vote-points">'. t('0 points') .'</span>',
'html' => TRUE
);
}
}
//============================================= исправления ниже
else {
if ($vote_result) {
$output = format_plural($vote_result->value, '1 point', 'count points') ;
}
else {
$output = t('0 points');
}
}
//============================================= /исправления ниже
return $output;
}
Что-то не получается...после манипуляций с темплате.пхп ничего не появляется.
Если можно, для тех кто ничего не понимает, по полочкам конечный вариант и куда и как выводить.
Если не затруднит, конечно...