forum.module 26.9 KB
Newer Older
Dries Buytaert's avatar
   
Dries Buytaert committed
1
2
3
<?php
// $Id$

Dries Buytaert's avatar
   
Dries Buytaert committed
4
5
6
7
8
/**
 * @file
 * Enable threaded discussions about general topics.
 */

9
10
11
12
/**
 * Implementation of hook_help().
 */
function forum_help($section) {
Dries Buytaert's avatar
   
Dries Buytaert committed
13
14
  switch ($section) {
    case 'admin/help#forum':
15
      return t("
Dries Buytaert's avatar
   
Dries Buytaert committed
16
      <h3>Creating a forum</h3>
17
      <p>The forum module uses taxonomy to organize itself. To create a forum you first have to create a <a href=\"%taxonomy\">taxonomy vocabulary</a>. When doing this, choose a sensible name for it (such as \"fora\") and make sure under \"Types\" that \"forum\" is selected. Once you have done this, <a href=\"%taxo-terms\">add some terms</a> to it. Each term will become a forum. If you fill in the description field, users will be given additional information about the forum on the main forum page. For example: \"troubleshooting\" - \"Please ask your questions here.\"</p>
18
      <p>When you are happy with your vocabulary, go to <a href=\"%forums\">administer &raquo; settings &raquo; forum</a> and set <strong>Forum vocabulary</strong> to the one you have just created. There will now be fora active on the site. For users to access them they must have the \"access content\" <a href=\"%permission\">permission</a> and to create a topic they must have the \"create forum topics\" <a href=\"%permission\">permission</a>. These permissions can be set in the <a href=\"%permission\">permission</a> pages.</p>
Dries Buytaert's avatar
   
Dries Buytaert committed
19
      <h4>Icons</h4>
20
      <p>To disable icons, set the icon path as blank in <a href=\"%forums\">administer &raquo; settings &raquo; forum</a>.</p>
21
      <p>All files in the icon directory are assumed to be images. You may use images of whatever size you wish, but it is recommended to use 15x15 or 16x16.</p>", array("%taxonomy" => url('admin/taxonomy/add/vocabulary'), '%taxo-terms' => url('admin/taxonomy'), '%forums' => url('admin/settings/forum'), '%permission' => url('admin/user/configure/permission')));
Dries Buytaert's avatar
   
Dries Buytaert committed
22
    case 'admin/modules#description':
23
      return t('Enable threaded discussions about general topics.');
Dries Buytaert's avatar
   
Dries Buytaert committed
24
    case 'admin/settings/forum':
25
      return t("Forums are threaded discussions based on the taxonomy system.  For the forums to work, the taxonomy module has to be installed and enabled.  When activated, a taxonomy vocabulary (eg. \"forums\") needs to be <a href=\"%created\">created</a> and bound to the node type \"forum topic\".", array('%created' => url('admin/taxonomy/add/vocabulary')));
Dries Buytaert's avatar
   
Dries Buytaert committed
26
    case 'node/add#forum':
27
      return t('A forum is a threaded discussion, enabling users to communicate about a particular topic.');
Dries Buytaert's avatar
   
Dries Buytaert committed
28
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
29
30
31
32
33

  // The 'add forum topic' form takes a variable argument:
  if (substr($section, 0, 14) == 'node/add/forum'){
    return variable_get('forum_help', '');
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
34
35
}

36
37
38
/**
 * Implementation of hook_node_name().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
39
function forum_node_name($node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
40
  return t('forum topic');
Dries Buytaert's avatar
   
Dries Buytaert committed
41
42
}

43
44
45
/**
 * Implementation of hook_access().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
46
function forum_access($op, $node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
47
48
  if ($op == 'create') {
    return user_access('create forum topics');
Dries Buytaert's avatar
   
Dries Buytaert committed
49
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
50
51
}

52
53
54
/**
 * Implementation of hook_perm().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
55
function forum_perm() {
Dries Buytaert's avatar
   
Dries Buytaert committed
56
  return array('create forum topics');
Dries Buytaert's avatar
   
Dries Buytaert committed
57
}
Dries Buytaert's avatar
   
Dries Buytaert committed
58

59
60
61
/**
 * Implementation of hook_settings().
 */
62
function forum_settings() {
Dries Buytaert's avatar
   
Dries Buytaert committed
63

Dries Buytaert's avatar
   
Dries Buytaert committed
64
65
66
  if (module_exist('taxonomy')) {
    $vocs[0] = '<'. t('none') .'>';
    foreach (taxonomy_get_vocabularies('forum') as $vid => $voc) {
Dries Buytaert's avatar
   
Dries Buytaert committed
67
68
69
      $vocs[$vid] = $voc->name;
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
70
    if ($voc) {
71
      $group  = form_select(t('Forum vocabulary'), 'forum_nav_vocabulary', variable_get('forum_nav_vocabulary', ''), $vocs, t("The taxonomy vocabulary that will be used as the navigation tree.  The vocabulary's terms define the forums."));
72
      $group .= _taxonomy_term_select(t('Containers'), 'forum_containers', variable_get('forum_containers', array()), variable_get('forum_nav_vocabulary', ''), t('You can choose forums which will not have topics, but will be just containers for other forums.  This lets you both group and nest forums.'), 1, '<'. t('none') .'>');
Dries Buytaert's avatar
   
Dries Buytaert committed
73
      $output = form_group(t('Forum structure settings'), $group);
74

75
      $group  = form_textarea(t('Explanation or submission guidelines'), 'forum_help', variable_get('forum_help', ''), 70, 5, t('This text will be displayed at the top of the forum submission form.  It is useful for helping or instructing your users.'));
76
      $group .= form_textfield(t('Forum icon path'), 'forum_icon_path', variable_get('forum_icon_path', ''), 30, 255, t('The path to the forum icons.  Leave blank to disable icons.  Don\'t add a trailing slash.  Default icons are available in the "misc" directory.'));
77
78
79
      $group .= form_select(t('Hot topic threshold'), 'forum_hot_topic', variable_get('forum_hot_topic', 15), drupal_map_assoc(array(5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100, 10000)), t('The number of posts a topic must have to be considered <strong>hot</strong>.'));
      $group .= form_select(t('Topics per page'), 'forum_per_page', variable_get('forum_per_page', 25), drupal_map_assoc(array(10, 25, 50, 75, 100)), t('The default number of topics displayed per page; links to browse older messages are automatically being displayed.'));
      $group .= form_radios(t('Default order'), 'forum_order', variable_get('forum_order', '1'), array(1 => t('Date - newest first'), 2 => t('Date - oldest first'), 3 => t('Posts - most active first'), 4=> t('Posts - least active first')), t('The default display order for topics.'));
Dries Buytaert's avatar
   
Dries Buytaert committed
80
      $output .= form_group(t('Forum viewing options'), $group);
Dries Buytaert's avatar
   
Dries Buytaert committed
81
82
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
83

Dries Buytaert's avatar
   
Dries Buytaert committed
84
85
86
  return $output;
}

87
88
89
/**
 * Implementation of hook_taxonomy().
 */
Dries Buytaert's avatar
Dries Buytaert committed
90
function forum_taxonomy($op, $type, $object) {
Dries Buytaert's avatar
   
Dries Buytaert committed
91
92
  if ($type == 'vocabulary' && ($op == 'insert' || $op == 'update')) {
    if (variable_get('forum_nav_vocabulary', '') == '' && in_array('forum', $object['nodes'])) {
Dries Buytaert's avatar
Dries Buytaert committed
93
      // since none is already set, silently set this vocabulary as the navigation vocabulary
Dries Buytaert's avatar
   
Dries Buytaert committed
94
      variable_set('forum_nav_vocabulary', $object['vid']);
Dries Buytaert's avatar
Dries Buytaert committed
95
96
97
98
    }
  }
}

99
100
101
/**
 * Implementation of hook_load().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
102
function forum_load($node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
103
  $forum = db_fetch_object(db_query('SELECT * FROM {forum} WHERE nid = %d', $node->nid));
Dries Buytaert's avatar
   
Dries Buytaert committed
104
105
106
107

  return $forum;
}

108
109
110
111
112
113
/**
 * Implementation of hook_block().
 *
 * Generates a block containing the currently active forum topics and the
 * most recently added forum topics.
 */
114
115
116
117
118
function forum_block($op = 'list', $delta = 0, $edit = array()) {
  switch ($op) {
    case 'list':
      $blocks[0]['info'] = t('Forum topics');
      return $blocks;
Dries Buytaert's avatar
   
Dries Buytaert committed
119

120
121
122
    case 'configure':
      $output = form_select(t('Number of topics in block'), 'forum_block_num', variable_get('forum_block_num', '5'), drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)));
      return $output;
Dries Buytaert's avatar
   
Dries Buytaert committed
123

124
125
126
    case 'save':
      variable_set('forum_block_num', $edit['forum_block_num']);
      break;
Dries Buytaert's avatar
   
Dries Buytaert committed
127

128
129
    case 'view':
      if (user_access('access content')) {
Dries Buytaert's avatar
   
Dries Buytaert committed
130
        $content  = node_title_list(db_query_range("SELECT n.nid, n.title, l.last_comment_timestamp, l.comment_count FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid ". node_access_join_sql() ." WHERE n.status = 1 AND n.type='forum' AND ". node_access_where_sql() ." ORDER BY l.last_comment_timestamp DESC", 0, variable_get('forum_block_num', '5')), t('Active forum topics:'));
Dries Buytaert's avatar
   
Dries Buytaert committed
131

Dries Buytaert's avatar
   
Dries Buytaert committed
132
        $content .= node_title_list(db_query_range("SELECT n.nid, n.title, l.comment_count FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid ". node_access_join_sql() ." WHERE n.type = 'forum' AND n.status = 1 AND ". node_access_where_sql() ." ORDER BY n.nid DESC", 0, variable_get('forum_block_num', '5')), t('New forum topics:'));
Dries Buytaert's avatar
   
Dries Buytaert committed
133

134
135
136
137
138
139
140
141
142
143
        if ($content) {
          $content .= '<div class="more-link">'. l(t('more'), 'forum', array('title' => t('Read the latest forum topics.'))) .'</div>';
        }

        $block['subject'] = t('Forum topics');
        $block['content'] = $content;

        return $block;
      }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
144
145
}

Dries Buytaert's avatar
   
Dries Buytaert committed
146
147
148
/**
 * Implementation of hook_link().
 */
149
function forum_link($type, $node = 0, $main = 0) {
Dries Buytaert's avatar
Dries Buytaert committed
150
  global $user;
Dries Buytaert's avatar
   
Dries Buytaert committed
151

Dries Buytaert's avatar
   
Dries Buytaert committed
152
153
  $links = array();

Dries Buytaert's avatar
   
Dries Buytaert committed
154
155
  if ($type == 'page' && user_access('access content')) {
    $links[] = l(t('forums'), 'forum');
Dries Buytaert's avatar
   
Dries Buytaert committed
156
157
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
158
  if (!$main && $type == 'node' && $node->type == 'forum') {
Dries Buytaert's avatar
   
Dries Buytaert committed
159
160
    // get previous and next topic

Dries Buytaert's avatar
   
Dries Buytaert committed
161
    $result = db_query("SELECT n.nid, n.title, n.sticky, l.comment_count, l.last_comment_timestamp FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid " . node_access_join_sql() . " INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d WHERE n.status = 1 AND n.type='forum' AND " . node_access_where_sql() . ' ORDER BY n.sticky DESC, '. _forum_get_topic_order_sql(variable_get('forum_order', 1)), $node->tid);
Dries Buytaert's avatar
   
Dries Buytaert committed
162
163
164

    while ($topic = db_fetch_object($result)) {
      if ($stop == 1) {
165
        $next = new StdClass();
Dries Buytaert's avatar
   
Dries Buytaert committed
166
167
168
169
170
171
172
173
174
175
176
177
178
179
        $next->nid = $topic->nid;
        $next->title = $topic->title;
        break;
      }
      if ($topic->nid == $node->nid) {
        $stop = 1;
      }
      else {
        $prev->nid = $topic->nid;
        $prev->title = $topic->title;
      }
    }

    if ($prev) {
Dries Buytaert's avatar
   
Dries Buytaert committed
180
      $links[] = l(t('previous forum topic'), "node/$prev->nid", array('title' => $prev->title));
Dries Buytaert's avatar
   
Dries Buytaert committed
181
182
183
    }

    if ($next) {
Dries Buytaert's avatar
   
Dries Buytaert committed
184
      $links[] = l(t('next forum topic'), "node/$next->nid", array('title' => $next->title));
Dries Buytaert's avatar
   
Dries Buytaert committed
185
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
186
187
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
188
  return $links;
Dries Buytaert's avatar
   
Dries Buytaert committed
189
190
}

Dries Buytaert's avatar
   
Dries Buytaert committed
191
192
193
/**
 * Implementation of hook_menu().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
194
function forum_menu($may_cache) {
Dries Buytaert's avatar
   
Dries Buytaert committed
195
196
  $items = array();

Dries Buytaert's avatar
   
Dries Buytaert committed
197
198
199
200
201
202
203
204
  if ($may_cache) {
    $items[] = array('path' => 'node/add/forum', 'title' => t('forum topic'),
      'access' => user_access('create forum topics'));
    $items[] = array('path' => 'forum', 'title' => t('forums'),
      'callback' => 'forum_page',
      'access' => user_access('access content'),
      'type' => MENU_CALLBACK);
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
205
206
207
208

  return $items;
}

209
210
211
/**
 * Implementation of hook_view().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
212
function forum_view(&$node, $teaser = FALSE, $page = FALSE) {
Dries Buytaert's avatar
   
Dries Buytaert committed
213

Dries Buytaert's avatar
   
Dries Buytaert committed
214
  if ($page) {
Dries Buytaert's avatar
   
Dries Buytaert committed
215
    $vocabulary = taxonomy_get_vocabulary(variable_get('forum_nav_vocabulary', ''));
Dries Buytaert's avatar
   
Dries Buytaert committed
216
    // Breadcrumb navigation
Dries Buytaert's avatar
   
Dries Buytaert committed
217
218
    $breadcrumb = array();
    $breadcrumb[] = array('path' => 'forum', 'title' => $vocabulary->name);
Dries Buytaert's avatar
   
Dries Buytaert committed
219
    if ($parents = taxonomy_get_parents_all($node->tid)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
220
221
      $parents = array_reverse($parents);
      foreach ($parents as $p) {
Dries Buytaert's avatar
   
Dries Buytaert committed
222
        $breadcrumb[] = array('path' => 'forum/'. $p->tid, 'title' => $p->name);
Dries Buytaert's avatar
   
Dries Buytaert committed
223
224
      }
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
225
226
    $breadcrumb[] = array('path' => 'node/'. $node->nid);
    menu_set_location($breadcrumb);
227
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
228

229
  $node = node_prepare($node, $teaser);
Dries Buytaert's avatar
   
Dries Buytaert committed
230
231
}

232
233
234
235
236
237
/**
 * Implementation of hook_validate().
 *
 * Check in particular that only a "leaf" term in the associated taxonomy
 * vocabulary is selected, not a "container" term.
 */
238
239
function forum_validate(&$node) {
  // Make sure all fields are set properly:
Dries Buytaert's avatar
   
Dries Buytaert committed
240
  $node->icon = $node->icon ? $node->icon : '';
Dries Buytaert's avatar
   
Dries Buytaert committed
241
242
243

  if ($node->taxonomy) {
    // Extract the node's proper topic ID.
Dries Buytaert's avatar
   
Dries Buytaert committed
244
    $vocabulary = variable_get('forum_nav_vocabulary', '');
245
    $containers = variable_get('forum_containers', array());
Dries Buytaert's avatar
   
Dries Buytaert committed
246
    foreach ($node->taxonomy as $term) {
Dries Buytaert's avatar
   
Dries Buytaert committed
247
      if (db_result(db_query('SELECT COUNT(*) FROM {term_data} WHERE tid = %d AND vid = %d', $term, $vocabulary))) {
248
249
        if (in_array($term, $containers)) {
          $term = taxonomy_get_term($term);
Dries Buytaert's avatar
   
Dries Buytaert committed
250
          form_set_error('taxonomy', t('The item %forum is only a container for forums. Please select one of the forums below it.', array('%forum' => "<em>$term->name</em>")));
251
252
253
254
        }
        else {
          $node->tid = $term;
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
255
      }
256
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
257
258
259
260
261
262
263
    if ($node->tid && $node->shadow) {
      $terms = array_keys(taxonomy_node_get_terms($node->nid));
      if (!in_array($node->tid, $terms)) {
        $terms[] = $node->tid;
      }
      $node->taxonomy = $terms;
    }
Dries Buytaert's avatar
Dries Buytaert committed
264
265
266
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
267
268
269
270
271
272
273
/**
 * Implementation of hook_update().
 */
function forum_update($node) {
  db_query('UPDATE {forum} SET tid = %d WHERE nid = %d', $node->tid, $node->nid);
}

274
275
276
/**
 * Implementation of hook_form().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
277
function forum_form(&$node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
278
  if (!$node->nid) {
Dries Buytaert's avatar
Dries Buytaert committed
279
    // new topic
Dries Buytaert's avatar
   
Dries Buytaert committed
280
    $node->taxonomy[] = arg(3);
281
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
282
283
284
  else {
    $node->taxonomy = array($node->tid);
  }
285

Dries Buytaert's avatar
   
Dries Buytaert committed
286
  $output = implode('', taxonomy_node_form('forum', $node));
Dries Buytaert's avatar
Dries Buytaert committed
287
288
289

  if ($node->nid) {
    // if editing, give option to leave shadows
Dries Buytaert's avatar
   
Dries Buytaert committed
290
291
    $shadow = (count(taxonomy_node_get_terms($node->nid)) > 1);
    $output .= form_checkbox(t('Leave shadow copy'), 'shadow', 1, $shadow, t('If you move this topic, you can leave a link in the old forum to the new forum.'));
Dries Buytaert's avatar
Dries Buytaert committed
292
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
293

294
  $output .= form_textarea(t('Body'), 'body', $node->body, 60, 20, '');
295
  $output .= filter_form('format', $node->format);
Dries Buytaert's avatar
   
Dries Buytaert committed
296
297
298
299

  return $output;
}

300
301
302
/**
 * Implementation of hook_insert().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
303
function forum_insert($node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
304
  db_query('INSERT INTO {forum} (nid, tid) VALUES (%d, %d)', $node->nid, $node->tid);
Dries Buytaert's avatar
   
Dries Buytaert committed
305
306
}

307
308
309
/**
 * Implementation of hook_delete().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
310
function forum_delete(&$node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
311
  db_query('DELETE FROM {forum} WHERE nid = %d', $node->nid);
Dries Buytaert's avatar
   
Dries Buytaert committed
312
}
Dries Buytaert's avatar
   
Dries Buytaert committed
313

Dries Buytaert's avatar
   
Dries Buytaert committed
314
315
316
/**
 * Formats a topic for display
 *
317
 * @TODO Give a better description. Not sure where this function is used yet.
Dries Buytaert's avatar
   
Dries Buytaert committed
318
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
319
function _forum_format($topic) {
320
  if ($topic && $topic->timestamp) {
Dries Buytaert's avatar
   
Dries Buytaert committed
321
    return t('%time ago<br />by %author', array('%time' => format_interval(time() - $topic->timestamp), '%author' => format_name($topic)));
Dries Buytaert's avatar
   
Dries Buytaert committed
322
323
324
325
326
327
  }
  else {
    return message_na();
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
328
329
330
/**
 * Returns a list of all forums for a given taxonomy id
 *
331
 * Forum objects contain the following fields
Dries Buytaert's avatar
   
Dries Buytaert committed
332
333
334
335
336
337
338
339
340
 * -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
 *
 * @param $tid
 *   Taxonomy ID of the vocabulary that holds the forum list.
 * @return
 *   Array of object containing the forum information.
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
341
342
343
344
345
function forum_get_forums($tid = 0) {
  if (!$tid) {
    $tid = 0;
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
346
347
  $forums = array();
  $_forums = taxonomy_get_tree(variable_get('forum_nav_vocabulary', ''), $tid);
Dries Buytaert's avatar
   
Dries Buytaert committed
348

Dries Buytaert's avatar
   
Dries Buytaert committed
349
  if (count($_forums)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
350

Dries Buytaert's avatar
   
Dries Buytaert committed
351
352
353
354
355
356
    $counts = array();

    $_counts = db_query("SELECT r.tid, COUNT(n.nid) AS topic_count, SUM(l.comment_count) AS comment_count FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {term_node} r ON n.nid = r.nid " . node_access_join_sql() . " WHERE n.status = 1 AND n.type = 'forum' AND " . node_access_where_sql() . " GROUP BY r.tid", $forum->tid);
    while ($count = db_fetch_object($_counts)) {
      $counts[$count->tid] = $count;
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
357
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
358

Dries Buytaert's avatar
   
Dries Buytaert committed
359
360
361
362
  foreach ($_forums as $forum) {
    if (in_array($forum->tid, variable_get('forum_containers', array()))) {
      $forum->container = 1;
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
363

Dries Buytaert's avatar
   
Dries Buytaert committed
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
    if ($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;
    }

    // This query does not use full ANSI syntax since MySQL 3.x does not support
    // table1 INNER JOIN table2 INNER JOIN table3 ON table2_criteria ON table3_criteria
    // used to join node_comment_statistics to users
    $topic = db_fetch_object(db_query_range('SELECT n.nid, l.last_comment_timestamp, IF(l.last_comment_uid, cu.name, l.last_comment_name) as last_comment_name, l.last_comment_uid FROM {node} n ' . node_access_join_sql() . ", {node_comment_statistics} l /*! USE INDEX (node_comment_timestamp) */, {users} cu, {term_node} r WHERE  n.nid = r.nid AND r.tid = %d AND n.status = 1 AND n.type = 'forum' AND l.last_comment_uid = cu.uid AND n.nid = l.nid AND " . node_access_where_sql() . ' ORDER BY l.last_comment_timestamp DESC', $forum->tid, 0, 1));
    $last_post->timestamp = $topic->last_comment_timestamp;
    $last_post->name = $topic->last_comment_name;
    $last_post->uid = $topic->last_comment_uid;
    $forum->last_post = $last_post;
Dries Buytaert's avatar
   
Dries Buytaert committed
381

Dries Buytaert's avatar
   
Dries Buytaert committed
382
383
384
385
    $forums[$forum->tid] = $forum;
  }

  return $forums;
Dries Buytaert's avatar
   
Dries Buytaert committed
386
387
}

388
389
390
391
function _forum_topics_read($term, $uid) {
  // Calculate the number of topics the user has read. Assume all entries older
  // than NODE_NEW_LIMIT are read, and include the recent posts that user has
  // read.
392
393
  $ancient = db_result(db_query("SELECT COUNT(n.nid) FROM {node} n INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d ". node_access_join_sql() ." WHERE n.created <= %d AND n.status = 1 AND n.type = 'forum' AND ". node_access_where_sql(), $term, NODE_NEW_LIMIT));
  $recent = db_result(db_query("SELECT COUNT(n.nid) FROM {node} n ". node_access_join_sql() ." INNER JOIN {history} h ON n.nid = h.nid AND h.uid = %d INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d WHERE n.status = 1 AND n.type = 'forum' AND n.created > %d AND ". node_access_where_sql(), $uid, $term, NODE_NEW_LIMIT));
Dries Buytaert's avatar
   
Dries Buytaert committed
394

395
  return $ancient + $recent;
Dries Buytaert's avatar
   
Dries Buytaert committed
396
397
}

Dries Buytaert's avatar
Dries Buytaert committed
398
function forum_get_topics($tid, $sortby, $forum_per_page) {
Dries Buytaert's avatar
   
Dries Buytaert committed
399
  global $user, $forum_topic_list_header;
Dries Buytaert's avatar
   
Dries Buytaert committed
400

Dries Buytaert's avatar
   
Dries Buytaert committed
401
  $forum_topic_list_header = array(
Dries Buytaert's avatar
   
Dries Buytaert committed
402
403
    array('data' => '&nbsp;'),
    array('data' => t('Topic'), 'field' => 'n.title'),
Dries Buytaert's avatar
   
Dries Buytaert committed
404
    array('data' => t('Replies'), 'field' => 'l.comment_count'),
Dries Buytaert's avatar
   
Dries Buytaert committed
405
    array('data' => t('Created'), 'field' => 'n.created'),
Dries Buytaert's avatar
   
Dries Buytaert committed
406
    array('data' => t('Last reply'), 'field' => 'l.last_comment_timestamp'),
Dries Buytaert's avatar
   
Dries Buytaert committed
407
  );
Dries Buytaert's avatar
   
Dries Buytaert committed
408

Dries Buytaert's avatar
   
Dries Buytaert committed
409
  $order = _forum_get_topic_order($sortby);
Dries Buytaert's avatar
   
Dries Buytaert committed
410
  for ($i = 0; $i < count($forum_topic_list_header); $i++) {
Dries Buytaert's avatar
   
Dries Buytaert committed
411
412
    if ($forum_topic_list_header[$i]['field'] == $order['field']) {
      $forum_topic_list_header[$i]['sort'] = $order['sort'];
Dries Buytaert's avatar
   
Dries Buytaert committed
413
414
415
416
    }
  }

  $term = taxonomy_get_term($tid);
Dries Buytaert's avatar
   
Dries Buytaert committed
417
  $check_tid = $tid ? "'". check_query($tid) ."'" : 'NULL';
Dries Buytaert's avatar
   
Dries Buytaert committed
418

Dries Buytaert's avatar
   
Dries Buytaert committed
419
  $sql = "SELECT n.nid, f.tid, n.title, n.sticky, u.name, u.uid, n.created AS timestamp, n.comment AS comment_mode, l.last_comment_timestamp, IF(l.last_comment_uid, cu.name, l.last_comment_name) as last_comment_name, l.last_comment_uid, l.comment_count AS num_comments FROM {node} n ". node_access_join_sql() .", {node_comment_statistics} l, {users} cu, {term_node} r, {users} u, {forum} f WHERE n.status = 1 AND l.last_comment_uid = cu.uid AND n.nid = l.nid AND n.nid = r.nid AND r.tid = $check_tid AND n.uid = u.uid AND n.nid = f.nid AND ". node_access_where_sql();
Dries Buytaert's avatar
   
Dries Buytaert committed
420
  $sql .= tablesort_sql($forum_topic_list_header, 'n.sticky DESC,');
Dries Buytaert's avatar
Dries Buytaert committed
421

Dries Buytaert's avatar
   
Dries Buytaert committed
422
  $sql_count = "SELECT COUNT(n.nid) FROM {node} n ". node_access_join_sql() ." INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = $check_tid WHERE n.status = 1 AND n.type = 'forum' AND ". node_access_where_sql();
Dries Buytaert's avatar
   
Dries Buytaert committed
423

Dries Buytaert's avatar
Dries Buytaert committed
424
  $result = pager_query($sql, $forum_per_page, 0, $sql_count);
Dries Buytaert's avatar
   
Dries Buytaert committed
425
426

  while ($topic = db_fetch_object($result)) {
Dries Buytaert's avatar
Dries Buytaert committed
427
428
    if ($user->uid) {
      // folder is new if topic is new or there are new comments since last visit
Dries Buytaert's avatar
   
Dries Buytaert committed
429
      if ($topic->tid != $tid) {
Dries Buytaert's avatar
Dries Buytaert committed
430
        $topic->new = 0;
Dries Buytaert's avatar
   
Dries Buytaert committed
431
432
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
433
        $history = _forum_user_last_visit($topic->nid);
Dries Buytaert's avatar
   
Dries Buytaert committed
434
        $topic->new_replies = comment_num_new($topic->nid, $history);
435
        $topic->new = $topic->new_replies || ($topic->timestamp > $history);
Dries Buytaert's avatar
   
Dries Buytaert committed
436
      }
437
438
    }
    else {
439
      // Do not track "new replies" status for topics if the user is anonymous.
Dries Buytaert's avatar
Dries Buytaert committed
440
441
      $topic->new_replies = 0;
      $topic->new = 0;
442
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
443

Dries Buytaert's avatar
   
Dries Buytaert committed
444
445
446
447
448
449
    if ($topic->num_comments > 0) {
      $last_reply->timestamp = $topic->last_comment_timestamp;
      $last_reply->name = $topic->last_comment_name;
      $last_reply->uid = $topic->last_comment_uid;
      $topic->last_reply = $last_reply;
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
450
451
452
    $topics[] = $topic;
  }

Dries Buytaert's avatar
Dries Buytaert committed
453
  return $topics;
Dries Buytaert's avatar
   
Dries Buytaert committed
454
455
}

Dries Buytaert's avatar
   
Dries Buytaert committed
456
457
458
/**
 * Finds the first unread node for a given forum.
 */
Dries Buytaert's avatar
Dries Buytaert committed
459
function _forum_new($tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
460
461
  global $user;

462
  $nid = db_result(db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {history} h ON n.nid = h.nid AND h.uid = %d INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d " . node_access_join_sql() . " WHERE n.status = 1 AND n.type = 'forum' AND h.nid IS NULL AND n.created > %d AND " . node_access_where_sql() . " ORDER BY created", $user->uid, $tid, NODE_NEW_LIMIT, 0, 1));
Dries Buytaert's avatar
   
Dries Buytaert committed
463
464
465
466

  return $nid ? $nid : 0;
}

467
/**
468
 * Menu callback; prints a forum listing.
469
470
 */
function forum_page($tid = 0, $display = 'all') {
Dries Buytaert's avatar
   
Dries Buytaert committed
471
  global $user;
Dries Buytaert's avatar
   
Dries Buytaert committed
472

Dries Buytaert's avatar
   
Dries Buytaert committed
473
  if (module_exist('taxonomy')) {
474
    if ($display == 'new') {
Dries Buytaert's avatar
   
Dries Buytaert committed
475
      if ($nid = _forum_new($tid)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
476
        drupal_goto("node/$nid");
Dries Buytaert's avatar
   
Dries Buytaert committed
477
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
478
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
479
    else {
Dries Buytaert's avatar
   
Dries Buytaert committed
480
481
      $forum_per_page = variable_get('forum_per_page', 25);
      $sortby = variable_get('forum_order', 1);
Dries Buytaert's avatar
   
Dries Buytaert committed
482

Dries Buytaert's avatar
   
Dries Buytaert committed
483
484
485
486
487
      $forums = forum_get_forums($tid);
      $parents = taxonomy_get_parents_all($tid);
      if ($tid && !in_array($tid, variable_get('forum_containers', array()))) {
        $topics = forum_get_topics($tid, $sortby, $forum_per_page);
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
488

Dries Buytaert's avatar
   
Dries Buytaert committed
489
      print theme('forum_display', $forums, $topics, $parents, $tid, $sortby, $forum_per_page);
Dries Buytaert's avatar
   
Dries Buytaert committed
490
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
491
492
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
493
    print theme('page', forum_help('admin/settings/forum'), t('Warning'));
Dries Buytaert's avatar
   
Dries Buytaert committed
494
495
496
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
497
/**
Dries Buytaert's avatar
   
Dries Buytaert committed
498
499
 * Format the forum body.
 *
Dries Buytaert's avatar
   
Dries Buytaert committed
500
 * @ingroup themeable
Dries Buytaert's avatar
   
Dries Buytaert committed
501
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
502
function theme_forum_display($forums, $topics, $parents, $tid, $sortby, $forum_per_page) {
Dries Buytaert's avatar
   
Dries Buytaert committed
503
  global $user;
Dries Buytaert's avatar
   
Dries Buytaert committed
504
  // forum list, topics list, topic browser and 'add new topic' link
Dries Buytaert's avatar
   
Dries Buytaert committed
505

Dries Buytaert's avatar
   
Dries Buytaert committed
506
507
  $vocabulary = taxonomy_get_vocabulary(variable_get('forum_nav_vocabulary', ''));
  $title = $vocabulary->name;
Dries Buytaert's avatar
   
Dries Buytaert committed
508

Dries Buytaert's avatar
   
Dries Buytaert committed
509
510
  // Breadcrumb navigation:
  $breadcrumb = array();
Dries Buytaert's avatar
   
Dries Buytaert committed
511
  if ($tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
512
    $breadcrumb[] = array('path' => 'forum', 'title' => $title);
Dries Buytaert's avatar
   
Dries Buytaert committed
513
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
514
515

  if ($parents) {
Dries Buytaert's avatar
   
Dries Buytaert committed
516
517
    $parents = array_reverse($parents);
    foreach ($parents as $p) {
518
519
      if ($p->tid == $tid) {
        $title = $p->name;
Dries Buytaert's avatar
   
Dries Buytaert committed
520
521
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
522
        $breadcrumb[] = array('path' => 'forum/'. $p->tid, 'title' => $p->name);
Dries Buytaert's avatar
   
Dries Buytaert committed
523
524
525
      }
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
526
527
  $breadcrumb[] = array('path' => $_GET['q']);
  menu_set_location($breadcrumb);
Dries Buytaert's avatar
   
Dries Buytaert committed
528

Dries Buytaert's avatar
   
Dries Buytaert committed
529
  if (count($forums) || count($parents)) {
530
531
    $output  = '<div id="forum">';
    $output .= '<ul>';
Dries Buytaert's avatar
   
Dries Buytaert committed
532
533
534

    if (module_exist('tracker')) {
      if ($user->uid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
535
        $output .= ' <li>'. l(t('My forum discussions.'), "tracker/$user->uid") .'</li>';
Dries Buytaert's avatar
   
Dries Buytaert committed
536
537
      }

Dries Buytaert's avatar
   
Dries Buytaert committed
538
      $output .= ' <li>'. l(t('Active forum discussions.'), 'tracker') .'</li>';
Dries Buytaert's avatar
   
Dries Buytaert committed
539
540
541
    }

    if (user_access('create forum topics')) {
542
      $output .= '<li>'. l(t('Post new forum topic.'), "node/add/forum/$tid") .'</li>';
Dries Buytaert's avatar
   
Dries Buytaert committed
543
544
    }
    else if ($user->uid) {
545
      $output .= '<li>'. t('You are not allowed to post a new forum topic.') .'</li>';
Dries Buytaert's avatar
   
Dries Buytaert committed
546
547
548
549
    }
    else {
      $output .= '<li>'. t('<a href="%login">Login</a> to post a new forum topic.', array('%login' => url('user/login'))) .'</li>';
    }
550
    $output .= '</ul>';
Dries Buytaert's avatar
   
Dries Buytaert committed
551

Dries Buytaert's avatar
   
Dries Buytaert committed
552
    $output .= theme('forum_list', $forums, $parents, $tid);
Dries Buytaert's avatar
   
Dries Buytaert committed
553

Dries Buytaert's avatar
   
Dries Buytaert committed
554
    if ($tid && !in_array($tid, variable_get('forum_containers', array()))) {
Dries Buytaert's avatar
   
Dries Buytaert committed
555
      $output .= theme('forum_topic_list', $tid, $topics, $sortby, $forum_per_page);
Dries Buytaert's avatar
   
Dries Buytaert committed
556
    }
557
    $output .= '</div>';
Dries Buytaert's avatar
   
Dries Buytaert committed
558
559
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
560
    $title = t('No forums defined');
Dries Buytaert's avatar
   
Dries Buytaert committed
561
    $output = '';
Dries Buytaert's avatar
   
Dries Buytaert committed
562
563
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
564
  print theme('page', $output, $title);
Dries Buytaert's avatar
   
Dries Buytaert committed
565
566
}

Dries Buytaert's avatar
   
Dries Buytaert committed
567
/**
Dries Buytaert's avatar
   
Dries Buytaert committed
568
569
 * Format the forum listing.
 *
Dries Buytaert's avatar
   
Dries Buytaert committed
570
 * @ingroup themeable
Dries Buytaert's avatar
   
Dries Buytaert committed
571
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
572
function theme_forum_list($forums, $parents, $tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
573
574
  global $user;

Dries Buytaert's avatar
   
Dries Buytaert committed
575
576
  if ($forums) {

Dries Buytaert's avatar
   
Dries Buytaert committed
577
    $header = array(t('Forum'), t('Topics'), t('Posts'), t('Last post'));
Dries Buytaert's avatar
   
Dries Buytaert committed
578
579

    foreach ($forums as $forum) {
Dries Buytaert's avatar
   
Dries Buytaert committed
580
      if ($forum->container) {
581
582
        $description  = '<div style="margin-left: '. ($forum->depth * 30) ."px;\">\n";
        $description .= ' <div class="name">'. l($forum->name, "forum/$forum->tid") ."</div>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
583
584
585
586
587
588

        if ($forum->description) {
          $description .= " <div class=\"description\">$forum->description</div>\n";
        }
        $description .= "</div>\n";

Dries Buytaert's avatar
   
Dries Buytaert committed
589
        $rows[] = array(array('data' => $description, 'class' => 'container', 'colspan' => 4));
590
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
591
      else {
592
        $forum->old_topics = _forum_topics_read($forum->tid, $user->uid);
Dries Buytaert's avatar
   
Dries Buytaert committed
593
594
595
        if ($user->uid) {
          $new_topics = $forum->num_topics - $forum->old_topics;
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
596
597
598
        else {
          $new_topics = 0;
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
599

600
601
        $description  = '<div style="margin-left: '. ($forum->depth * 30) ."px;\">\n";
        $description .= ' <div class="name">'. l($forum->name, "forum/$forum->tid") ."</div>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
602

Dries Buytaert's avatar
   
Dries Buytaert committed
603
604
605
606
        if ($forum->description) {
          $description .= " <div class=\"description\">$forum->description</div>\n";
        }
        $description .= "</div>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
607

Dries Buytaert's avatar
   
Dries Buytaert committed
608
        $rows[] = array(
Dries Buytaert's avatar
   
Dries Buytaert committed
609
          array('data' => $description, 'class' => 'forum'),
610
          array('data' => $forum->num_topics . ($new_topics ? '<br />'. l(t('%a new', array('%a' => $new_topics)), "forum/$forum->tid", NULL, NULL, 'new') : ''), 'class' => 'topics'),
Dries Buytaert's avatar
   
Dries Buytaert committed
611
612
          array('data' => $forum->num_posts, 'class' => 'posts'),
          array('data' => _forum_format($forum->last_post), 'class' => 'last-reply'));
Dries Buytaert's avatar
   
Dries Buytaert committed
613
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
614
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
615
616
617

    return theme('table', $header, $rows);

Dries Buytaert's avatar
   
Dries Buytaert committed
618
619
620
621
  }

}

Dries Buytaert's avatar
   
Dries Buytaert committed
622
/**
Dries Buytaert's avatar
   
Dries Buytaert committed
623
624
 * Format the topic listing.
 *
Dries Buytaert's avatar
   
Dries Buytaert committed
625
 * @ingroup themeable
Dries Buytaert's avatar
   
Dries Buytaert committed
626
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
627
628
function theme_forum_topic_list($tid, $topics, $sortby, $forum_per_page) {
  global $forum_topic_list_header;
Dries Buytaert's avatar
   
Dries Buytaert committed
629
630

  if ($topics) {
Dries Buytaert's avatar
   
Dries Buytaert committed
631

Dries Buytaert's avatar
   
Dries Buytaert committed
632
633
    foreach ($topics as $topic) {
      // folder is new if topic is new or there are new comments since last visit
Dries Buytaert's avatar
Dries Buytaert committed
634
      if ($topic->tid != $tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
635
        $rows[] = array(
Dries Buytaert's avatar
   
Dries Buytaert committed
636
          array('data' => _forum_icon($topic->new, $topic->num_comments, $topic->comment_mode, $topic->sticky), 'class' => 'icon'),
Dries Buytaert's avatar
   
Dries Buytaert committed
637
638
          array('data' => $topic->title, 'class' => 'title'),
          array('data' => l(t('This topic has been moved'), "forum/$topic->tid"), 'colspan' => '3')
Dries Buytaert's avatar
   
Dries Buytaert committed
639
        );
Dries Buytaert's avatar
   
Dries Buytaert committed
640
641
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
642
        $rows[] = array(
Dries Buytaert's avatar
   
Dries Buytaert committed
643
          array('data' => _forum_icon($topic->new, $topic->num_comments, $topic->comment_mode, $topic->sticky), 'class' => 'icon'),
Dries Buytaert's avatar
   
Dries Buytaert committed
644
645
          array('data' => l($topic->title, "node/$topic->nid"), 'class' => 'topic'),
          array('data' => $topic->num_comments . ($topic->new_replies ? '<br />'. l(t('%a new', array('%a' => $topic->new_replies)), "node/$topic->nid", NULL, NULL, 'new') : ''), 'class' => 'replies'),
Dries Buytaert's avatar
   
Dries Buytaert committed
646
647
          array('data' => _forum_format($topic), 'class' => 'created'),
          array('data' => _forum_format($topic->last_reply), 'class' => 'last-reply')
Dries Buytaert's avatar
   
Dries Buytaert committed
648
        );
Dries Buytaert's avatar
   
Dries Buytaert committed
649
650
651
      }
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
652
653
    if ($pager = theme('pager', NULL, $forum_per_page, 0, tablesort_pager())) {
      $rows[] = array(array('data' => $pager, 'colspan' => '5', 'class' => 'pager'));
Dries Buytaert's avatar
   
Dries Buytaert committed
654
655
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
656

Dries Buytaert's avatar
   
Dries Buytaert committed
657
  $output .= theme('table', $forum_topic_list_header, $rows);
Dries Buytaert's avatar
   
Dries Buytaert committed
658

Dries Buytaert's avatar
   
Dries Buytaert committed
659
660
661
  return $output;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
662
function _forum_icon($new_posts, $num_posts = 0, $comment_mode = 0, $sticky = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
663

Dries Buytaert's avatar
   
Dries Buytaert committed
664
  $base_path = variable_get('forum_icon_path', '');
Dries Buytaert's avatar
   
Dries Buytaert committed
665
  if ($base_path) {
Dries Buytaert's avatar
   
Dries Buytaert committed
666
667
    if ($num_posts > variable_get('forum_hot_topic', 15)) {
      $icon = $new_posts ? 'hot-new' : 'hot';
Dries Buytaert's avatar
   
Dries Buytaert committed
668
669
    }
    else {
Dries Buytaert's avatar
   
Dries Buytaert committed
670
      $icon = $new_posts ? 'new' : 'default';
Dries Buytaert's avatar
   
Dries Buytaert committed
671
672
673
    }

    if ($comment_mode == 1) {
Dries Buytaert's avatar
   
Dries Buytaert committed
674
      $icon = 'closed';
Dries Buytaert's avatar
   
Dries Buytaert committed
675
676
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
677
678
679
680
    if ($sticky == 1) {
      $icon = 'sticky';
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
681
    // default
Dries Buytaert's avatar
   
Dries Buytaert committed
682
    $file = "misc/forum-$icon.png";
Dries Buytaert's avatar
   
Dries Buytaert committed
683

Dries Buytaert's avatar
   
Dries Buytaert committed
684
    $output = theme('image', $file);
Dries Buytaert's avatar
   
Dries Buytaert committed
685
686
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
687
    $output = '&nbsp;';
Dries Buytaert's avatar
   
Dries Buytaert committed
688
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
689
690
691
692
693
694

  if ($new_posts) {
    $output = "<a name=\"new\">$output</a>";
  }

  return $output;
Dries Buytaert's avatar
   
Dries Buytaert committed
695
696
697
698
}

function _forum_user_last_visit($nid) {
  global $user;
699
700
701
  static $history = array();

  if (empty($history)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
702
    $result = db_query('SELECT nid, timestamp FROM {history} WHERE uid = %d', $user->uid);
Dries Buytaert's avatar
   
Dries Buytaert committed
703
    while ($t = db_fetch_object($result)) {
704
      $history[$t->nid] = $t->timestamp > NODE_NEW_LIMIT ? $t->timestamp : NODE_NEW_LIMIT;
Dries Buytaert's avatar
   
Dries Buytaert committed
705
706
    }
  }
707
  return $history[$nid] ? $history[$nid] : NODE_NEW_LIMIT;
Dries Buytaert's avatar
   
Dries Buytaert committed
708
709
710
711
712
}

function _forum_get_topic_order($sortby) {
  switch ($sortby) {
    case 1:
Dries Buytaert's avatar
   
Dries Buytaert committed
713
      return array('field' => 'l.last_comment_timestamp', 'sort' => 'desc');
Dries Buytaert's avatar
   
Dries Buytaert committed
714
715
      break;
    case 2:
Dries Buytaert's avatar
   
Dries Buytaert committed
716
      return array('field' => 'l.last_comment_timestamp', 'sort' => 'asc');
Dries Buytaert's avatar
   
Dries Buytaert committed
717
718
      break;
    case 3:
Dries Buytaert's avatar
   
Dries Buytaert committed
719
      return array('field' => 'l.comment_count', 'sort' => 'desc');
Dries Buytaert's avatar
   
Dries Buytaert committed
720
721
      break;
    case 4:
Dries Buytaert's avatar
   
Dries Buytaert committed
722
      return array('field' => 'l.comment_count', 'sort' => 'asc');
Dries Buytaert's avatar
   
Dries Buytaert committed
723
724
725
726
      break;
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
727
728
729
730
731
function _forum_get_topic_order_sql($sortby) {
  $order = _forum_get_topic_order($sortby);
  return $order['field'] .' '. $order['sort'];
}

Dries Buytaert's avatar
   
Dries Buytaert committed
732
?>