franck@0: 'Og Statistics settings', franck@2: 'description' => '', franck@2: 'page callback' => 'drupal_get_form', franck@2: 'page arguments' => array('og_statistics_settings'), franck@2: 'access arguments' => array('administer organic groups'), franck@2: 'file' => 'og_statistics.admin.inc', franck@2: 'type' => MENU_NORMAL_ITEM, franck@2: ); franck@2: return $items; franck@2: } franck@2: franck@2: /** franck@0: * Central og_statistics api function. franck@0: * franck@0: * This function is not used yet. franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@0: * franck@0: * @param $key franck@0: * The statistics key, for example members_count. franck@0: * franck@0: * @param $method franck@0: * How should the value be handled, possible values: franck@0: * - set: Ignore the previos value. franck@0: * - add: add a integer to the previos value. franck@0: * franck@0: * @param $value franck@0: * The new statistics value. franck@0: * franck@0: */ franck@0: function og_statistics_update_statistic($gid, $key, $method = 'set', $value) { franck@0: $stat = og_statistics_load($gid); franck@0: $stat[$key] = $method == 'set' ? $value : $stat[$key] + $value; franck@0: return drupal_write_record('og_statistics', $stat, 'nid'); franck@0: } franck@0: franck@0: /** franck@0: * Implementation of hook_nodeapi(). franck@0: */ franck@0: function og_statistics_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { franck@0: switch ($op) { franck@0: case 'insert': franck@0: // Adds a new record for the new group. franck@0: if (og_is_group_type($node->type)) { franck@0: og_statistics_write_pure_record($node->nid); franck@0: } franck@0: // Update statistics. franck@0: elseif (og_is_group_post_type($node->type)) { franck@0: if (isset($node->og_groups)) { franck@0: $node->og_groups = array_unique($node->og_groups); franck@0: foreach ($node->og_groups as $gid) { franck@0: og_statistics_add_node($gid); franck@2: og_statistics_update_last_node($node, $gid); franck@0: } franck@0: } franck@0: } franck@0: break; franck@0: case 'delete': franck@0: // Remove a record for group. franck@0: if (og_is_group_type($node->type)) { franck@2: og_statistics_delete_record($node->nid); franck@0: } franck@0: // Update statistics. franck@0: elseif (og_is_group_post_type($node->type)) { franck@0: if (isset($node->og_groups)) { franck@0: $node->og_groups = array_unique($node->og_groups); franck@0: foreach ($node->og_groups as $gid) { franck@2: og_statistics_remove_node($node->nid, $gid); franck@0: } franck@0: } franck@0: } franck@0: break; franck@0: case 'update': franck@0: // Update statistics. franck@0: if (og_is_group_post_type($node->type)) { franck@1: if (isset($node->og_groups) && isset($node->og_initial_groups)) { franck@0: $updated_gid = array_intersect($node->og_groups, $node->og_initial_groups); franck@0: $added_gid = array_diff($node->og_groups, $node->og_initial_groups); franck@0: $removed_gid = array_diff($node->og_initial_groups, $node->og_groups); franck@0: foreach ($updated_gid as $gid) { franck@2: og_statistics_update_last_node($node, $gid); franck@0: } franck@0: foreach ($added_gid as $gid) { franck@0: og_statistics_add_node($gid); franck@2: og_statistics_update_last_node($node, $gid); franck@0: } franck@0: foreach ($removed_gid as $gid) { franck@2: og_statistics_remove_node($node->nid, $gid); franck@0: } franck@0: } franck@0: } franck@0: } franck@0: } franck@0: franck@0: /** franck@0: * Implementation of hook_comment(). franck@0: */ franck@0: function og_statistics_comment(&$a1, $op) { franck@0: switch ($op) { franck@0: case 'insert': franck@0: $node = node_load($a1['nid']); franck@0: if (og_is_group_post_type($node->type)) { franck@0: foreach ($node->og_groups as $gid) { franck@0: og_statistics_add_comment($gid); franck@2: og_statistics_update_last_comment($a1, $gid); franck@0: } franck@0: } franck@0: break; franck@0: case 'delete': franck@0: $node = node_load($a1->nid); franck@0: if (og_is_group_post_type($node->type)) { franck@0: foreach ($node->og_groups as $gid) { franck@0: og_statistics_remove_comment($gid); franck@0: } franck@0: } franck@0: break; franck@0: case 'update': franck@0: $node = node_load($a1['nid']); franck@0: if (og_is_group_post_type($node->type)) { franck@0: foreach ($node->og_groups as $gid) { franck@2: og_statistics_update_last_comment($a1, $gid); franck@0: } franck@0: } franck@0: break; franck@0: } franck@0: } franck@0: franck@0: /** franck@0: * Implementation of hook_og(). franck@0: */ franck@0: function og_statistics_og($op, $gid, $uid, $args) { franck@0: switch ($op) { franck@0: case 'user insert': franck@0: $time = time(); franck@0: og_statistics_add_user($gid); franck@2: og_statistics_update_last_member($time, $uid, $gid); franck@0: break; franck@0: case 'user delete': franck@0: og_statistics_remove_user($gid); franck@0: break; franck@0: } franck@0: } franck@0: franck@0: /** franck@0: * Returns a statistic for a group(). franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@0: * franck@0: * @todo franck@0: * Build perhaps a static cache here. franck@0: * franck@0: */ franck@0: function og_statistics_load($gid) { franck@0: $result = db_query("SELECT * FROM {og_statistics} WHERE nid = %d", $gid); franck@0: return db_fetch_array($result); franck@0: } franck@0: franck@0: /** franck@0: * Writes a record of statistics without any content, but nid. franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@0: */ franck@0: function og_statistics_write_pure_record($gid) { franck@0: // All statistics are set to zero. franck@0: $stat = array( franck@0: 'nid' => $gid, franck@0: 'members_count' => 0, franck@0: 'posts_count' => 0, franck@0: 'comments_count' => 0, franck@0: 'last_node_timestamp' => 0, franck@0: 'last_comment_timestamp' => 0, franck@0: 'last_member_timestamp' => 0, franck@2: 'last_node_nid' => 0, franck@2: 'last_node_uid' => 0, franck@2: 'last_comment_cid' => 0, franck@2: 'last_comment_nid' => 0, franck@2: 'last_comment_uid' => 0, franck@2: 'last_member_uid' => 0, franck@0: ); franck@0: drupal_write_record('og_statistics', $stat); franck@0: } franck@0: franck@0: /** franck@0: * Add 1 to posts_count of a group. franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@0: */ franck@0: function og_statistics_add_node($gid) { franck@0: $stat = og_statistics_load($gid); franck@0: $stat['posts_count']++; franck@0: drupal_write_record('og_statistics', $stat, 'nid'); franck@0: } franck@0: franck@0: /** franck@0: * Removes 1 form posts_count of a group. franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@0: */ franck@2: function og_statistics_remove_node($nid, $gid) { franck@0: $stat = og_statistics_load($gid); franck@0: $stat['posts_count']--; franck@0: // Load the count of comments and remove this amount of comments. franck@2: $node = node_load($nid); franck@0: $stat['comments_count'] -= $node->comment_count; franck@0: franck@0: drupal_write_record('og_statistics', $stat, 'nid'); franck@0: } franck@0: franck@0: /** franck@0: * Updates the last node of a group. franck@0: * franck@2: * @param $node franck@2: * A node object. franck@0: * @param $gid franck@0: * The group nid. franck@0: */ franck@2: function og_statistics_update_last_node($node, $gid) { franck@0: $stat = og_statistics_load($gid); franck@2: $stat['last_node_timestamp'] = $node->changed; franck@2: $stat['last_node_uid'] = $node->uid; franck@2: $stat['last_node_nid'] = $node->nid; franck@0: drupal_write_record('og_statistics', $stat, 'nid'); franck@0: } franck@0: franck@0: /** franck@0: * Add 1 to comments_count of a group. franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@0: */ franck@0: function og_statistics_add_comment($gid) { franck@0: $stat = og_statistics_load($gid); franck@0: $stat['comments_count']++; franck@0: drupal_write_record('og_statistics', $stat, 'nid'); franck@0: } franck@0: franck@0: /** franck@0: * Removes 1 from comments_count of a group. franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@0: */ franck@0: function og_statistics_remove_comment($gid) { franck@0: $stat = og_statistics_load($gid); franck@0: $stat['comments_count']--; franck@0: drupal_write_record('og_statistics', $stat, 'nid'); franck@0: } franck@0: franck@0: /** franck@0: * Updates the last comment of a group. franck@0: * franck@2: * @param $comment franck@2: * A comment array. franck@0: * @param $gid franck@0: * The group nid. franck@0: */ franck@2: function og_statistics_update_last_comment($comment, $gid) { franck@0: $stat = og_statistics_load($gid); franck@2: $stat['last_comment_timestamp'] = $comment['timestamp']; franck@2: $stat['last_comment_uid'] = $comment['uid']; franck@2: $stat['last_comment_nid'] = $comment['nid']; franck@2: $stat['last_comment_cid'] = $comment['cid']; franck@0: drupal_write_record('og_statistics', $stat, 'nid'); franck@0: } franck@0: franck@0: /** franck@0: * Add 1 to members_count of a group. franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@0: */ franck@0: function og_statistics_add_user($gid) { franck@0: $stat = og_statistics_load($gid); franck@0: $stat['members_count']++; franck@0: drupal_write_record('og_statistics', $stat, 'nid'); franck@0: } franck@0: franck@0: /** franck@0: * Removes 1 from members_count of a group. franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@0: */ franck@0: function og_statistics_remove_user($gid) { franck@0: $stat = og_statistics_load($gid); franck@0: $stat['members_count']--; franck@0: drupal_write_record('og_statistics', $stat, 'nid'); franck@0: } franck@0: franck@0: /** franck@0: * Updates the last member of a group. franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@2: * @param $uid franck@2: * The uid of the latest member. franck@0: */ franck@2: function og_statistics_update_last_member($timestamp, $uid, $gid) { franck@0: $stat = og_statistics_load($gid); franck@0: $stat['last_member_timestamp'] = $timestamp; franck@2: $stat['last_member_uid'] = $uid; franck@0: drupal_write_record('og_statistics', $stat, 'nid'); franck@0: } franck@0: franck@0: /** franck@0: * Removes a complete record. franck@0: * franck@0: * @param $gid franck@0: * The group nid. franck@0: */ franck@0: function og_statistics_delete_record($gid) { franck@0: db_query("DELETE FROM {og_statistics} WHERE nid = %d", $gid); franck@0: } franck@0: franck@0: /** franck@2: * Recalcs mulitple records. franck@2: * franck@2: * @param $nids franck@2: * A list of nids to recalc the records. franck@2: */ franck@2: function og_statistcs_recalc($nids = array()) { franck@2: foreach ($nids as $nid) { franck@2: // All statistics are set to zero. franck@2: $stat = array( franck@2: 'nid' => $nid, franck@2: 'members_count' => 0, franck@2: 'posts_count' => 0, franck@2: 'comments_count' => 0, franck@2: 'last_node_timestamp' => 0, franck@2: 'last_comment_timestamp' => 0, franck@2: 'last_member_timestamp' => 0, franck@2: 'last_node_nid' => 0, franck@2: 'last_node_uid' => 0, franck@2: 'last_comment_cid' => 0, franck@2: 'last_comment_nid' => 0, franck@2: 'last_comment_uid' => 0, franck@2: 'last_member_uid' => 0, franck@2: ); franck@2: $stat['members_count'] = db_result(db_query("SELECT COUNT(uid) FROM {og_uid} WHERE nid = %d", $nid)); franck@2: $stat['posts_count'] = db_result(db_query("SELECT COUNT(nid) FROM {og_ancestry} WHERE group_nid = %d", $nid)); franck@2: $stat['comments_count'] = db_result(db_query("SELECT COUNT(c.cid) FROM {comments} c franck@2: INNER JOIN {og_ancestry} oa ON oa.nid = c.nid WHERE oa.group_nid = %d", $nid)); franck@2: franck@2: $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: 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: $array = $array ? $array : array(); franck@2: $stat = array_merge($stat, $array); franck@2: $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: INNER JOIN {og_ancestry} oa ON oa.nid = c.nid WHERE group_nid = %d ORDER BY c.timestamp DESC franck@2: ", $nid, 0, 1)); franck@2: $array = $array ? $array : array(); franck@2: $stat = array_merge($stat, $array); franck@2: $array = db_fetch_array(db_query_range("SELECT created AS last_member_timestamp, uid AS last_member_uid FROM {og_uid} franck@2: WHERE nid = %d ORDER BY created DESC", $nid, 0, 1)); franck@2: $array = $array ? $array : array(); franck@2: $stat = array_merge($stat, $array); franck@2: franck@2: if (og_statistics_load($nid)) { franck@2: drupal_write_record('og_statistics', $stat, 'nid'); franck@2: } franck@2: else { franck@2: drupal_write_record('og_statistics', $stat); franck@2: } franck@2: } franck@2: } franck@2: franck@2: function og_statistcs_settings_finished() { franck@2: drupal_set_message('Statistics rebuilded successfull'); franck@2: } franck@2: franck@2: franck@2: /** franck@0: * views stuff. franck@0: */ franck@0: franck@0: /** franck@0: * Implementation of hook_views_api(). franck@0: */ franck@0: function og_statistics_views_api() { franck@0: return array( franck@0: 'api' => 2, franck@0: ); franck@0: } franck@0: