Всем привет. Нужно сделать такую весчь, подскажите пожалуйста: надо что-бы в зависимости от того, какими правами на сайте обладает пользователь, цвет его имени в коментариях менялся. Например если пишет админ, то красный, обычный пользователь, зеленый. Может есть какой модуль?
Комментарии
Как вариант написать функцию по определению рои пользователя, template.php, и вызывать в нужном *.tpl.php перед выводом имени пользователя. Функция возвращает например тег
<DIV class="role">
?, где "role" - роль пользователя. В CSS соответственно прописываем описание для .roleНабросал небольшую функцию, у меня заработало.
Вствляем функцию в template.php
$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 ищем
<span class="submitted"><?php print $submitted; ?></span>
<?php endif; ?>
И меняем на
<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 как нам нужно, и радуемся
ЗЫ: Спасибо vadbars@drupal.org (http://www.drupal.ru/node/10451)
я б на вашем месте копал функцию theme_username, в которой можно было бы добавить класс для тэга "a", например "a class="user role-1" - не надо будет ковырять node.tpl.php, юзернейм будет иметь единый стиль по всему сайту. К тому же, учтите такой нюанс - функция user_load не имеет статического кэша, каждый вызов вашей user_role будет сопровождаться глобальным вызовом hook_user и как следствие несколькими запросами в БД, теперь представьте как это скажется на производительности , если вы откроете страницу новостей с десятком нодов с полем submitted.
Добавлю что в theme_username в class надо ставить сразу все роли пользователя через пробел, их у него может быть несколько. А определять какая из них перекрывает какую можно последовательностью правил СSS.
Век живи -век учись.
Вот это вставить в template.php
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;
}
опять user_load тогда уж static используйте, мой вам совет. Имя пользователя это такая штука, которая может выводится десятки раз на некоторых страницах, но если у вас такие случаи исключены тогда да.
Ну и по мелочам:)
'class' => t($r)
вы собираетесь переводить полученный класс через фичу "переводы интерфейса" ?
Ну я больше не придумал, как выцепить роль зная uid... Вообще-то написал первое, что в голову пришло.
Да... туплю немного...
а топикстартер что скажет?
вот набросал собственный вариант
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];
}
Отличное решение, на мой взгляд.
Пожалуй можно поставить [РЕШЕНО] в тему.