Может плохо искал, но ничего готового не нашел по данной теме. Сначала решил воспользоваться модулем views, т.к. он уже использовался в моем проекте, но данный модуль пока не умеет делать группировки. Нашел модуль views_groupby, который как видно из названия является дополнением к модулю views и добавляет одну группировочную функцию count(), которая мне то и нужна. Но. То ли модуль этот не доделанный, то ли у меня руки кривые, но никак не захотел он у меня делать группировку по ролям. Такое ощущение, что этот модуль справляется с группировкой, когда выборка идет из одной таблицы, а в нашем случае нам надо сделать выборку из трех таблиц: users, users_roles, role.
Поэтому пришлось написать небольшой модуль. Во первых делаем хук для определения собственного блока:
function alex_module_block($op = 'list', $delta = 0, $edit = array()) { switch ($op) { case 'list': $blocks = array(); $blocks[0]['info'] = 'Количество пользователей'; return $blocks; case 'view' : if ($delta == 0) { $blocks['subject'] = t('Statistics'); $blocks['content'] = _stat_block(); } } return $blocks; }
И собственно функция, в котрой делаем нужную нам выборку:
function _stat_block() { $result = '<div class="stat item-list"><ul>'; $query = "SELECT COUNT(*) AS number, r.name FROM {users} u INNER JOIN {users_roles} ur ON u.uid = ur.uid INNER JOIN {role} r ON r.rid = ur.rid WHERE ur.rid > 2 AND u.status = 1 GROUP BY ur.rid "; $queryResult = db_query($query); while ($item = db_fetch_array($queryResult)) { $result .= '<li class="leaf">'.$item['name'].': '.$item['number'].'</li>'; } $result .= '</ul></div>'; return $result; }
В запросе я поставил условие ur.rid > 2, чтобы не выводить в блоке такие роли как "anonymous user" и "authenticated user".
Отправить комментарий