You are here

function forum_forum_load in Drupal 7

Returns a tree of all forums for a given taxonomy term ID.

Parameters

$tid: (optional) Taxonomy term ID of the forum. If not given all forums will be returned.

Return value

A tree of taxonomy objects, with the following additional properties:

  • num_topics: Number of topics in the forum.
  • num_posts: Total number of posts in all topics.
  • last_post: Most recent post for the forum.
  • forums: An array of child forums.
2 calls to forum_forum_load()
forum_menu_local_tasks_alter in modules/forum/forum.module
Implements hook_menu_local_tasks_alter().
forum_page in modules/forum/forum.pages.inc
Page callback: Prints a forum listing.

File

modules/forum/forum.module, line 765
Provides discussion forums.

Code

function forum_forum_load($tid = NULL) {
  $cache =& drupal_static(__FUNCTION__, array());

  // Return a cached forum tree if available.
  if (!isset($tid)) {
    $tid = 0;
  }
  if (isset($cache[$tid])) {
    return $cache[$tid];
  }
  $vid = variable_get('forum_nav_vocabulary', 0);

  // Load and validate the parent term.
  if ($tid) {
    $forum_term = taxonomy_term_load($tid);
    if (!$forum_term || $forum_term->vid != $vid) {
      return $cache[$tid] = FALSE;
    }
  }
  elseif ($tid === 0) {
    $forum_term = (object) array(
      'tid' => 0,
    );
  }

  // Determine if the requested term is a container.
  if (!$forum_term->tid || in_array($forum_term->tid, variable_get('forum_containers', array()))) {
    $forum_term->container = 1;
  }

  // Load parent terms.
  $forum_term->parents = taxonomy_get_parents_all($forum_term->tid);

  // Load the tree below.
  $forums = array();
  $_forums = taxonomy_get_tree($vid, $tid);
  if (count($_forums)) {
    $query = db_select('node', 'n');
    $query
      ->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
    $query
      ->join('forum', 'f', 'n.vid = f.vid');
    $query
      ->addExpression('COUNT(n.nid)', 'topic_count');
    $query
      ->addExpression('SUM(ncs.comment_count)', 'comment_count');
    $counts = $query
      ->fields('f', array(
      'tid',
    ))
      ->condition('n.status', 1)
      ->groupBy('tid')
      ->addTag('node_access')
      ->execute()
      ->fetchAllAssoc('tid');
  }
  foreach ($_forums as $forum) {

    // Determine if the child term is a container.
    if (in_array($forum->tid, variable_get('forum_containers', array()))) {
      $forum->container = 1;
    }

    // Merge in the topic and post counters.
    if (!empty($counts[$forum->tid])) {
      $forum->num_topics = $counts[$forum->tid]->topic_count;
      $forum->num_posts = $counts[$forum->tid]->topic_count + $counts[$forum->tid]->comment_count;
    }
    else {
      $forum->num_topics = 0;
      $forum->num_posts = 0;
    }

    // Query "Last Post" information for this forum.
    $query = db_select('node', 'n');
    $query
      ->join('users', 'u1', 'n.uid = u1.uid');
    $query
      ->join('forum', 'f', 'n.vid = f.vid AND f.tid = :tid', array(
      ':tid' => $forum->tid,
    ));
    $query
      ->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
    $query
      ->join('users', 'u2', 'ncs.last_comment_uid = u2.uid');
    $query
      ->addExpression('CASE ncs.last_comment_uid WHEN 0 THEN ncs.last_comment_name ELSE u2.name END', 'last_comment_name');
    $topic = $query
      ->fields('ncs', array(
      'last_comment_timestamp',
      'last_comment_uid',
    ))
      ->condition('n.status', 1)
      ->orderBy('last_comment_timestamp', 'DESC')
      ->range(0, 1)
      ->addTag('node_access')
      ->execute()
      ->fetchObject();

    // Merge in the "Last Post" information.
    $last_post = new stdClass();
    if (!empty($topic->last_comment_timestamp)) {
      $last_post->created = $topic->last_comment_timestamp;
      $last_post->name = $topic->last_comment_name;
      $last_post->uid = $topic->last_comment_uid;
    }
    $forum->last_post = $last_post;
    $forums[$forum->tid] = $forum;
  }

  // Cache the result, and return the tree.
  $forum_term->forums = $forums;
  $cache[$tid] = $forum_term;
  return $forum_term;
}