Вывод десяти пользователей с наибольшей кармой, полученной модулем User Karma

Аватар пользователя Azs Azs 16 июля 2008 в 17:06

Долго искал, но, видимо в силу природной тупости, ничего не нашел. Изобразил сам, может пригодится кому:

$nblimit = 10;
$query = "SELECT {users}.name, {users}.uid, {votingapi_vote}.value
FROM {votingapi_vote} INNER JOIN {users} ON {votingapi_vote}.content_id = {users}.uid
WHERE {votingapi_vote}.content_type='"
. user ."' AND {votingapi_vote}.value >'". 0 ."'
ORDER BY {votingapi_vote}.value DESC
"
;
$result = db_query_range($query, 0, $nblimit);
print "<div id='user_list_' class='user_list'><ul>";
while ($user = db_fetch_object($result)) {
print "<li>".l($user->name,"user/$user->uid")." ($user->value)</li>";
}
print "</ul></div>";

Комментарии

Аватар пользователя neochief neochief 18 июля 2008 в 1:23

Ваш код, безусловно рабочий, но я предложу более совершенный вариант:

--------------------------------
$nblimit = 10;
$query = 'SELECT u.name, u.uid, v.value
FROM {votingapi_vote} v INNER JOIN {users} u ON v.content_id = u.uid
WHERE v.content_type="%s" AND v.value > %d
ORDER BY v.value DESC';

$result = db_query_range($query, array('user', 0), 0, $nblimit);

$list = array();
while ($user = db_fetch_object($result)) {
$list[] = l($user->name,"user/$user->uid")." ($user->value)";
}

$output = theme('item_list', $list, NULL, 'ul', array('id'=>'user_list_', 'class' => 'user_list'))
print($output);
----------------------------

Если воспользуетесь этим, то обратите внимание, что id и class теперь у элемента списка и стили надо будет немного поменять, если такие есть. Или же просто обрамить в див, как было в первоначальном варианте.

Во-вторых, SQL запрос не учитывает юзеров с нулевой кармой. Лично мне кажется, что это условие — лишнее.

В-третьих, print тоже здесь явно лишний, потому что в хорошем друпаловском коде print нужен только в файлах шаблонов, а, как мне кажется, это ним не является. Сделайте для своей штуки блок через hook_block(). Это будет более а) функциональным б) элегантным в) переносимым решением (хотя, наверное, и прийдется кое-в чем разобраться).

По теме, можно почитать мануал на русском к db_query_range(), а также theme_item_list()

Аватар пользователя AtrRax AtrRax 11 февраля 2009 в 3:11

"neochief" wrote:
Ваш код, безусловно рабочий, но я предложу более совершенный вариант:

--------------------------------
$nblimit = 10;
$query = 'SELECT u.name, u.uid, v.value
FROM {votingapi_vote} v INNER JOIN {users} u ON v.content_id = u.uid
WHERE v.content_type="%s" AND v.value > %d
ORDER BY v.value DESC';

$result = db_query_range($query, array('user', 0), 0, $nblimit);

$list = array();
while ($user = db_fetch_object($result)) {
$list[] = l($user->name,"user/$user->uid")." ($user->value)";
}

$output = theme('item_list', $list, NULL, 'ul', array('id'=>'user_list_', 'class' => 'user_list'))
print($output);

Я в этом не разбираюсь, а куда надо воткнуть этот код?

Аватар пользователя romach romach 22 февраля 2010 в 13:50

А как такое сделать в 6-ой версии Drupal, потому-что в ней предложенный код не работает?