franck@0
|
1 <?php |
franck@2
|
2 // $Id: og_statistics.module,v 1.2.2.6 2009/09/07 19:22:31 dereine Exp $ |
franck@0
|
3 |
franck@0
|
4 /** |
franck@0
|
5 * @file |
franck@0
|
6 * Logs statistics of the organic group module. |
franck@0
|
7 * |
franck@0
|
8 * @todo |
franck@0
|
9 * Write more inline comments. |
franck@0
|
10 * Build a central api function. |
franck@0
|
11 * Use the abstract api function to remove all this functions, |
franck@0
|
12 * like og_stat_add_*, og_stat_update_*. |
franck@0
|
13 * |
franck@0
|
14 * Remove all og_statistics_load in update/add/remove functions, its not needed there. |
franck@0
|
15 * |
franck@0
|
16 * Make more functions use arrays instaed of single values. |
franck@0
|
17 */ |
franck@0
|
18 |
franck@0
|
19 /** |
franck@2
|
20 * Implementation of hook_menu(). |
franck@2
|
21 */ |
franck@2
|
22 function og_statistics_menu() { |
franck@2
|
23 $items = array(); |
franck@2
|
24 $items['admin/settings/og_statistics'] = array( |
franck@2
|
25 'title' => 'Og Statistics settings', |
franck@2
|
26 'description' => '', |
franck@2
|
27 'page callback' => 'drupal_get_form', |
franck@2
|
28 'page arguments' => array('og_statistics_settings'), |
franck@2
|
29 'access arguments' => array('administer organic groups'), |
franck@2
|
30 'file' => 'og_statistics.admin.inc', |
franck@2
|
31 'type' => MENU_NORMAL_ITEM, |
franck@2
|
32 ); |
franck@2
|
33 return $items; |
franck@2
|
34 } |
franck@2
|
35 |
franck@2
|
36 /** |
franck@0
|
37 * Central og_statistics api function. |
franck@0
|
38 * |
franck@0
|
39 * This function is not used yet. |
franck@0
|
40 * |
franck@0
|
41 * @param $gid |
franck@0
|
42 * The group nid. |
franck@0
|
43 * |
franck@0
|
44 * @param $key |
franck@0
|
45 * The statistics key, for example members_count. |
franck@0
|
46 * |
franck@0
|
47 * @param $method |
franck@0
|
48 * How should the value be handled, possible values: |
franck@0
|
49 * - set: Ignore the previos value. |
franck@0
|
50 * - add: add a integer to the previos value. |
franck@0
|
51 * |
franck@0
|
52 * @param $value |
franck@0
|
53 * The new statistics value. |
franck@0
|
54 * |
franck@0
|
55 */ |
franck@0
|
56 function og_statistics_update_statistic($gid, $key, $method = 'set', $value) { |
franck@0
|
57 $stat = og_statistics_load($gid); |
franck@0
|
58 $stat[$key] = $method == 'set' ? $value : $stat[$key] + $value; |
franck@0
|
59 return drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
60 } |
franck@0
|
61 |
franck@0
|
62 /** |
franck@0
|
63 * Implementation of hook_nodeapi(). |
franck@0
|
64 */ |
franck@0
|
65 function og_statistics_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { |
franck@0
|
66 switch ($op) { |
franck@0
|
67 case 'insert': |
franck@0
|
68 // Adds a new record for the new group. |
franck@0
|
69 if (og_is_group_type($node->type)) { |
franck@0
|
70 og_statistics_write_pure_record($node->nid); |
franck@0
|
71 } |
franck@0
|
72 // Update statistics. |
franck@0
|
73 elseif (og_is_group_post_type($node->type)) { |
franck@0
|
74 if (isset($node->og_groups)) { |
franck@0
|
75 $node->og_groups = array_unique($node->og_groups); |
franck@0
|
76 foreach ($node->og_groups as $gid) { |
franck@0
|
77 og_statistics_add_node($gid); |
franck@2
|
78 og_statistics_update_last_node($node, $gid); |
franck@0
|
79 } |
franck@0
|
80 } |
franck@0
|
81 } |
franck@0
|
82 break; |
franck@0
|
83 case 'delete': |
franck@0
|
84 // Remove a record for group. |
franck@0
|
85 if (og_is_group_type($node->type)) { |
franck@2
|
86 og_statistics_delete_record($node->nid); |
franck@0
|
87 } |
franck@0
|
88 // Update statistics. |
franck@0
|
89 elseif (og_is_group_post_type($node->type)) { |
franck@0
|
90 if (isset($node->og_groups)) { |
franck@0
|
91 $node->og_groups = array_unique($node->og_groups); |
franck@0
|
92 foreach ($node->og_groups as $gid) { |
franck@2
|
93 og_statistics_remove_node($node->nid, $gid); |
franck@0
|
94 } |
franck@0
|
95 } |
franck@0
|
96 } |
franck@0
|
97 break; |
franck@0
|
98 case 'update': |
franck@0
|
99 // Update statistics. |
franck@0
|
100 if (og_is_group_post_type($node->type)) { |
franck@1
|
101 if (isset($node->og_groups) && isset($node->og_initial_groups)) { |
franck@0
|
102 $updated_gid = array_intersect($node->og_groups, $node->og_initial_groups); |
franck@0
|
103 $added_gid = array_diff($node->og_groups, $node->og_initial_groups); |
franck@0
|
104 $removed_gid = array_diff($node->og_initial_groups, $node->og_groups); |
franck@0
|
105 foreach ($updated_gid as $gid) { |
franck@2
|
106 og_statistics_update_last_node($node, $gid); |
franck@0
|
107 } |
franck@0
|
108 foreach ($added_gid as $gid) { |
franck@0
|
109 og_statistics_add_node($gid); |
franck@2
|
110 og_statistics_update_last_node($node, $gid); |
franck@0
|
111 } |
franck@0
|
112 foreach ($removed_gid as $gid) { |
franck@2
|
113 og_statistics_remove_node($node->nid, $gid); |
franck@0
|
114 } |
franck@0
|
115 } |
franck@0
|
116 } |
franck@0
|
117 } |
franck@0
|
118 } |
franck@0
|
119 |
franck@0
|
120 /** |
franck@0
|
121 * Implementation of hook_comment(). |
franck@0
|
122 */ |
franck@0
|
123 function og_statistics_comment(&$a1, $op) { |
franck@0
|
124 switch ($op) { |
franck@0
|
125 case 'insert': |
franck@0
|
126 $node = node_load($a1['nid']); |
franck@0
|
127 if (og_is_group_post_type($node->type)) { |
franck@0
|
128 foreach ($node->og_groups as $gid) { |
franck@0
|
129 og_statistics_add_comment($gid); |
franck@2
|
130 og_statistics_update_last_comment($a1, $gid); |
franck@0
|
131 } |
franck@0
|
132 } |
franck@0
|
133 break; |
franck@0
|
134 case 'delete': |
franck@0
|
135 $node = node_load($a1->nid); |
franck@0
|
136 if (og_is_group_post_type($node->type)) { |
franck@0
|
137 foreach ($node->og_groups as $gid) { |
franck@0
|
138 og_statistics_remove_comment($gid); |
franck@0
|
139 } |
franck@0
|
140 } |
franck@0
|
141 break; |
franck@0
|
142 case 'update': |
franck@0
|
143 $node = node_load($a1['nid']); |
franck@0
|
144 if (og_is_group_post_type($node->type)) { |
franck@0
|
145 foreach ($node->og_groups as $gid) { |
franck@2
|
146 og_statistics_update_last_comment($a1, $gid); |
franck@0
|
147 } |
franck@0
|
148 } |
franck@0
|
149 break; |
franck@0
|
150 } |
franck@0
|
151 } |
franck@0
|
152 |
franck@0
|
153 /** |
franck@0
|
154 * Implementation of hook_og(). |
franck@0
|
155 */ |
franck@0
|
156 function og_statistics_og($op, $gid, $uid, $args) { |
franck@0
|
157 switch ($op) { |
franck@0
|
158 case 'user insert': |
franck@0
|
159 $time = time(); |
franck@0
|
160 og_statistics_add_user($gid); |
franck@2
|
161 og_statistics_update_last_member($time, $uid, $gid); |
franck@0
|
162 break; |
franck@0
|
163 case 'user delete': |
franck@0
|
164 og_statistics_remove_user($gid); |
franck@0
|
165 break; |
franck@0
|
166 } |
franck@0
|
167 } |
franck@0
|
168 |
franck@0
|
169 /** |
franck@0
|
170 * Returns a statistic for a group(). |
franck@0
|
171 * |
franck@0
|
172 * @param $gid |
franck@0
|
173 * The group nid. |
franck@0
|
174 * |
franck@0
|
175 * @todo |
franck@0
|
176 * Build perhaps a static cache here. |
franck@0
|
177 * |
franck@0
|
178 */ |
franck@0
|
179 function og_statistics_load($gid) { |
franck@0
|
180 $result = db_query("SELECT * FROM {og_statistics} WHERE nid = %d", $gid); |
franck@0
|
181 return db_fetch_array($result); |
franck@0
|
182 } |
franck@0
|
183 |
franck@0
|
184 /** |
franck@0
|
185 * Writes a record of statistics without any content, but nid. |
franck@0
|
186 * |
franck@0
|
187 * @param $gid |
franck@0
|
188 * The group nid. |
franck@0
|
189 */ |
franck@0
|
190 function og_statistics_write_pure_record($gid) { |
franck@0
|
191 // All statistics are set to zero. |
franck@0
|
192 $stat = array( |
franck@0
|
193 'nid' => $gid, |
franck@0
|
194 'members_count' => 0, |
franck@0
|
195 'posts_count' => 0, |
franck@0
|
196 'comments_count' => 0, |
franck@0
|
197 'last_node_timestamp' => 0, |
franck@0
|
198 'last_comment_timestamp' => 0, |
franck@0
|
199 'last_member_timestamp' => 0, |
franck@2
|
200 'last_node_nid' => 0, |
franck@2
|
201 'last_node_uid' => 0, |
franck@2
|
202 'last_comment_cid' => 0, |
franck@2
|
203 'last_comment_nid' => 0, |
franck@2
|
204 'last_comment_uid' => 0, |
franck@2
|
205 'last_member_uid' => 0, |
franck@0
|
206 ); |
franck@0
|
207 drupal_write_record('og_statistics', $stat); |
franck@0
|
208 } |
franck@0
|
209 |
franck@0
|
210 /** |
franck@0
|
211 * Add 1 to posts_count of a group. |
franck@0
|
212 * |
franck@0
|
213 * @param $gid |
franck@0
|
214 * The group nid. |
franck@0
|
215 */ |
franck@0
|
216 function og_statistics_add_node($gid) { |
franck@0
|
217 $stat = og_statistics_load($gid); |
franck@0
|
218 $stat['posts_count']++; |
franck@0
|
219 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
220 } |
franck@0
|
221 |
franck@0
|
222 /** |
franck@0
|
223 * Removes 1 form posts_count of a group. |
franck@0
|
224 * |
franck@0
|
225 * @param $gid |
franck@0
|
226 * The group nid. |
franck@0
|
227 */ |
franck@2
|
228 function og_statistics_remove_node($nid, $gid) { |
franck@0
|
229 $stat = og_statistics_load($gid); |
franck@0
|
230 $stat['posts_count']--; |
franck@0
|
231 // Load the count of comments and remove this amount of comments. |
franck@2
|
232 $node = node_load($nid); |
franck@0
|
233 $stat['comments_count'] -= $node->comment_count; |
franck@0
|
234 |
franck@0
|
235 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
236 } |
franck@0
|
237 |
franck@0
|
238 /** |
franck@0
|
239 * Updates the last node of a group. |
franck@0
|
240 * |
franck@2
|
241 * @param $node |
franck@2
|
242 * A node object. |
franck@0
|
243 * @param $gid |
franck@0
|
244 * The group nid. |
franck@0
|
245 */ |
franck@2
|
246 function og_statistics_update_last_node($node, $gid) { |
franck@0
|
247 $stat = og_statistics_load($gid); |
franck@2
|
248 $stat['last_node_timestamp'] = $node->changed; |
franck@2
|
249 $stat['last_node_uid'] = $node->uid; |
franck@2
|
250 $stat['last_node_nid'] = $node->nid; |
franck@0
|
251 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
252 } |
franck@0
|
253 |
franck@0
|
254 /** |
franck@0
|
255 * Add 1 to comments_count of a group. |
franck@0
|
256 * |
franck@0
|
257 * @param $gid |
franck@0
|
258 * The group nid. |
franck@0
|
259 */ |
franck@0
|
260 function og_statistics_add_comment($gid) { |
franck@0
|
261 $stat = og_statistics_load($gid); |
franck@0
|
262 $stat['comments_count']++; |
franck@0
|
263 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
264 } |
franck@0
|
265 |
franck@0
|
266 /** |
franck@0
|
267 * Removes 1 from comments_count of a group. |
franck@0
|
268 * |
franck@0
|
269 * @param $gid |
franck@0
|
270 * The group nid. |
franck@0
|
271 */ |
franck@0
|
272 function og_statistics_remove_comment($gid) { |
franck@0
|
273 $stat = og_statistics_load($gid); |
franck@0
|
274 $stat['comments_count']--; |
franck@0
|
275 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
276 } |
franck@0
|
277 |
franck@0
|
278 /** |
franck@0
|
279 * Updates the last comment of a group. |
franck@0
|
280 * |
franck@2
|
281 * @param $comment |
franck@2
|
282 * A comment array. |
franck@0
|
283 * @param $gid |
franck@0
|
284 * The group nid. |
franck@0
|
285 */ |
franck@2
|
286 function og_statistics_update_last_comment($comment, $gid) { |
franck@0
|
287 $stat = og_statistics_load($gid); |
franck@2
|
288 $stat['last_comment_timestamp'] = $comment['timestamp']; |
franck@2
|
289 $stat['last_comment_uid'] = $comment['uid']; |
franck@2
|
290 $stat['last_comment_nid'] = $comment['nid']; |
franck@2
|
291 $stat['last_comment_cid'] = $comment['cid']; |
franck@0
|
292 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
293 } |
franck@0
|
294 |
franck@0
|
295 /** |
franck@0
|
296 * Add 1 to members_count of a group. |
franck@0
|
297 * |
franck@0
|
298 * @param $gid |
franck@0
|
299 * The group nid. |
franck@0
|
300 */ |
franck@0
|
301 function og_statistics_add_user($gid) { |
franck@0
|
302 $stat = og_statistics_load($gid); |
franck@0
|
303 $stat['members_count']++; |
franck@0
|
304 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
305 } |
franck@0
|
306 |
franck@0
|
307 /** |
franck@0
|
308 * Removes 1 from members_count of a group. |
franck@0
|
309 * |
franck@0
|
310 * @param $gid |
franck@0
|
311 * The group nid. |
franck@0
|
312 */ |
franck@0
|
313 function og_statistics_remove_user($gid) { |
franck@0
|
314 $stat = og_statistics_load($gid); |
franck@0
|
315 $stat['members_count']--; |
franck@0
|
316 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
317 } |
franck@0
|
318 |
franck@0
|
319 /** |
franck@0
|
320 * Updates the last member of a group. |
franck@0
|
321 * |
franck@0
|
322 * @param $gid |
franck@0
|
323 * The group nid. |
franck@2
|
324 * @param $uid |
franck@2
|
325 * The uid of the latest member. |
franck@0
|
326 */ |
franck@2
|
327 function og_statistics_update_last_member($timestamp, $uid, $gid) { |
franck@0
|
328 $stat = og_statistics_load($gid); |
franck@0
|
329 $stat['last_member_timestamp'] = $timestamp; |
franck@2
|
330 $stat['last_member_uid'] = $uid; |
franck@0
|
331 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
332 } |
franck@0
|
333 |
franck@0
|
334 /** |
franck@0
|
335 * Removes a complete record. |
franck@0
|
336 * |
franck@0
|
337 * @param $gid |
franck@0
|
338 * The group nid. |
franck@0
|
339 */ |
franck@0
|
340 function og_statistics_delete_record($gid) { |
franck@0
|
341 db_query("DELETE FROM {og_statistics} WHERE nid = %d", $gid); |
franck@0
|
342 } |
franck@0
|
343 |
franck@0
|
344 /** |
franck@2
|
345 * Recalcs mulitple records. |
franck@2
|
346 * |
franck@2
|
347 * @param $nids |
franck@2
|
348 * A list of nids to recalc the records. |
franck@2
|
349 */ |
franck@2
|
350 function og_statistcs_recalc($nids = array()) { |
franck@2
|
351 foreach ($nids as $nid) { |
franck@2
|
352 // All statistics are set to zero. |
franck@2
|
353 $stat = array( |
franck@2
|
354 'nid' => $nid, |
franck@2
|
355 'members_count' => 0, |
franck@2
|
356 'posts_count' => 0, |
franck@2
|
357 'comments_count' => 0, |
franck@2
|
358 'last_node_timestamp' => 0, |
franck@2
|
359 'last_comment_timestamp' => 0, |
franck@2
|
360 'last_member_timestamp' => 0, |
franck@2
|
361 'last_node_nid' => 0, |
franck@2
|
362 'last_node_uid' => 0, |
franck@2
|
363 'last_comment_cid' => 0, |
franck@2
|
364 'last_comment_nid' => 0, |
franck@2
|
365 'last_comment_uid' => 0, |
franck@2
|
366 'last_member_uid' => 0, |
franck@2
|
367 ); |
franck@2
|
368 $stat['members_count'] = db_result(db_query("SELECT COUNT(uid) FROM {og_uid} WHERE nid = %d", $nid)); |
franck@2
|
369 $stat['posts_count'] = db_result(db_query("SELECT COUNT(nid) FROM {og_ancestry} WHERE group_nid = %d", $nid)); |
franck@2
|
370 $stat['comments_count'] = db_result(db_query("SELECT COUNT(c.cid) FROM {comments} c |
franck@2
|
371 INNER JOIN {og_ancestry} oa ON oa.nid = c.nid WHERE oa.group_nid = %d", $nid)); |
franck@2
|
372 |
franck@2
|
373 $array = db_fetch_array(db_query_range("SELECT n.uid AS last_node_uid, n.nid AS last_node_nid, n.created AS last_node_timestamp FROM {node} n |
franck@2
|
374 INNER JOIN {og_ancestry} oa ON oa.nid = n.nid WHERE oa.group_nid = %d ORDER BY n.created DESC", $nid, 0, 1)); |
franck@2
|
375 $array = $array ? $array : array(); |
franck@2
|
376 $stat = array_merge($stat, $array); |
franck@2
|
377 $array = db_fetch_array(db_query_range("SELECT c.nid AS last_comment_nid, c.uid AS last_comment_uid, c.cid AS last_comment_cid, c.timestamp AS last_comment_timestamp FROM {comments} c |
franck@2
|
378 INNER JOIN {og_ancestry} oa ON oa.nid = c.nid WHERE group_nid = %d ORDER BY c.timestamp DESC |
franck@2
|
379 ", $nid, 0, 1)); |
franck@2
|
380 $array = $array ? $array : array(); |
franck@2
|
381 $stat = array_merge($stat, $array); |
franck@2
|
382 $array = db_fetch_array(db_query_range("SELECT created AS last_member_timestamp, uid AS last_member_uid FROM {og_uid} |
franck@2
|
383 WHERE nid = %d ORDER BY created DESC", $nid, 0, 1)); |
franck@2
|
384 $array = $array ? $array : array(); |
franck@2
|
385 $stat = array_merge($stat, $array); |
franck@2
|
386 |
franck@2
|
387 if (og_statistics_load($nid)) { |
franck@2
|
388 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@2
|
389 } |
franck@2
|
390 else { |
franck@2
|
391 drupal_write_record('og_statistics', $stat); |
franck@2
|
392 } |
franck@2
|
393 } |
franck@2
|
394 } |
franck@2
|
395 |
franck@2
|
396 function og_statistcs_settings_finished() { |
franck@2
|
397 drupal_set_message('Statistics rebuilded successfull'); |
franck@2
|
398 } |
franck@2
|
399 |
franck@2
|
400 |
franck@2
|
401 /** |
franck@0
|
402 * views stuff. |
franck@0
|
403 */ |
franck@0
|
404 |
franck@0
|
405 /** |
franck@0
|
406 * Implementation of hook_views_api(). |
franck@0
|
407 */ |
franck@0
|
408 function og_statistics_views_api() { |
franck@0
|
409 return array( |
franck@0
|
410 'api' => 2, |
franck@0
|
411 ); |
franck@0
|
412 } |
franck@0
|
413 |