Переезд Vote Up/Down к заголовку

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

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 3 февраля 2008 в 16:53

На ***цатый день вместо Fivestar я поставил Vote Up/Down и понял, что он лучше. Но не был он идеален – не увидел я суммы голосов под нодой, ибо искал их на самом виджете. Альтернативный виджет не порадовал меня, ибо не дает возможности ругать посты и комменты. Так выбор пал на темизацию оригинальной голосовалки.

В модуле нашлись функции theme_vote_up_down_widget и theme_vote_up_down_points.
В template.php добавились функции

function aqua_hobby_info_vote_up_down_widget($cid, $type) {
  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

.vote-up-down-widget{
  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

  // Vote_up_Down 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

Комментарии

Аватар пользователя argon argon 5 февраля 2008 в 9:23

Хм... действуя по инструкции результата не добился... ничего переименовывать не надо? новый видж не появляется, старый не исчезает...

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 5 февраля 2008 в 13:07

UPD Код в посте позволяет голосовать за собственный коментарий. Сейчас исправляю.
UPD Это поведение по-умолччанию. Кроме того, так можно накрутить только одни голос. Так что пусть его будет. как есть. Отправлю в багрепорт.

Аватар пользователя bnku bnku 6 февраля 2008 в 12:07

Не стану создавать новую тему, расскажу здесь как отдавать виджет в 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

<?echo $comment->vud ? >

?>

4. Дальше, в CSS прописываем перекрывающие стили:

.commvote .vote-up-act, .commvote .vote-up-inact:hover {
  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;
}

В этом примере я заменил картинки вверх-вниз на свои.
То что получилось, можете увидеть в прикрепленном файле.

Аватар пользователя bnku bnku 6 февраля 2008 в 12:11

Вопросы по модулю такие:
1. Как поправить глюк, когда при положительном голосовании за запись с -5 пойнтами, счетчик обнуляется?
2. Как сделать, что бы нельзя было голосовать за себя?

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 10 февраля 2008 в 12:22

1. Пока не наблюдал. Как повторить?
2. Баг-репорт отправлен. http://drupal.org/node/218014 У кого есть патч - пишите туда тоже. Будет время, возможно напишу патч.

bnku, Ваш "замыленный" текст легко читается. Примите к сведению.

Аватар пользователя lukevr lukevr 15 февраля 2008 в 6:34

fasdalf, у меня такой воапрос:

После применения Ваших изменений результат голосования виден только после полного релоада страницы, как пофиксить?
В настройках Voting API, как и раньше
Vote tallying:
(х) Tally results whenever a vote is cast

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 15 февраля 2008 в 10:45

Любопытно. Голоса действительно не обновляются в IE и Opera. В FireFox голосование вызывает reload (там js выключен)
Пока подозрение пало на JS - роясь в нем.

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 15 февраля 2008 в 13:23

Итак, ajax-скрипт меняет содержимое элемента с ID vote_points_XX
Так что с вводом голосов пришлось ещё раз поработать.

Во-первых вернул и переписал vote_up_down_points

function aqua_hobby_info_vote_up_down_points($cid, $type, $nodelink = FALSE) {
  $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 приписал

  if (isset($vars['links'])) {
    $vars['links'] = preg_replace('/<li class="last vote_up_down_points">.*<\/li>/','', $vars['links']);
  }

В самом конце, перед return $vars чтобы не было дублровангия голосов.

Так что фикс касается только phptemplate.php

P.S. Хорошо бы кнопку для <code> в этот БуЭдитор добавить.
P.P.S. Спасибо за баг!

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 16 февраля 2008 в 15:37

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 отдается сумма голосов.

Аватар пользователя 100kd 100kd 12 марта 2008 в 17:08

А у меня такая проблема: при нажатии на кнопки голосования, в исходник дублируются код, тем самым панелька голосов разбухает прямо на глазах, вокруг слоя вывода очков образуется подобная корка:

<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">
<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>).

Аватар пользователя 100kd 100kd 23 марта 2008 в 17:02

Насчет дублирования кода. В моем случае нужно было убрать все тэги из функции виджета очков и переместить их в функцию theme_vote_up_down_widget()

Аватар пользователя fasdalf@fasdalf.ru fasdalf@fasdalf.ru 10 апреля 2008 в 9:11

По поводу пропадения голосов.

Quote:
Так к переменным, доступным в node.tpl.php comment.tpl.php и page.tpl.php добавилась $vote_up_down_widget.

Ещё раз замечу, что нужно также добавить к выводу нод и коментариев вывод переменной $vote_up_down_widget - отдельно от $content

Аватар пользователя bodro bodro 12 апреля 2008 в 0:24

вариант №21:

  1. Убиваем в модуле функции vote_up_down_nodeapi, vote_up_down_comment и vote_up_down_link (удаляям строки 207 - 290 для версии 5.x-1.x-dev)
  2. тыкаем <?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
  3. Все
Аватар пользователя bodro bodro 12 апреля 2008 в 0:34
<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">
<span id="vote_points_4" class="vote-points">
1 point
</span>
</span>
</span>
</span>
</span>

для исправления нужно шаменить в vote_up_down.module

function theme_vote_up_down_points($cid, $type, $nodelink = FALSE) {
  $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;
}

Аватар пользователя enjoy enjoy 14 апреля 2008 в 12:31

Что-то не получается...после манипуляций с темплате.пхп ничего не появляется.
Если можно, для тех кто ничего не понимает, по полочкам конечный вариант и куда и как выводить.
Если не затруднит, конечно...