annotate og_statistics.module @ 2:48f07e7acaca

OG Stats 1.0-rc2
author Franck Deroche <franck@defr.org>
date Tue, 24 Nov 2009 14:27:37 +0100
parents 9ce879ecbce6
children 13824d66b299
rev   line source
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@0 101 if (isset($node->og_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