forum.module 27 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
17
      <h3>Creating a forum</h3>
      <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 additonal 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') .'>');
73

Dries Buytaert's avatar
   
Dries Buytaert committed
74
      $output = form_group(t('Forum structure settings'), $group);
75

Dries Buytaert's avatar
   
Dries Buytaert committed
76
      $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.  Useful for helping or instructing your users.'));
77
      $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.'));
Dries Buytaert's avatar
   
Dries Buytaert committed
78
      $number = drupal_map_assoc(array(5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100, 10000));
Dries Buytaert's avatar
   
Dries Buytaert committed
79
      $group .= form_select(t('Hot topic threshold'), 'forum_hot_topic', variable_get('forum_hot_topic', 15), $number, t('The number of posts a topic must have to be considered <strong>hot</strong>.'));
Dries Buytaert's avatar
   
Dries Buytaert committed
80
      $number = drupal_map_assoc(array(10, 25, 50, 75, 100));
Dries Buytaert's avatar
   
Dries Buytaert committed
81
82
83
      $group .= form_select(t('Topics per page'), 'forum_per_page', variable_get('forum_per_page', 25), $number, t('The default number of topics displayed per page; links to browse older messages are automatically being displayed.'));
      $forder = array(1 => t('Date - newest first'), 2 => t('Date - oldest first'), 3 => t('Posts - most active first'), 4=> t('Posts - least active first'));
      $group .= form_radios(t('Default order'), 'forum_order', variable_get('forum_order', '1'), $forder, t('The default display order for topics.'));
Dries Buytaert's avatar
   
Dries Buytaert committed
84
      $output .= form_group(t('Forum viewing options'), $group);
85

86
      $group = 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)), t('The number of topics to show in the "Forum topics" block.  To enable the block, go to the <a href="%block-administration">block administration</a> page.', array('%block-administration' => url('admin/block'))));
Dries Buytaert's avatar
   
Dries Buytaert committed
87
      $output .= form_group(t('"Forum topic" block settings'), $group);
Dries Buytaert's avatar
   
Dries Buytaert committed
88
89
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
90

Dries Buytaert's avatar
   
Dries Buytaert committed
91
92
93
  return $output;
}

94
95
96
/**
 * Implementation of hook_taxonomy().
 */
Dries Buytaert's avatar
Dries Buytaert committed
97
function forum_taxonomy($op, $type, $object) {
Dries Buytaert's avatar
   
Dries Buytaert committed
98
99
  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
100
      // since none is already set, silently set this vocabulary as the navigation vocabulary
Dries Buytaert's avatar
   
Dries Buytaert committed
101
      variable_set('forum_nav_vocabulary', $object['vid']);
Dries Buytaert's avatar
Dries Buytaert committed
102
103
104
105
    }
  }
}

106
107
108
/**
 * Implementation of hook_load().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
109
function forum_load($node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
110
  $forum = db_fetch_object(db_query('SELECT * FROM {forum} WHERE nid = %d', $node->nid));
Dries Buytaert's avatar
   
Dries Buytaert committed
111
112
113
114

  return $forum;
}

115
116
117
118
119
120
/**
 * Implementation of hook_block().
 *
 * Generates a block containing the currently active forum topics and the
 * most recently added forum topics.
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
121
function forum_block($op = 'list', $delta = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
122

Dries Buytaert's avatar
   
Dries Buytaert committed
123
124
  if ($op == 'list') {
    $blocks[0]['info'] = t('Forum topics');
125
126
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
127
    if (user_access('access content')) {
Dries Buytaert's avatar
   
Dries Buytaert committed
128
      $content  = node_title_list(db_query_range("SELECT n.nid, n.title, l.last_comment_timestamp 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
129

Dries Buytaert's avatar
   
Dries Buytaert committed
130
      $content .= node_title_list(db_query_range("SELECT n.nid, n.title FROM {node} n ". 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
131

Dries Buytaert's avatar
   
Dries Buytaert committed
132
      if ($content) {
133
        $content .= '<div class="more-link">'. l(t('more'), 'forum', array('title' => t('Read the latest forum topics.'))) .'</div>';
Dries Buytaert's avatar
   
Dries Buytaert committed
134
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
135

Dries Buytaert's avatar
   
Dries Buytaert committed
136
137
      $blocks['subject'] = t('Forum topics');
      $blocks['content'] = $content;
Dries Buytaert's avatar
   
Dries Buytaert committed
138
139
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
140

Dries Buytaert's avatar
   
Dries Buytaert committed
141
142
143
  return $blocks;
}

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

Dries Buytaert's avatar
   
Dries Buytaert committed
150
151
  $links = array();

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
159
    $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
160
161
162

    while ($topic = db_fetch_object($result)) {
      if ($stop == 1) {
163
        $next = new StdClass();
Dries Buytaert's avatar
   
Dries Buytaert committed
164
165
166
167
168
169
170
171
172
173
174
175
176
177
        $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
178
      $links[] = l(t('previous forum topic'), "node/$prev->nid", array('title' => $prev->title));
Dries Buytaert's avatar
   
Dries Buytaert committed
179
180
181
    }

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

Dries Buytaert's avatar
   
Dries Buytaert committed
186
  return $links;
Dries Buytaert's avatar
   
Dries Buytaert committed
187
188
}

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

Dries Buytaert's avatar
   
Dries Buytaert committed
195
196
197
198
199
200
201
202
  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
203
204
205
206

  return $items;
}

207
208
209
/**
 * Implementation of hook_content().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
210
211
function forum_content($node, $teaser = FALSE) {
  return node_prepare($node, $teaser);
Dries Buytaert's avatar
   
Dries Buytaert committed
212
213
}

214
215
216
/**
 * Implementation of hook_view().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
217
function forum_view(&$node, $teaser = FALSE, $page = FALSE) {
Dries Buytaert's avatar
   
Dries Buytaert committed
218

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

Dries Buytaert's avatar
   
Dries Buytaert committed
234
  $node = forum_content($node, $teaser);
Dries Buytaert's avatar
   
Dries Buytaert committed
235
236
}

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

  if ($node->taxonomy) {
    // Extract the node's proper topic ID.
Dries Buytaert's avatar
   
Dries Buytaert committed
249
    $vocabulary = variable_get('forum_nav_vocabulary', '');
250
    $containers = variable_get('forum_containers', array());
Dries Buytaert's avatar
   
Dries Buytaert committed
251
    foreach ($node->taxonomy as $term) {
Dries Buytaert's avatar
   
Dries Buytaert committed
252
      if (db_result(db_query('SELECT COUNT(*) FROM {term_data} WHERE tid = %d AND vid = %d', $term, $vocabulary))) {
253
254
        if (in_array($term, $containers)) {
          $term = taxonomy_get_term($term);
Dries Buytaert's avatar
   
Dries Buytaert committed
255
          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>")));
256
257
258
259
        }
        else {
          $node->tid = $term;
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
260
      }
261
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
262
263
264
265
266
267
268
    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
269
270
271
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
272
273
274
275
276
277
278
/**
 * Implementation of hook_update().
 */
function forum_update($node) {
  db_query('UPDATE {forum} SET tid = %d WHERE nid = %d', $node->tid, $node->nid);
}

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

Dries Buytaert's avatar
   
Dries Buytaert committed
291
  $output = implode('', taxonomy_node_form('forum', $node));
Dries Buytaert's avatar
Dries Buytaert committed
292
293
294

  if ($node->nid) {
    // if editing, give option to leave shadows
Dries Buytaert's avatar
   
Dries Buytaert committed
295
296
    $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
297
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
298

299
  $output .= form_textarea(t('Body'), 'body', $node->body, 60, 10, '');
Dries Buytaert's avatar
   
Dries Buytaert committed
300
301
302
303

  return $output;
}

304
305
306
/**
 * Implementation of hook_insert().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
307
function forum_insert($node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
308
309
  global $user;
  db_query('INSERT INTO {forum} (nid, tid) VALUES (%d, %d)', $node->nid, $node->tid);
Dries Buytaert's avatar
   
Dries Buytaert committed
310
311
}

312
313
314
/**
 * Implementation of hook_delete().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
315
function forum_delete(&$node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
316
  db_query('DELETE FROM {forum} WHERE nid = %d', $node->nid);
Dries Buytaert's avatar
   
Dries Buytaert committed
317
}
Dries Buytaert's avatar
   
Dries Buytaert committed
318

Dries Buytaert's avatar
   
Dries Buytaert committed
319
320
321
322
323
/**
 * Formats a topic for display
 *
 * @TODO Give a better description. Not sure where this funciton is used yet.
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
324
function _forum_format($topic) {
325
  if ($topic && $topic->timestamp) {
Dries Buytaert's avatar
   
Dries Buytaert committed
326
    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
327
328
329
330
331
332
  }
  else {
    return message_na();
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
333
334
335
336
337
338
339
340
341
342
343
344
345
/**
 * Returns a list of all forums for a given taxonomy id
 *
 * Forum objects containt the following fields
 * -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
346
347
348
349
350
function forum_get_forums($tid = 0) {
  if (!$tid) {
    $tid = 0;
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
351
352
  $forums = array();
  $_forums = taxonomy_get_tree(variable_get('forum_nav_vocabulary', ''), $tid);
Dries Buytaert's avatar
   
Dries Buytaert committed
353

Dries Buytaert's avatar
   
Dries Buytaert committed
354
  if (count($_forums)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
355

Dries Buytaert's avatar
   
Dries Buytaert committed
356
357
358
359
360
361
    $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
362
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
363

Dries Buytaert's avatar
   
Dries Buytaert committed
364
365
366
367
  foreach ($_forums as $forum) {
    if (in_array($forum->tid, variable_get('forum_containers', array()))) {
      $forum->container = 1;
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
368

Dries Buytaert's avatar
   
Dries Buytaert committed
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
    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
386

Dries Buytaert's avatar
   
Dries Buytaert committed
387
388
389
390
    $forums[$forum->tid] = $forum;
  }

  return $forums;
Dries Buytaert's avatar
   
Dries Buytaert committed
391
392
}

393
394
395
396
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.
Dries Buytaert's avatar
   
Dries Buytaert committed
397
398
  $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 '. 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.created > %d AND '. node_access_where_sql(), $uid, $term, NODE_NEW_LIMIT));
Dries Buytaert's avatar
   
Dries Buytaert committed
399

400
  return $ancient + $recent;
Dries Buytaert's avatar
   
Dries Buytaert committed
401
402
}

Dries Buytaert's avatar
Dries Buytaert committed
403
function forum_get_topics($tid, $sortby, $forum_per_page) {
Dries Buytaert's avatar
   
Dries Buytaert committed
404
  global $user, $forum_topic_list_header;
Dries Buytaert's avatar
   
Dries Buytaert committed
405

Dries Buytaert's avatar
   
Dries Buytaert committed
406
  $forum_topic_list_header = array(
Dries Buytaert's avatar
   
Dries Buytaert committed
407
408
    array('data' => '&nbsp;'),
    array('data' => t('Topic'), 'field' => 'n.title'),
Dries Buytaert's avatar
   
Dries Buytaert committed
409
    array('data' => t('Replies'), 'field' => 'l.comment_count'),
Dries Buytaert's avatar
   
Dries Buytaert committed
410
    array('data' => t('Created'), 'field' => 'n.created'),
Dries Buytaert's avatar
   
Dries Buytaert committed
411
    array('data' => t('Last reply'), 'field' => 'l.last_comment_timestamp'),
Dries Buytaert's avatar
   
Dries Buytaert committed
412
  );
Dries Buytaert's avatar
   
Dries Buytaert committed
413

Dries Buytaert's avatar
   
Dries Buytaert committed
414
  $order = _forum_get_topic_order($sortby);
Dries Buytaert's avatar
   
Dries Buytaert committed
415
  for ($i = 0; $i < count($forum_topic_list_header); $i++) {
Dries Buytaert's avatar
   
Dries Buytaert committed
416
417
    if ($forum_topic_list_header[$i]['field'] == $order['field']) {
      $forum_topic_list_header[$i]['sort'] = $order['sort'];
Dries Buytaert's avatar
   
Dries Buytaert committed
418
419
420
421
    }
  }

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

Dries Buytaert's avatar
   
Dries Buytaert committed
424
  $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
425
  $sql .= tablesort_sql($forum_topic_list_header, 'n.sticky DESC,');
Dries Buytaert's avatar
Dries Buytaert committed
426

Dries Buytaert's avatar
   
Dries Buytaert committed
427
  $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
428

Dries Buytaert's avatar
Dries Buytaert committed
429
  $result = pager_query($sql, $forum_per_page, 0, $sql_count);
Dries Buytaert's avatar
   
Dries Buytaert committed
430
431

  while ($topic = db_fetch_object($result)) {
Dries Buytaert's avatar
Dries Buytaert committed
432
433
    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
434
      if ($topic->tid != $tid) {
Dries Buytaert's avatar
Dries Buytaert committed
435
        $topic->new = 0;
Dries Buytaert's avatar
   
Dries Buytaert committed
436
437
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
438
        $history = _forum_user_last_visit($topic->nid);
Dries Buytaert's avatar
   
Dries Buytaert committed
439
        $topic->new_replies = comment_num_new($topic->nid, $history);
440
        $topic->new = $topic->new_replies || ($topic->timestamp > $history);
Dries Buytaert's avatar
   
Dries Buytaert committed
441
      }
442
443
    }
    else {
444
      // Do not track "new replies" status for topics if the user is anonymous.
Dries Buytaert's avatar
Dries Buytaert committed
445
446
      $topic->new_replies = 0;
      $topic->new = 0;
447
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
448

Dries Buytaert's avatar
   
Dries Buytaert committed
449
450
451
452
453
454
    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
455
456
457
    $topics[] = $topic;
  }

Dries Buytaert's avatar
Dries Buytaert committed
458
  return $topics;
Dries Buytaert's avatar
   
Dries Buytaert committed
459
460
}

Dries Buytaert's avatar
   
Dries Buytaert committed
461
462
463
/**
 * Finds the first unread node for a given forum.
 */
Dries Buytaert's avatar
Dries Buytaert committed
464
function _forum_new($tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
465
466
  global $user;

Dries Buytaert's avatar
   
Dries Buytaert committed
467
  $nid = db_result(db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {history} h ON n.nid = h.hid 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
468
469
470
471

  return $nid ? $nid : 0;
}

472
/**
473
 * Menu callback; prints a forum listing.
474
475
 */
function forum_page($tid = 0, $display = 'all') {
Dries Buytaert's avatar
   
Dries Buytaert committed
476
  global $user;
Dries Buytaert's avatar
   
Dries Buytaert committed
477

Dries Buytaert's avatar
   
Dries Buytaert committed
478
  if (module_exist('taxonomy')) {
479
    if ($display == 'new') {
Dries Buytaert's avatar
   
Dries Buytaert committed
480
      if ($nid = _forum_new($tid)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
481
        drupal_goto("node/$nid");
Dries Buytaert's avatar
   
Dries Buytaert committed
482
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
483
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
484
    else {
Dries Buytaert's avatar
   
Dries Buytaert committed
485
486
      $forum_per_page = variable_get('forum_per_page', 25);
      $sortby = variable_get('forum_order', 1);
Dries Buytaert's avatar
   
Dries Buytaert committed
487

Dries Buytaert's avatar
   
Dries Buytaert committed
488
489
490
491
492
      $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
493

Dries Buytaert's avatar
   
Dries Buytaert committed
494
      print theme('forum_display', $forums, $topics, $parents, $tid, $sortby, $forum_per_page);
Dries Buytaert's avatar
   
Dries Buytaert committed
495
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
496
497
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
498
    print theme('page', forum_help('admin/settings/forum'), t('Warning'));
Dries Buytaert's avatar
   
Dries Buytaert committed
499
500
501
  }
}

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

Dries Buytaert's avatar
   
Dries Buytaert committed
511
512
  $vocabulary = taxonomy_get_vocabulary(variable_get('forum_nav_vocabulary', ''));
  $title = $vocabulary->name;
Dries Buytaert's avatar
   
Dries Buytaert committed
513

Dries Buytaert's avatar
   
Dries Buytaert committed
514
515
  // Breadcrumb navigation:
  $breadcrumb = array();
Dries Buytaert's avatar
   
Dries Buytaert committed
516
  if ($tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
517
    $breadcrumb[] = array('path' => 'forum', 'title' => $title);
Dries Buytaert's avatar
   
Dries Buytaert committed
518
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
519
520

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

Dries Buytaert's avatar
   
Dries Buytaert committed
534
  if (count($forums) || count($parents)) {
535
536
    $output  = '<div id="forum">';
    $output .= '<ul>';
Dries Buytaert's avatar
   
Dries Buytaert committed
537
538
539

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

Dries Buytaert's avatar
   
Dries Buytaert committed
543
      $output .= ' <li>'. l(t('Active forum discussions.'), 'tracker') .'</li>';
Dries Buytaert's avatar
   
Dries Buytaert committed
544
545
546
    }

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

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
569
  print theme('page', $output, $title);
Dries Buytaert's avatar
   
Dries Buytaert committed
570
571
}

Dries Buytaert's avatar
   
Dries Buytaert committed
572
/**
Dries Buytaert's avatar
   
Dries Buytaert committed
573
574
 * Format the forum listing.
 *
Dries Buytaert's avatar
   
Dries Buytaert committed
575
 * @ingroup themeable
Dries Buytaert's avatar
   
Dries Buytaert committed
576
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
577
function theme_forum_list($forums, $parents, $tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
578
579
  global $user;

Dries Buytaert's avatar
   
Dries Buytaert committed
580
581
  if ($forums) {

Dries Buytaert's avatar
   
Dries Buytaert committed
582
    $header = array(t('Forum'), t('Topics'), t('Posts'), t('Last post'));
Dries Buytaert's avatar
   
Dries Buytaert committed
583
584

    foreach ($forums as $forum) {
Dries Buytaert's avatar
   
Dries Buytaert committed
585
      if ($forum->container) {
586
587
        $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
588
589
590
591
592
593

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

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

605
606
        $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
607

Dries Buytaert's avatar
   
Dries Buytaert committed
608
609
610
611
        if ($forum->description) {
          $description .= " <div class=\"description\">$forum->description</div>\n";
        }
        $description .= "</div>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
612

Dries Buytaert's avatar
   
Dries Buytaert committed
613
        $rows[] = array(
Dries Buytaert's avatar
   
Dries Buytaert committed
614
          array('data' => $description, 'class' => 'forum'),
615
          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
616
617
          array('data' => $forum->num_posts, 'class' => 'posts'),
          array('data' => _forum_format($forum->last_post), 'class' => 'last-reply'));
Dries Buytaert's avatar
   
Dries Buytaert committed
618
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
619
620
621
    }
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
622
  return theme('table', $header, $rows);
Dries Buytaert's avatar
   
Dries Buytaert committed
623
624
}

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
635
636
    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
637
      if ($topic->tid != $tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
638
        $rows[] = array(
Dries Buytaert's avatar
   
Dries Buytaert committed
639
          array('data' => _forum_icon($topic->new, $topic->num_comments, $topic->comment_mode, $topic->sticky), 'class' => 'icon'),
Dries Buytaert's avatar
   
Dries Buytaert committed
640
641
          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
642
        );
Dries Buytaert's avatar
   
Dries Buytaert committed
643
644
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
645
        $rows[] = array(
Dries Buytaert's avatar
   
Dries Buytaert committed
646
          array('data' => _forum_icon($topic->new, $topic->num_comments, $topic->comment_mode, $topic->sticky), 'class' => 'icon'),
Dries Buytaert's avatar
   
Dries Buytaert committed
647
648
          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
649
650
          array('data' => _forum_format($topic), 'class' => 'created'),
          array('data' => _forum_format($topic->last_reply), 'class' => 'last-reply')
Dries Buytaert's avatar
   
Dries Buytaert committed
651
        );
Dries Buytaert's avatar
   
Dries Buytaert committed
652
653
654
      }
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
655
656
    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
657
658
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
659

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

Dries Buytaert's avatar
   
Dries Buytaert committed
662
663
664
  return $output;
}

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

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
680
681
682
683
    if ($sticky == 1) {
      $icon = 'sticky';
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
684
    // default
Dries Buytaert's avatar
   
Dries Buytaert committed
685
    $file = "misc/forum-$icon.png";
Dries Buytaert's avatar
   
Dries Buytaert committed
686

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

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

  return $output;
Dries Buytaert's avatar
   
Dries Buytaert committed
698
699
700
701
}

function _forum_user_last_visit($nid) {
  global $user;
702
703
704
  static $history = array();

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
730
731
732
733
734
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
735
?>