Снипет: вывод пользователей добавивших хотя бы один из видов нод (page, forum) в порядке убывания

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

Аватар пользователя Valeratal Valeratal 6 ноября 2008 в 12:29

собственно сабж. Хочу вывести пользователй, которые добавили хотя бы одну статью или запись в блоге. (типа "наши авторы")

есть похожий снипет, но он выводит топ 10 добавивших ноды любого рода

$users = db_query("SELECT COUNT(nid) AS count, {users}.uid, {users}.name FROM {node} LEFT JOIN {users} ON {node}.uid = {users}.uid WHERE {node}.uid != 0 GROUP BY uid ORDER BY count DESC LIMIT 10");
while ($user = db_fetch_object($users)) {
    print "<ul> <a href=\"/user/".$user->uid."\">".$user->name."</a> </ul>";
}

Комментарии

Аватар пользователя Nikit Nikit 6 ноября 2008 в 15:11

p.s.
Вместо href используйте l($user->name, '/user/' . $user->uid);
Незнаю как в mysql (в её тонкостях не дока), но это точно сработает в mysql 5, в 4-ке кто проверит?
Не рекомендую использовать занятые слова вместо названий полей (count), также желательно иногда использовать алиасы, код читается получше. Да и перевод каретки в нужных местах не помешает.

Аватар пользователя olk olk 6 ноября 2008 в 17:23

<?php
$tp = array('page','blog','forum'); // типы по которым нужны лучшие авторы
$maxcount = 10; // ограничение на количество выводимых авторов (на каждый тип)
foreach($tp as $key => $value) {
$result = db_query_range(db_rewrite_sql("
SELECT COUNT(nid) AS count_1, u.uid, u.name
FROM {node} n
INNER JOIN {users} u ON n.uid = u.uid
WHERE n.uid != 0 AND n.type='%s'
GROUP BY u.uid, u.name
HAVING COUNT(nid)>0
ORDER BY COUNT(nid) DESC,u.name"),$value,0,$maxcount);
$items = array();
while ($u = db_fetch_object($result)) {
$u->name .= ' ('.$u->count_1.')';
$items[] = theme('username',$u);
}
if ( count($items) ) {
echo ''.t($value).'
';
echo theme('item_list',$items);
}
}
?>

Аватар пользователя a.mohax a.mohax 7 ноября 2008 в 9:02

olk
Как сделать, чтобы вместо типов матерьялов отображалось имя типа матерьяла?

Например у меня есть тип матерьяла "games" с именем "Игры". А снипет выводит "games" вместо его имени "Игры".

Аватар пользователя olk olk 10 ноября 2015 в 11:45

По идее если сделан перевод, то должен выводиться переведенный вариат (так как вывод $value заключен в функцию t(...))

ps. кстати HAVING там не нужен так как применен INNER JOIN, т.е. код может выглядеть так
$tp = array('page','blog','forum'); // типы по которым нужны лучшие авторы
$maxcount = 10; // ограничение на количество выводимых авторов (на каждый тип)
foreach($tp as $key => $value) {
$result = db_query_range(db_rewrite_sql("
SELECT COUNT(nid) AS count_1, u.uid, u.name
FROM {node} n
INNER JOIN {users} u ON n.uid = u.uid
WHERE n.uid != 0 AND n.type='%s'
GROUP BY u.uid, u.name
ORDER BY COUNT(nid) DESC,u.name"),$value,0,$maxcount);
$items = array();
while ($u = db_fetch_object($result)) {
$u->name .= ' ('.$u->count_1.')';
$items[] = theme('username',$u);
}
if ( count($items) ) {
echo ''.t($value).'
';
echo theme('item_list',$items);
}
}
?>

Аватар пользователя olk olk 7 ноября 2008 в 12:20

Ну можете добавить в сниппет свой ручной перевод, что нибудь типа
<?php
if ( count($items) ) {
switch ($value) {
case 'games':
$value_ru = 'Игры';
break;
// здесь кэйсы для остальных типов
default:
$value_ru = t($value);
}
echo ''.$value_ru.'
';
echo theme('item_list',$items);
}
?>

Еще как вариант можно задать перевод прямо в массиве типов, и использовать ключ массива как фильтр в селекте, а значение как выводимый аргумент
<?php
// типы по которым нужны лучшие авторы
$tp = array(
'page' => 'Страница',
'blog' => 'Дневник',
'forum' => 'Форум'
);
$maxcount = 10; // ограничение на количество выводимых авторов (на каждый тип)
foreach($tp as $key => $value) {
$result = db_query_range(db_rewrite_sql("
SELECT COUNT(nid) AS count_1, u.uid, u.name
FROM {node} n
INNER JOIN {users} u ON n.uid = u.uid
WHERE n.uid != 0 AND n.type='%s'
GROUP BY u.uid, u.name
ORDER BY COUNT(nid) DESC,u.name"),$key,0,$maxcount);
$items = array();
while ($u = db_fetch_object($result)) {
$u->name .= ' ('.$u->count_1.')';
$items[] = theme('username',$u);
}
if ( count($items) ) {
echo ''.$value.'
';
echo theme('item_list',$items);
}
}
?>