/[drupal]/contributions/modules/invite/invite_stats.module
ViewVC logotype

Contents of /contributions/modules/invite/invite_stats.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.4 - (show annotations) (download) (as text)
Tue Sep 2 17:02:14 2008 UTC (14 months, 3 weeks ago) by smk
Branch: MAIN
CVS Tags: DRUPAL-6--2-0-ALPHA1, HEAD
Branch point for: DRUPAL-6--2
Changes since 1.3: +20 -2 lines
File MIME type: text/x-php
#219266 by jcfiala, wojtha, smk-ka: Port to D6.
1 <?php
2 // $Id: invite_stats.module,v 1.3 2008/08/20 13:26:12 smk Exp $
3
4 /**
5 * @file
6 * Displays some statistics about sent invitations.
7 */
8
9 /**
10 * Implementation of hook_theme().
11 */
12 function invite_stats_theme() {
13 return array(
14 'invite_stats_ranking' => array(
15 'arguments' => array('inviters' => NULL, 'rank' => 1),
16 ),
17 'invite_stats_count' => array(
18 'arguments' => array('count' => NULL),
19 ),
20 );
21 }
22
23 /**
24 * Implementation of hook_perm().
25 */
26 function invite_stats_perm() {
27 return array('view invite statistics', 'view own invite statistics');
28 }
29
30 /**
31 * Implementation of hook_user().
32 */
33 function invite_stats_user($op, &$edit, &$account, $category = NULL) {
34 global $user;
35
36 switch ($op) {
37 case 'view':
38 $view_access = user_access('view invite statistics');
39 $view_own_access = user_access('view own invite statistics') && $account->uid == $user->uid;
40 if ($view_access || $view_own_access) {
41 $items['accepted'] = array(
42 'title' => t('Successful'),
43 'value' => invite_count($account->uid, 'accepted'),
44 'class' => 'successful',
45 );
46 $items['pending'] = array(
47 'title' => t('Pending'),
48 'value' => invite_count($account->uid, 'pending'),
49 'class' => 'pending',
50 );
51 $items['expired'] = array(
52 'title' => t('Unsuccessful'),
53 'value' => invite_count($account->uid, 'expired'),
54 'class' => 'expired',
55 );
56 return array(t('Invitation counts') => $items);
57 }
58 break;
59 }
60 }
61
62 /**
63 * Implementation of hook_block().
64 */
65 function invite_stats_block($op = 'list', $delta = 0, $edit = array()) {
66 if ($op == 'list') {
67 $blocks[0] = array('info' => t('Top inviters/User rank'));
68 return $blocks;
69 }
70 else if ($op == 'view') {
71 switch ($delta) {
72 case 0:
73 if (user_access('view invite statistics')) {
74 if (arg(0) == 'user' && is_numeric(arg(1)) && $account = user_load(array('uid' => arg(1)))) {
75 $block = array(
76 'subject' => t("@user's invite rank", array('@user' => $account->name)),
77 'content' => invite_stats_display_user_rank($account->uid),
78 );
79 }
80 else {
81 $block = array(
82 'subject' => t('Top inviters'),
83 'content' => invite_stats_display_top_inviters(),
84 );
85 }
86 }
87 break;
88 }
89 return $block;
90 }
91 else if ($op == 'configure') {
92 switch ($delta) {
93 case 0:
94 $form['invite_num_ranks'] = array(
95 '#type' => 'textfield',
96 '#title' => t('Number of inviters'),
97 '#default_value' => variable_get('invite_num_ranks', 5),
98 '#size' => 3,
99 '#maxlength' => 3,
100 '#description' => t('Show this number of inviters in the Top inviters and User rank blocks.'),
101 '#required' => TRUE,
102 );
103 return $form;
104 }
105 }
106 else if ($op == 'save') {
107 switch ($delta) {
108 case 0:
109 variable_set('invite_num_ranks', (int)$edit['invite_num_ranks']);
110 break;
111 }
112 }
113 }
114
115 /**
116 * Render the "Top inviters" block.
117 */
118 function invite_stats_display_top_inviters() {
119 $inviters = array();
120 $result = db_query_range("SELECT uid, COUNT(uid) AS count FROM {invite} WHERE joined <> 0 GROUP BY uid ORDER BY count DESC", 0, variable_get('invite_num_ranks', 5));
121 while ($row = db_fetch_object($result)) {
122 $inviters[] = $row;
123 }
124 return theme('invite_stats_ranking', $inviters);
125 }
126
127 /**
128 * Render the displayed user's rank block.
129 */
130 function invite_stats_display_user_rank($uid) {
131 $inviters = array();
132 $max = variable_get('invite_num_ranks', 5);
133
134 // Get user's invite count.
135 $user_invite_stats_count = db_result(db_query("SELECT COUNT(*) FROM {invite} WHERE uid = %d AND joined <> 0", $uid));
136
137 // Calculate user's rank.
138 $result = db_query("SELECT DISTINCT COUNT(uid) FROM {invite} WHERE joined <> 0 GROUP BY uid HAVING COUNT(uid) > %d", $user_invite_stats_count);
139 $rank = 1;
140 while ($row = db_fetch_array($result)) {
141 $rank++;
142 }
143
144 // Fetch users with more invites.
145 $i = 0;
146 $prev_count = 0;
147 $result = db_query_range("SELECT uid, COUNT(uid) AS count FROM {invite} WHERE joined <> 0 GROUP BY uid HAVING COUNT(uid) > %d ORDER BY count ASC", $user_invite_stats_count, 0, $max - 1);
148 while ($row = db_fetch_object($result)) {
149 if ($row->count != $prev_count) {
150 $prev_count = $row->count;
151 $rank--; // Decrement initial rank
152 }
153 array_unshift($inviters, $row);
154 }
155
156 // Add current user, now we have invite_num_ranks users at max.
157 $inviters[] = (object)array('uid' => $uid, 'count' => $user_invite_stats_count);
158 $user_idx = count($inviters);
159
160 // Add users with equal or less invites.
161 $i = 0;
162 $prev_count = $user_invite_stats_count;
163 $result = db_query_range("SELECT uid, COUNT(uid) AS count FROM {invite} WHERE joined <> 0 GROUP BY uid HAVING COUNT(uid) <= %d AND uid <> %d ORDER BY count DESC", $user_invite_stats_count, $uid, 0, $max - 1);
164 while ($row = db_fetch_object($result)) {
165 $inviters[] = $row;
166 }
167
168 // Slice result.
169 $start = max($user_idx - 1 - floor($max / 2), 0);
170 if (count($inviters) - $user_idx < floor($max / 2)) {
171 $start -= max(count($inviters) - $user_idx, floor($max / 2));
172 $start = max($start, 0);
173 }
174 $inviters = array_slice($inviters, $start, $max);
175
176 return theme('invite_stats_ranking', $inviters, $rank);
177 }
178
179 /**
180 * Theme the Top inviters/user rank block.
181 *
182 * @param $inviters
183 * An array of arrays consisting of the user id and invite count.
184 * @param $rank
185 * The rank of the first inviter in the list.
186 *
187 * @ingroup themeable
188 */
189 function theme_invite_stats_ranking($inviters, $rank = 1) {
190 if ($inviters) {
191 global $user;
192
193 $header = array();
194 $rows = array();
195 $prev_count = 0;
196 foreach ($inviters as $inviter) {
197 $row = array();
198 if ($inviter->count != $prev_count) {
199 $row[] = array('data' => "$rank.", 'style' => 'width: 5%');
200 $prev_count = $inviter->count;
201 $rank++;
202 }
203 else {
204 $row[] = '';
205 }
206 $row[] = theme('username', user_load(array('uid' => $inviter->uid)));
207 $row[] = array('data' => theme('invite_stats_count', $inviter->count), 'align' => 'right');
208 $rows[] = array('data' => $row, 'class' => ($inviter->uid == $user->uid ? 'current-user' : ''));
209 }
210
211 return theme('table', $header, $rows, array('id' => 'invite-ranks'));
212 }
213 }
214
215 /**
216 * Theme an invite count.
217 *
218 * @param $count
219 * A number.
220 *
221 * @ingroup themeable
222 */
223 function theme_invite_stats_count($count) {
224 $title = format_plural($count, '1 invite', '@count invites');
225 return '<span class="count" title="'. $title .'">'. $count .'</span>';
226 }
227

  ViewVC Help
Powered by ViewVC 1.1.2