Переделала вывод виджета vote up/down

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

Аватар пользователя Geldora Geldora 3 мая 2008 в 18:50

Здравствуйте! Вчера я переделала под себя вывод виджета vote up/down и решила пделиться с сообществом тем, что получилось в итоге.
Вообще, задача стояла так - чтобы можно бало голосовать вверх вниз и при этом количество баллов отоброжалось где-нибудь не в ссылкх (внизу), а как-нибудь рядом с виджетом голосования. Сначала хотела просто извлечь количество очков из ссылок, но потом увлеклась, и добавила в темплйт.пхп такой код:

function mytheme_vote_up_down_widget_alt($cid, $type) {
  global $user;
  if (user_access('view up-down vote')) {
    $output = '<div class="vote-up-down-widget">';
    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 .= theme('vote_up_down_points_alt', $cid, $type);
      $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>';
    }
    else {
      $output .= '<span class="up-inact" title="'. t('You must login to vote.') .'"></span>';
      $output .= theme('vote_up_down_points_alt', $cid, $type);
      $output .= '<span class="down-inact" title="'. t('You must login to vote.') .'"></span>';
    }
    $output .= '</div>';
    return $output;
  }
}

function mytheme_vote_up_down_points_alt($cid, $type) {
  $vote_result = votingapi_get_voting_result($type, $cid, 'points', variable_get('vote_up_down_tag', 'vote'), 'sum');
  if ($vote_result->value < 0) {
    $output = '<div id="vote_points_'. $cid .'" class="vote-points-low">'. $vote_result->value .'</div>';
  }
  else if ($vote_result) {
    $output = '<div id="vote_points_'. $cid .'" class="vote-points">'. $vote_result->value .'</div>';
  }
  else {
    $output = '<div id="vote_points_'. $cid .'" class="vote-points">0' .'</div>';
}
 
  return $output;
}

Я просто взяла из самого модуля и немного поменяла строчки местами - смешала обычгую форму и альтернативную. В процессп придумала вставить баллы между кнопками вверх и вниз, причем когда стала тестировать, оказалось, что если количество очков меньше нуля, из-за минуса смещается отображение, поэтому добавила класс "vote-points-low".
Код работает, если в настройках модуля отключить отображение виджета и ссылок, а тип виджета вырать альтернативный.
В принципе этого было дсотаточно, но я хотела чтобы виджет оторажался в нужном мне месте, а не как по дефолту, поэтому вставила в темплейт.пхп код, идущий "в комплекте" с модулем. После этого, виджет появился во всех нодах - даже в тех которые не были выбраныв настройках модуля. Пришлось сделать отдельный node_nodetype.tpl.php - скопировала со стандартного ноде.тпл и вставила в нужное место код <?php print $vote_up_down_widget ?>
То что получилось, можно посмотреть на http://www.uchi.kz/rating, а теперь о том что не получилось:

1. Я убрала слово "points" из кода, однако при голосовании оно все равно появляется... Ничего страшного, конечно, но смотрится некрасиво. При перезагрузке страницы все становится нормально, т.е. без текста, только цифра. Я не смогла ни убрать это слово, ни даже перевести его. Так и не поняла, откуда оно берется Sad
2. То ли от-того что переделала виджет, то ли что-то другое, но вьювс весьма странно отображает рейтинг. Особенно ярко это видно при попытке построить "обратный" рейтинг - http://www.uchi.kz/rating_worst Можете ли обяъснить, как нужно использовать вьювс, какие критерии сортировки использовать?
3. Сильно не хватает статистики типа - проголосовало столько-то, в плюс - столькото, в минус - столько. Кто-нибудь делал статистику такого рода для vote up/down, если да - расскажите, пож-ста как?

Комментарии

Аватар пользователя Geldora Geldora 3 мая 2008 в 19:27

Да, кстати, я насчет этого тоже хотела тему создать, попросить помощи. Потому что там тоже сниппет, я его копипастнула, а переделать сама не могу, я бы вообще имя пользователя сделала ссылкой на ваш аккаунт.
UPD - поправила! Оказалось все не так сложно, как казалось!

Аватар пользователя Geldora Geldora 4 мая 2008 в 14:58

Разобралась с вьювсами.
Если хочется строить рейтинг по отображаемым в виджете голосам - нужно использовать критерий VotingAPI points vote result (sum)
Тогда все строится правильно.

Осталось найти возможность подключать статистику типа - проголосовало N человек, проголовало в минус, проголовало в плюс... Никто не делал такое? Поделитесь!

Аватар пользователя argon argon 11 мая 2008 в 23:32

http://drupaldance.com/sites/venividi - посмотрите здесь

neochief
2008.04.05 16:20

Сначала выключаете любой вывод виджетов vote_up_down в настройках модуля. Потом, в шаблоне ноды, в нужном месте вставляете.
<?php print(theme("vote_up_down_widget", $node->nid, 'node')); ?>
<?php print(theme("vote_up_down_points", $node->nid, 'node')); ?>

Аватар пользователя T-34 T-34 12 мая 2008 в 10:23

Попробовал сделать как вы написали, но виджет не выводится.

Что делал:
1. добавил код в template.php
2. в настройках модуля отключить отображение виджета и ссылок, а тип виджета вырать альтернативный
- в результате виджет не отображается

3. "вставила в темплейт.пхп код, идущий "в комплекте" с модулем" - выложите, пожалуйста, измененную function _phptemplate_variables, сам ниасилил.

Аватар пользователя Geldora Geldora 13 мая 2008 в 19:32

T-34 wrote:
выложите, пожалуйста, измененную function _phptemplate_variables, сам ниасилил.

На самом деле, я в пхп ни бум-бум, просто действовала по аналогии и методом научного тыка... Вот код кот. я использовала, только пришлось изменить, потому что у меня эта функция использвуется несколько раз, так что я не знаю, подойдет ли он вам.

   
function _phptemplate_variables($hook, $vars = array())
 switch($hook) {
    case 'node':
      $vars['storylink_url'] = check_url($vars['node']->vote_storylink_url);
      if (arg(1) != 'add' && arg(2) != 'edit') {
        $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');
        $vars['vote_up_down_points'] = theme("vote_up_down_points$style", $vars['node']->nid, 'node');
      }
      $vars['vote_storylink_via'] = theme('vote_storylink_via', $vars['node']->vote_storylink_url);
      if (arg(1) == 'top') {
        static $count;
        $count = is_array($count) ? $count : array();
        $count[$hook] = is_int($count[$hook]) ? $count[$hook] : 1;
        $vars['seqid'] = $count[$hook]++;
      }
      break;
  }
  return $vars;
}

www.uchi.kz

Аватар пользователя Geldora Geldora 13 мая 2008 в 12:36

chilly_bang wrote:
ваш сайт упал, что ли? пустую страницу показывает.

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

Аватар пользователя T-34 T-34 14 мая 2008 в 15:00

Остается еще сделать так, чтобы ссылка Reset vote показывалась только проголосовавшим Smile
В vote_up_down.module нужно добавить условие в 257 строке, как я понял... остается найти условие