Цвет имени пользователя

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

Аватар пользователя S_anches S_anches 24 ноября 2009 в 14:31

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

Комментарии

Аватар пользователя validoll validoll 24 ноября 2009 в 15:24

Как вариант написать функцию по определению рои пользователя, template.php, и вызывать в нужном *.tpl.php перед выводом имени пользователя. Функция возвращает например тег <DIV class="role">?, где "role" - роль пользователя. В CSS соответственно прописываем описание для .role

Аватар пользователя validoll validoll 25 ноября 2009 в 22:57

Набросал небольшую функцию, у меня заработало.

Вствляем функцию в template.php

function user_role($node) {
$u=array('uid' => $node->uid, 'name' => $node->name);
$user = user_load($u);
        if ($user->uid==1) return '<div class="super user">';
        if ($user->roles[2]) return '<div class="auth user">';
        if ($user->roles[3]) return '<div class="moder user">';
}

Затем в node.tpl.php ищем

  <?php if ($submitted): ?>
    <span class="submitted"><?php print $submitted; ?></span>
  <?php endif; ?>

И меняем на

 <?php if ($submitted): ?>
    <span class="submitted"><?php print format_date($node->created, 'custom', "d F Y │.") . ' ' . user_role($node).theme('username', $node).'</div>' . t(' report '); ?></span>
  <?php endif; ?>

Правим CSS как нам нужно, и радуемся Smile

ЗЫ: Спасибо vadbars@drupal.org (http://www.drupal.ru/node/10451)

Аватар пользователя kosilko kosilko 24 ноября 2009 в 17:19

я б на вашем месте копал функцию theme_username, в которой можно было бы добавить класс для тэга "a", например "a class="user role-1" - не надо будет ковырять node.tpl.php, юзернейм будет иметь единый стиль по всему сайту. К тому же, учтите такой нюанс - функция user_load не имеет статического кэша, каждый вызов вашей user_role будет сопровождаться глобальным вызовом hook_user и как следствие несколькими запросами в БД, теперь представьте как это скажется на производительности , если вы откроете страницу новостей с десятком нодов с полем submitted.

Аватар пользователя direqtor direqtor 24 ноября 2009 в 18:24

Добавлю что в theme_username в class надо ставить сразу все роли пользователя через пробел, их у него может быть несколько. А определять какая из них перекрывает какую можно последовательностью правил СSS.

Аватар пользователя validoll validoll 25 ноября 2009 в 22:56

Век живи -век учись.
Вот это вставить в template.php

function phptemplate_username($object) {

  if ($object->uid && $object->name) {
    // Shorten the name when it is too long or it will break many tables.
    if (drupal_strlen($object->name) > 20) {
      $name = drupal_substr($object->name, 0, 15) .'...';
    }
    else {
      $name = $object->name;
    }
    if (user_access('access user profiles')) {
          $user = user_load(array('uid' => $object->uid, 'name' => $object->name));
          unset($r);
          $r= 'user ';
          foreach (array_keys($user->roles) as $role) {
            $r .= 'role-'.$role.' ';
          }
      $output = l($name, 'user/'. $object->uid, array('attributes' => array('title' => t('View user profile.'), 'class' => $r)));
    }
    else {
      $output = check_plain($name);
    }
  }
  else if ($object->name) {
    // Sometimes modules display content composed by people who are
    // not registered members of the site (e.g. mailing list or news
    // aggregator modules). This clause enables modules to display
    // the true author of the content.
    if ($object->homepage) {
      $output = l($object->name, $object->homepage, array('rel' => 'external nofollow'));
    }
    else {
      $output = check_plain($object->name);
    }

   
    $output .= ' ('. t('not verified') .')';
  }
  else {
    $output = variable_get('anonymous', t('Anonymous'));
  }
  return $output;
}

Аватар пользователя kosilko kosilko 25 ноября 2009 в 12:08

опять user_load Lol тогда уж static используйте, мой вам совет. Имя пользователя это такая штука, которая может выводится десятки раз на некоторых страницах, но если у вас такие случаи исключены тогда да.

Ну и по мелочам:)
'class' => t($r)
вы собираетесь переводить полученный класс через фичу "переводы интерфейса" Shok ?

Аватар пользователя validoll validoll 25 ноября 2009 в 14:35

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

"kosilko" wrote:
'class' => t($r)

Да... туплю немного...

Smile а топикстартер что скажет?

Аватар пользователя kosilko kosilko 25 ноября 2009 в 16:33

вот набросал собственный вариант

function phptemplate_username($object) {
 static $users = array();
 /*используем внутренний кэш. Все что в оригинале называлось $output,
 теперь будет как $users[$object->uid][$object->name]*/

 
 
 if (!isset($users[$object->uid][$object->name])) {
  /* если в кеше такового нет, то делаем всё.
  Если уже есть, то тупо возврашаем готовенькое (см. return в самом конце)*/

 
  if ($object->uid && $object->name) {
   if (drupal_strlen($object->name) > 20) {
    $name = drupal_substr($object->name, 0, 15) .'...';
   }
   else {
    $name = $object->name;
   }
   if (user_access('access user profiles')) {
    if (!isset($object->roles) || !is_array($object->roles)) {
     /* если на вход функции пришел не полный объект типа user (без массива roles),
     то тогда уж проходим нижеследующие операции*/

     
     $object->roles = array();
     
     if ($object->uid == 1) {
     // если uid = 1 то это админ, смысла лезть в таблицу users_roles никакого
     
      $object->roles['admin'] = 'admin';
     } else {
     // иначе, смотрим в БД какие роли есть у юзера. Один простой запрос вместо вызова тяжелого user_load()
      if ($r = db_query('SELECT * FROM {users_roles} WHERE uid = %d', $object->uid)) {
       while ($rs = db_fetch_object($r)) {
        $object->roles[$rs->rid] =  $rs->rid;
       }
      }      
     }
    }

    $attributes = array(
     'title' => t('View user profile.'),
     'class' => 'username',
    );
    foreach ($object->roles as $role => $val) {
     $attributes['class'] .= ' role-'.$role;
    }

    /* здесь и далее -
    оперируем с кэшем $users[$object->uid][$object->name]
    вместо оригинальной $output.*/

    $users[$object->uid][$object->name] = l($name, 'user/'. $object->uid, array('attributes' => $attributes));
   }
   else {
    $users[$object->uid][$object->name] = check_plain($name);
   }
  }
  else if ($object->name) {
   if ($object->homepage) {
    $users[$object->uid][$object->name] = l($object->name, $object->homepage, array('rel' => 'external nofollow', 'attributes' => array('class' => 'username')));
   }
   else {
    $users[$object->uid][$object->name] = '<span class="username">'.check_plain($object->name).'</span>';
   }
   $users[$object->uid][$object->name] .= ' ('. t('not verified') .')';
  }
  else {
   $users[$object->uid][$object->name] = '<span class="username">'.variable_get('anonymous', t('Anonymous')).'</span>';
  }
 }
 return $users[$object->uid][$object->name];
}