view og_statistics.module @ 1:0aae3e2e6309

Fix d'un warning dans le cas node_load(node_save());
author Franck Deroche <franck@defr.org>
date Tue, 24 Nov 2009 14:26:41 +0100
parents 9ce879ecbce6
children 13824d66b299
line wrap: on
line source
<?php
// $Id: og_statistics.module,v 1.2.2.1 2009/06/05 22:38:12 dereine Exp $

/**
 * @file
 *   Logs statistics of the organic group module.
 *
 * @todo
 *   Write more inline comments.
 *   Build a central api function.
 *   Use the abstract api function to remove all this functions,
 *   like og_stat_add_*, og_stat_update_*.
 *
 *   Remove all og_statistics_load in update/add/remove functions, its not needed there.
 *
 *   Make more functions use arrays instaed of single values.
 */

/**
 * Central og_statistics api function.
 *
 * This function is not used yet.
 *
 * @param $gid
 *  The group nid.
 *
 * @param $key
 *   The statistics key, for example members_count.
 *
 * @param $method
 *   How should the value be handled, possible values:
 *   - set: Ignore the previos value.
 *   - add: add a integer to the previos value.
 *
 * @param $value
 *   The new statistics value.
 *
 */
function og_statistics_update_statistic($gid, $key, $method = 'set', $value) {
  $stat = og_statistics_load($gid);
  $stat[$key] = $method == 'set' ? $value : $stat[$key] + $value;
  return drupal_write_record('og_statistics', $stat, 'nid');
}

/**
 * Implementation of hook_nodeapi().
 */
function og_statistics_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
  switch ($op) {
    case 'insert':
      // Adds a new record for the new group.
      if (og_is_group_type($node->type)) {
        og_statistics_write_pure_record($node->nid);
      }
      // Update statistics.
      elseif (og_is_group_post_type($node->type)) {
        if (isset($node->og_groups)) {
          $node->og_groups = array_unique($node->og_groups);
          foreach ($node->og_groups as $gid) {
            og_statistics_add_node($gid);
            og_statistics_update_last_node($node->created, $gid);
          }
        }
      }
      break;
    case 'delete':
      // Remove a record for group.
      if (og_is_group_type($node->type)) {
        og_statistics_delete_record($node);
      }
      // Update statistics.
      elseif (og_is_group_post_type($node->type)) {
        if (isset($node->og_groups)) {
          $node->og_groups = array_unique($node->og_groups);
          foreach ($node->og_groups as $gid) {
            og_statistics_remove_node($gid);
          }
        }
      }
      break;
    case 'update':
      // Update statistics.
      if (og_is_group_post_type($node->type)) {
        if (isset($node->og_groups) && isset($node->og_initial_groups)) {
          $updated_gid = array_intersect($node->og_groups, $node->og_initial_groups);
          $added_gid = array_diff($node->og_groups, $node->og_initial_groups);
          $removed_gid = array_diff($node->og_initial_groups, $node->og_groups);
          foreach ($updated_gid as $gid) {
            og_statistics_update_last_node($node->changed, $gid);
          }
          foreach ($added_gid as $gid) {
            og_statistics_add_node($gid);
            og_statistics_update_last_node($node->changed, $gid);
          }
          foreach ($removed_gid as $gid) {
            og_statistics_remove_node($gid);
          }
        }
      }
  }
}

/**
 * Implementation of hook_comment().
 */
function og_statistics_comment(&$a1, $op) {
  switch ($op) {
    case 'insert':
      $node = node_load($a1['nid']);
      if (og_is_group_post_type($node->type)) {
        foreach ($node->og_groups as $gid) {
          og_statistics_add_comment($gid);
          og_statistics_update_last_comment($a1['timestamp'], $gid);
        }
      }
      break;
    case 'delete':
      $node = node_load($a1->nid);
      if (og_is_group_post_type($node->type)) {
        foreach ($node->og_groups as $gid) {
          og_statistics_remove_comment($gid);
        }
      }
      break;
    case 'update':
      $node = node_load($a1['nid']);
      if (og_is_group_post_type($node->type)) {
        foreach ($node->og_groups as $gid) {
          og_statistics_update_last_comment($a1['timestamp'], $gid);
        }
      }
      break;
  }
}

/**
 * Implementation of hook_og().
 */
function og_statistics_og($op, $gid, $uid, $args) {
  switch ($op) {
    case 'user insert':
      $time = time();
      og_statistics_add_user($gid);
      og_statistics_update_last_member($time, $gid);
      break;
    case 'user delete':
      og_statistics_remove_user($gid);
      break;
  }
}

/**
 * Returns a statistic for a group().
 *
 * @param $gid
 *   The group nid.
 *
 * @todo
 *   Build perhaps a static cache here.
 *
 */
function og_statistics_load($gid) {
  $result = db_query("SELECT * FROM {og_statistics} WHERE nid = %d", $gid);
  return db_fetch_array($result);
}

/**
 * Writes a record of statistics without any content, but nid.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_write_pure_record($gid) {
  // All statistics are set to zero.
  $stat = array(
    'nid' => $gid,
    'members_count' => 0,
    'posts_count' => 0,
    'comments_count' => 0,
    'last_node_timestamp' => 0,
    'last_comment_timestamp' => 0,
    'last_member_timestamp' => 0,
  );
  drupal_write_record('og_statistics', $stat);
}

/**
 * Add 1 to posts_count of a group.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_add_node($gid) {
  $stat = og_statistics_load($gid);
  $stat['posts_count']++;
  drupal_write_record('og_statistics', $stat, 'nid');
}

/**
 * Removes 1 form posts_count of a group.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_remove_node($gid) {
  $stat = og_statistics_load($gid);
  $stat['posts_count']--;
  // Load the count of comments and remove this amount of comments.
  $node = node_load($gid);
  $stat['comments_count'] -= $node->comment_count;

  drupal_write_record('og_statistics', $stat, 'nid');
}

/**
 * Updates the last node of a group.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_update_last_node($timestamp, $gid) {
  $stat = og_statistics_load($gid);
  $stat['last_node_timestamp'] = $timestamp;
  drupal_write_record('og_statistics', $stat, 'nid');
}

/**
 * Add 1 to comments_count of a group.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_add_comment($gid) {
  $stat = og_statistics_load($gid);
  $stat['comments_count']++;
  drupal_write_record('og_statistics', $stat, 'nid');
}

/**
 * Removes 1 from comments_count of a group.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_remove_comment($gid) {
  $stat = og_statistics_load($gid);
  $stat['comments_count']--;
  drupal_write_record('og_statistics', $stat, 'nid');
}

/**
 * Updates the last comment of a group.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_update_last_comment($timestamp, $gid) {
  $stat = og_statistics_load($gid);
  $stat['last_comment_timestamp'] = $timestamp;
  drupal_write_record('og_statistics', $stat, 'nid');
}

/**
 * Add 1 to members_count of a group.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_add_user($gid) {
  $stat = og_statistics_load($gid);
  $stat['members_count']++;
  drupal_write_record('og_statistics', $stat, 'nid');
}

/**
 * Removes 1 from members_count of a group.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_remove_user($gid) {
  $stat = og_statistics_load($gid);
  $stat['members_count']--;
  drupal_write_record('og_statistics', $stat, 'nid');
}

/**
 * Updates the last member of a group.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_update_last_member($timestamp, $gid) {
  $stat = og_statistics_load($gid);
  $stat['last_member_timestamp'] = $timestamp;
  drupal_write_record('og_statistics', $stat, 'nid');
}

/**
 * Removes a complete record.
 *
 * @param $gid
 *   The group nid.
 */
function og_statistics_delete_record($gid) {
  db_query("DELETE FROM {og_statistics} WHERE nid = %d", $gid);
}

/**
 * views stuff.
 */

/**
 * Implementation of hook_views_api().
 */
function og_statistics_views_api() {
  return array(
    'api' => 2,
  );
}