Доброго времени суток. Пытаюсь сделать блок, в котором будет выводиться 10 пользователей по количеству созданных блогов. Выглядеть это должно примерно так:
пользователь: | созданных блогов:
пользователь 1 | 74
пользователь 2 | 36
пользователь 3 | 19
пользователь 4 | 14
пользователь 5 | 6
...
Пытался сделать как показано тут, но выдает ошибки. Хотелось узнать можно ли и если можно, то как сделать это с помощью вьюс.
Еще интересует можно ли добавить в профиль количество созданных блогов (стоит модуль profile2).
Буду благодарен любой помощи.
Комментарии
up
up
Проблема все еще актуальна
1. Свой запрос к БД + вывод в блок
2. Темизация профиля
Пробовал этот код, но не работает. Самому написать код не хватает знаний, может можно сделать как нибудь иначе, не через бд?
Все данные хранятся именно в БД, так что его обойти не получится.
Давайте тогда попробуем решить по другому. Напишите ошибку, которую выдает код, который вы ввели, а мы попробуем исправить.
Recoverable fatal error: Argument 4 passed to db_query_range() must be an array, integer given, called in Z:\home\site\www\modules\php\php.module(80) : eval()'d code on line 8 and defined в функции db_query_range() (строка 2345 в файле Z:\home\site\www\includes\database\database.inc).
Как я понял-ругается на "db_query_range()"
Не правильно поняли. Ругается что переданный на обработку аргумент не является массивом, а должен бы. А вместо этого передано целое число.
Покажите за одно весь код.
А понял
вы делаете для 7-ки, а берете код от 6-ки. Вот у вас и ошибка. Давайте просто портируем код.
Сейчас перепишу запрос под 7-ку.
Попробуйте этот:
<?php
$query = db_select('votingapi_vote', 'v');
$query->innerJoin('users','u','u.uid = v.content_id');
$query->condition('v.content_type', 'user');
$query->condition('v.value', 0, '>');
$query->fields('u',array('name','uid'));
$query->fields('v',array('value'));
$query->range(0, 10); $results = $query->execute(); $list = array();
foreach (
$result as $user) {$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);
?>
Пока пытался сделать наткнулся на эту статью. Как я понял будет это выглядеть как показано на картинке, но при установке модуля он просто не выводит блок. Очень хотелось бы разобраться чтобы блок выводился и все выглядело как на картинке.
Все равно выдает ошибку:
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'v.content_type' in 'where clause': SELECT u.name AS name, u.uid AS uid, v.value AS value FROM {votingapi_vote} v INNER JOIN {users} u ON u.uid = v.content_id WHERE (v.content_type = :db_condition_placeholder_0) AND (v.value > :db_condition_placeholder_1) LIMIT 10 OFFSET 0; Array ( [:db_condition_placeholder_0] => user [:db_condition_placeholder_1] => 0 ) в функции eval() (строка 10 в файле Z:\home\site\www\modules\php\php.module(80) : eval()'d code).
Ну дык я не вижу перед собой базу, если бы вы зашли в phpmyadmin и скопировали бы структуру таблицы votingapi_vote, было бы легче.
попробуйте закомментить строчку:
<?php
$query->condition('v.content_type', 'user');
?>
Так а еще я просмотрел что у вас совсем другая задача.
"количеству созданных блогов", а вы привели код "топ по голосам".
эх, без доступа к базе, наверное не помогу.
Второй пример что вы привели, это просто подсчет по созданным материалам.
Если вас это устроит, можете использовать его.
А вы блок установили где выводить?
Надо сделать экспорт этой таблицы?
Да
<?php
$query = db_select('node', 'n');
$query->innerJoin('users','u','u.uid = n.uid');
$query->condition('n.type', 'blog');
$query->fields('u',array('name','uid'));
$query->addExpression('count(n.nid)', 'count');
$query->range(0, 10); $result = $query->execute(); $list = array();
foreach (
$result as $user) {$list[] = l($user->name,"user/$user->uid"). " ($user->count)";
}
return theme('item_list', array('items' => $list));
?>
Создал у себя на сайте блоги и написал код, держите.
Вам останется допилить строчку: return theme('item_list', array('items' => $list));
Добавив классы для темизации. И потом написать CSS ко всему.
Или можете изменить массив $list, как на втором примере, решать вам.
Забыл порядок:
$query->orderBy('count','DESC');
перед execute() вставлять.
Почему то выводит только админа и присваивает ему все созданные блоги, даже те, которые создали другие пользователи.
да, я мог ошибиться, сейчас проверю и поправлю.
Вот правильный запрос:
<?php
$query = db_select('node', 'n');
$query->innerJoin('users','u','u.uid = n.uid');
$query->condition('n.type', 'blog');
$query->fields('u',array('name','uid'));
$query->addExpression('count(n.nid)', 'count');
$query->groupby('u.name');
$query->orderby('count','DESC');
$query->range(0, 10);
?>
Все работает! Спасибо вам огромное.
По поводу темизации профиля, это надо создать файл user-profile.tpl.php в папке с темой (templates)и там уже писать код, на отображение количество созданных блогов пользователем?
Примерно так.
Запрос только нужно будет изменить.
То есть опять делать через бд?
Само собой, информация об этом только там, кстати это можно сделать и с помощью views
Выбрать количество нод типа блог, которые создал текущий пользователь.
Думаю справитесь.
Буду делать через вьюс, если не получится, то попробую через бд. Спасибо еще раз.