function forum_forum_load

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

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;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.