franck@0
|
1 <?php |
franck@0
|
2 // $Id: og_statistics.module,v 1.2.2.1 2009/06/05 22:38:12 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@0
|
20 * Central og_statistics api function. |
franck@0
|
21 * |
franck@0
|
22 * This function is not used yet. |
franck@0
|
23 * |
franck@0
|
24 * @param $gid |
franck@0
|
25 * The group nid. |
franck@0
|
26 * |
franck@0
|
27 * @param $key |
franck@0
|
28 * The statistics key, for example members_count. |
franck@0
|
29 * |
franck@0
|
30 * @param $method |
franck@0
|
31 * How should the value be handled, possible values: |
franck@0
|
32 * - set: Ignore the previos value. |
franck@0
|
33 * - add: add a integer to the previos value. |
franck@0
|
34 * |
franck@0
|
35 * @param $value |
franck@0
|
36 * The new statistics value. |
franck@0
|
37 * |
franck@0
|
38 */ |
franck@0
|
39 function og_statistics_update_statistic($gid, $key, $method = 'set', $value) { |
franck@0
|
40 $stat = og_statistics_load($gid); |
franck@0
|
41 $stat[$key] = $method == 'set' ? $value : $stat[$key] + $value; |
franck@0
|
42 return drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
43 } |
franck@0
|
44 |
franck@0
|
45 /** |
franck@0
|
46 * Implementation of hook_nodeapi(). |
franck@0
|
47 */ |
franck@0
|
48 function og_statistics_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { |
franck@0
|
49 switch ($op) { |
franck@0
|
50 case 'insert': |
franck@0
|
51 // Adds a new record for the new group. |
franck@0
|
52 if (og_is_group_type($node->type)) { |
franck@0
|
53 og_statistics_write_pure_record($node->nid); |
franck@0
|
54 } |
franck@0
|
55 // Update statistics. |
franck@0
|
56 elseif (og_is_group_post_type($node->type)) { |
franck@0
|
57 if (isset($node->og_groups)) { |
franck@0
|
58 $node->og_groups = array_unique($node->og_groups); |
franck@0
|
59 foreach ($node->og_groups as $gid) { |
franck@0
|
60 og_statistics_add_node($gid); |
franck@0
|
61 og_statistics_update_last_node($node->created, $gid); |
franck@0
|
62 } |
franck@0
|
63 } |
franck@0
|
64 } |
franck@0
|
65 break; |
franck@0
|
66 case 'delete': |
franck@0
|
67 // Remove a record for group. |
franck@0
|
68 if (og_is_group_type($node->type)) { |
franck@0
|
69 og_statistics_delete_record($node); |
franck@0
|
70 } |
franck@0
|
71 // Update statistics. |
franck@0
|
72 elseif (og_is_group_post_type($node->type)) { |
franck@0
|
73 if (isset($node->og_groups)) { |
franck@0
|
74 $node->og_groups = array_unique($node->og_groups); |
franck@0
|
75 foreach ($node->og_groups as $gid) { |
franck@0
|
76 og_statistics_remove_node($gid); |
franck@0
|
77 } |
franck@0
|
78 } |
franck@0
|
79 } |
franck@0
|
80 break; |
franck@0
|
81 case 'update': |
franck@0
|
82 // Update statistics. |
franck@0
|
83 if (og_is_group_post_type($node->type)) { |
franck@1
|
84 if (isset($node->og_groups) && isset($node->og_initial_groups)) { |
franck@0
|
85 $updated_gid = array_intersect($node->og_groups, $node->og_initial_groups); |
franck@0
|
86 $added_gid = array_diff($node->og_groups, $node->og_initial_groups); |
franck@0
|
87 $removed_gid = array_diff($node->og_initial_groups, $node->og_groups); |
franck@0
|
88 foreach ($updated_gid as $gid) { |
franck@0
|
89 og_statistics_update_last_node($node->changed, $gid); |
franck@0
|
90 } |
franck@0
|
91 foreach ($added_gid as $gid) { |
franck@0
|
92 og_statistics_add_node($gid); |
franck@0
|
93 og_statistics_update_last_node($node->changed, $gid); |
franck@0
|
94 } |
franck@0
|
95 foreach ($removed_gid as $gid) { |
franck@0
|
96 og_statistics_remove_node($gid); |
franck@0
|
97 } |
franck@0
|
98 } |
franck@0
|
99 } |
franck@0
|
100 } |
franck@0
|
101 } |
franck@0
|
102 |
franck@0
|
103 /** |
franck@0
|
104 * Implementation of hook_comment(). |
franck@0
|
105 */ |
franck@0
|
106 function og_statistics_comment(&$a1, $op) { |
franck@0
|
107 switch ($op) { |
franck@0
|
108 case 'insert': |
franck@0
|
109 $node = node_load($a1['nid']); |
franck@0
|
110 if (og_is_group_post_type($node->type)) { |
franck@0
|
111 foreach ($node->og_groups as $gid) { |
franck@0
|
112 og_statistics_add_comment($gid); |
franck@0
|
113 og_statistics_update_last_comment($a1['timestamp'], $gid); |
franck@0
|
114 } |
franck@0
|
115 } |
franck@0
|
116 break; |
franck@0
|
117 case 'delete': |
franck@0
|
118 $node = node_load($a1->nid); |
franck@0
|
119 if (og_is_group_post_type($node->type)) { |
franck@0
|
120 foreach ($node->og_groups as $gid) { |
franck@0
|
121 og_statistics_remove_comment($gid); |
franck@0
|
122 } |
franck@0
|
123 } |
franck@0
|
124 break; |
franck@0
|
125 case 'update': |
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_update_last_comment($a1['timestamp'], $gid); |
franck@0
|
130 } |
franck@0
|
131 } |
franck@0
|
132 break; |
franck@0
|
133 } |
franck@0
|
134 } |
franck@0
|
135 |
franck@0
|
136 /** |
franck@0
|
137 * Implementation of hook_og(). |
franck@0
|
138 */ |
franck@0
|
139 function og_statistics_og($op, $gid, $uid, $args) { |
franck@0
|
140 switch ($op) { |
franck@0
|
141 case 'user insert': |
franck@0
|
142 $time = time(); |
franck@0
|
143 og_statistics_add_user($gid); |
franck@0
|
144 og_statistics_update_last_member($time, $gid); |
franck@0
|
145 break; |
franck@0
|
146 case 'user delete': |
franck@0
|
147 og_statistics_remove_user($gid); |
franck@0
|
148 break; |
franck@0
|
149 } |
franck@0
|
150 } |
franck@0
|
151 |
franck@0
|
152 /** |
franck@0
|
153 * Returns a statistic for a group(). |
franck@0
|
154 * |
franck@0
|
155 * @param $gid |
franck@0
|
156 * The group nid. |
franck@0
|
157 * |
franck@0
|
158 * @todo |
franck@0
|
159 * Build perhaps a static cache here. |
franck@0
|
160 * |
franck@0
|
161 */ |
franck@0
|
162 function og_statistics_load($gid) { |
franck@0
|
163 $result = db_query("SELECT * FROM {og_statistics} WHERE nid = %d", $gid); |
franck@0
|
164 return db_fetch_array($result); |
franck@0
|
165 } |
franck@0
|
166 |
franck@0
|
167 /** |
franck@0
|
168 * Writes a record of statistics without any content, but nid. |
franck@0
|
169 * |
franck@0
|
170 * @param $gid |
franck@0
|
171 * The group nid. |
franck@0
|
172 */ |
franck@0
|
173 function og_statistics_write_pure_record($gid) { |
franck@0
|
174 // All statistics are set to zero. |
franck@0
|
175 $stat = array( |
franck@0
|
176 'nid' => $gid, |
franck@0
|
177 'members_count' => 0, |
franck@0
|
178 'posts_count' => 0, |
franck@0
|
179 'comments_count' => 0, |
franck@0
|
180 'last_node_timestamp' => 0, |
franck@0
|
181 'last_comment_timestamp' => 0, |
franck@0
|
182 'last_member_timestamp' => 0, |
franck@0
|
183 ); |
franck@0
|
184 drupal_write_record('og_statistics', $stat); |
franck@0
|
185 } |
franck@0
|
186 |
franck@0
|
187 /** |
franck@0
|
188 * Add 1 to posts_count of a group. |
franck@0
|
189 * |
franck@0
|
190 * @param $gid |
franck@0
|
191 * The group nid. |
franck@0
|
192 */ |
franck@0
|
193 function og_statistics_add_node($gid) { |
franck@0
|
194 $stat = og_statistics_load($gid); |
franck@0
|
195 $stat['posts_count']++; |
franck@0
|
196 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
197 } |
franck@0
|
198 |
franck@0
|
199 /** |
franck@0
|
200 * Removes 1 form posts_count of a group. |
franck@0
|
201 * |
franck@0
|
202 * @param $gid |
franck@0
|
203 * The group nid. |
franck@0
|
204 */ |
franck@0
|
205 function og_statistics_remove_node($gid) { |
franck@0
|
206 $stat = og_statistics_load($gid); |
franck@0
|
207 $stat['posts_count']--; |
franck@0
|
208 // Load the count of comments and remove this amount of comments. |
franck@0
|
209 $node = node_load($gid); |
franck@0
|
210 $stat['comments_count'] -= $node->comment_count; |
franck@0
|
211 |
franck@0
|
212 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
213 } |
franck@0
|
214 |
franck@0
|
215 /** |
franck@0
|
216 * Updates the last node of a group. |
franck@0
|
217 * |
franck@0
|
218 * @param $gid |
franck@0
|
219 * The group nid. |
franck@0
|
220 */ |
franck@0
|
221 function og_statistics_update_last_node($timestamp, $gid) { |
franck@0
|
222 $stat = og_statistics_load($gid); |
franck@0
|
223 $stat['last_node_timestamp'] = $timestamp; |
franck@0
|
224 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
225 } |
franck@0
|
226 |
franck@0
|
227 /** |
franck@0
|
228 * Add 1 to comments_count of a group. |
franck@0
|
229 * |
franck@0
|
230 * @param $gid |
franck@0
|
231 * The group nid. |
franck@0
|
232 */ |
franck@0
|
233 function og_statistics_add_comment($gid) { |
franck@0
|
234 $stat = og_statistics_load($gid); |
franck@0
|
235 $stat['comments_count']++; |
franck@0
|
236 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
237 } |
franck@0
|
238 |
franck@0
|
239 /** |
franck@0
|
240 * Removes 1 from comments_count of a group. |
franck@0
|
241 * |
franck@0
|
242 * @param $gid |
franck@0
|
243 * The group nid. |
franck@0
|
244 */ |
franck@0
|
245 function og_statistics_remove_comment($gid) { |
franck@0
|
246 $stat = og_statistics_load($gid); |
franck@0
|
247 $stat['comments_count']--; |
franck@0
|
248 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
249 } |
franck@0
|
250 |
franck@0
|
251 /** |
franck@0
|
252 * Updates the last comment of a group. |
franck@0
|
253 * |
franck@0
|
254 * @param $gid |
franck@0
|
255 * The group nid. |
franck@0
|
256 */ |
franck@0
|
257 function og_statistics_update_last_comment($timestamp, $gid) { |
franck@0
|
258 $stat = og_statistics_load($gid); |
franck@0
|
259 $stat['last_comment_timestamp'] = $timestamp; |
franck@0
|
260 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
261 } |
franck@0
|
262 |
franck@0
|
263 /** |
franck@0
|
264 * Add 1 to members_count of a group. |
franck@0
|
265 * |
franck@0
|
266 * @param $gid |
franck@0
|
267 * The group nid. |
franck@0
|
268 */ |
franck@0
|
269 function og_statistics_add_user($gid) { |
franck@0
|
270 $stat = og_statistics_load($gid); |
franck@0
|
271 $stat['members_count']++; |
franck@0
|
272 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
273 } |
franck@0
|
274 |
franck@0
|
275 /** |
franck@0
|
276 * Removes 1 from members_count of a group. |
franck@0
|
277 * |
franck@0
|
278 * @param $gid |
franck@0
|
279 * The group nid. |
franck@0
|
280 */ |
franck@0
|
281 function og_statistics_remove_user($gid) { |
franck@0
|
282 $stat = og_statistics_load($gid); |
franck@0
|
283 $stat['members_count']--; |
franck@0
|
284 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
285 } |
franck@0
|
286 |
franck@0
|
287 /** |
franck@0
|
288 * Updates the last member of a group. |
franck@0
|
289 * |
franck@0
|
290 * @param $gid |
franck@0
|
291 * The group nid. |
franck@0
|
292 */ |
franck@0
|
293 function og_statistics_update_last_member($timestamp, $gid) { |
franck@0
|
294 $stat = og_statistics_load($gid); |
franck@0
|
295 $stat['last_member_timestamp'] = $timestamp; |
franck@0
|
296 drupal_write_record('og_statistics', $stat, 'nid'); |
franck@0
|
297 } |
franck@0
|
298 |
franck@0
|
299 /** |
franck@0
|
300 * Removes a complete record. |
franck@0
|
301 * |
franck@0
|
302 * @param $gid |
franck@0
|
303 * The group nid. |
franck@0
|
304 */ |
franck@0
|
305 function og_statistics_delete_record($gid) { |
franck@0
|
306 db_query("DELETE FROM {og_statistics} WHERE nid = %d", $gid); |
franck@0
|
307 } |
franck@0
|
308 |
franck@0
|
309 /** |
franck@0
|
310 * views stuff. |
franck@0
|
311 */ |
franck@0
|
312 |
franck@0
|
313 /** |
franck@0
|
314 * Implementation of hook_views_api(). |
franck@0
|
315 */ |
franck@0
|
316 function og_statistics_views_api() { |
franck@0
|
317 return array( |
franck@0
|
318 'api' => 2, |
franck@0
|
319 ); |
franck@0
|
320 } |
franck@0
|
321 |