Vote up/down - Не голосовать за свои материалы - предлагаю код

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

Аватар пользователя dmgorsky@drupal.org dmgorsky@drupal.org 31 мая 2010 в 14:30

Добрый день всем.
На днях задумался, почему же vote up/down по-прежнему позволяет голосовать за "свои" материалы и не имеет соответствующей настройки.
На скорую руку изменил код vud_node.module (использовал последнюю версию 6.x-2.x-dev).
Прошу уважаемое сообщество протестировать, предложить свои варианты кода - и тогда отправим это автору модуля.

1) В функцию function vud_node_admin_settings() {
добавил настройку:

$form['vud_node_widget_vote_on_own'] = array(
    '#type'          => 'checkbox',
    '#title'         => t('Voting on own nodes/comments'),
    '#description'   => t('Do you want to allow user voting on own nodes/comments?'),
    '#default_value' => variable_get('vud_node_widget_vote_on_own', FALSE),
  );

2) В функцию function vud_node_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
после if (($can_edit=user_access('use vote up/down on nodes')) || user_access('view vote up/down count on nodes')) {
добавил:

global $user;
$can_vote_on_own = (bool)variable_get('vud_node_widget_vote_on_own', FALSE);
$can_vote_on_this = ($node->uid != $user->uid) || $can_vote_on_own;

3) в switch ($widget_showmode) {
дописал переменную $can_vote_on_this:

case VUD_NODE_DISPLAY_TEASER_ONLY:
              if ($teaser == 1) {
                $node->content['vud_node_widget_display'] = array(
                  '#value' => theme(vud_theme_functions('vud_widget', 'node', $node->nid), $node->nid, 'node', $tag, $widget, !$vote_on_teaser || !$can_edit /* <DmGorsky> */ || !$can_vote_on_this /* </DmGorsky> */),
                  '#weight' => -10,
                );
              }
              break;
            case VUD_NODE_DISPLAY_FULL_ONLY:
              if ($teaser == 0) {
                $node->content['vud_node_widget_display'] = array(
                  '#value' => theme(vud_theme_functions('vud_widget', 'node', $node->nid), $node->nid, 'node', $tag, $widget, !$can_edit /* <DmGorsky> */ || !$can_vote_on_this /* </DmGorsky> */),
                  '#weight' => -10,
                );
              }
              break;
            case VUD_NODE_DISPLAY_BOTH:
              if ($teaser == 1) {
                $readonly = !$vote_on_teaser || !$can_edit /* <DmGorsky> */ || !$can_vote_on_this /* </DmGorsky> */;
              }
              else {
                $readonly = !$can_edit /* <DmGorsky> */ || !$can_vote_on_this /* </DmGorsky> */;
              }
              $node->content['vud_node_widget_display'] = array(
                '#value' => theme(vud_theme_functions('vud_widget', 'node', $node->nid), $node->nid, 'node', $tag, $widget, $readonly),
                '#weight' => -10,
              );
              break;

4) в if (!$can_edit) {
добавил:

if (!$can_edit) {
            $widget_message = t('You are not allowed to vote.');
          }
          elseif (!$vote_on_teaser) {
            $widget_message = t('Please go to full version of this content to vote.');
          }
          /* <DmGorsky> */
          if (!$can_vote_on_own) {
            $widget_message = t('You can not vote on your own content.');
          }
          /* </DmGorsky> */

5) похожий код добавил в функцию function vud_node_link($type, $object, $teaser = FALSE) {

Образец - во вложении, изменения окружены комментарием с тэгом.

Комментарии

Аватар пользователя Sinkora Sinkora 31 мая 2010 в 15:54

А можно просто не выводить в шаблоне виджет для автора ноды:

  if ($user->uid != $node->uid) {
    print theme('vote_up_down_widget', $node->nid, 'node');
  }
  else {
    print t('Rating: ') . theme('vote_up_down_points', $node->nid, 'node');
  }
Аватар пользователя Sinkora Sinkora 31 мая 2010 в 16:58

В этом модуле есть проблема с лишними запросами при отключенном голосовании за комменты. Изменилось ли что-то в последней версии?

function vote_up_down_preprocess_comment(&$variables) {
  if (user_access('view up/down votes')) {
    $comment = $variables['comment'];
    if ($comment->cid) {
      $style = variable_get('vote_up_down_widget_style_comment', 0) == 1 ? '_alt' : '';
      $variables['vote_up_down'] = theme("vote_up_down_widget$style", $comment->cid, 'comment');
    }
  }
}

Так вот он проверяет на наличие user_access('view up/down votes'). И если мы не используем голосование комментов, модуль все равно будет вызывать виджет theme("vote_up_down_widget$style", $comment->cid, 'comment').

Т.е. правильнее было бы добавить еще одно разрешение user_access('view up/down votes on comments'), и через него проверять в хуке hook_comment...

Аватар пользователя Sinkora Sinkora 1 июня 2010 в 14:22

"<a href="mailto:dmgorsky@drupal.org">dmgorsky@drupal.org</a>" wrote:
Ну, хотелось бы видеть текущий рейтинг материала

Он увидит. Виджет theme('vote_up_down_points', $node->nid, 'node'); как раз и выводит баллы.

if ($user->uid != $node->uid) {
    print theme('vote_up_down_widget', $node->nid, 'node');
  }
  else {
    // Автор материала увидит текущий рейтинг:
    print t('Rating: ') . theme('vote_up_down_points', $node->nid, 'node');
  }
Аватар пользователя iNFerNo iNFerNo 16 июня 2010 в 14:04

Это куда вставить?

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

Смысл вообще голосовать за свои материалы авторам?

Аватар пользователя Sinkora Sinkora 16 июня 2010 в 15:00

"iNFerNo" wrote:
Это куда вставить?

Что вставить? Мой код? Вставляй в шаблон узла. Но предварительно отключи в админке вывод стандартных виджетов. Т.е. мы будем сами выводить виджеты в нужном месте.

Аватар пользователя iNFerNo iNFerNo 30 июня 2010 в 11:25

Не подскажете, почему у меня не выводятся виджеты при "Но предварительно отключи в админке вывод стандартных виджетов".

Может выключаю что-то не так. Можно пояснить немного с выключением.

Аватар пользователя iNFerNo iNFerNo 30 июня 2010 в 12:17

новая версия модуля вышла но там все еще не реализована фича чтобы за свой комент или ноду не голосовать...