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
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 variable_get('forum_help', '');
Dries Buytaert's avatar
   
Dries Buytaert committed
28
    case 'node/add#forum':
29
      return t('A forum is a threaded discussion, enabling users to communicate about a particular topic.');
Dries Buytaert's avatar
   
Dries Buytaert committed
30
31
32
  }
}

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

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

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

56
57
58
/**
 * Implementation of hook_settings().
 */
59
function forum_settings() {
Dries Buytaert's avatar
   
Dries Buytaert committed
60

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

Dries Buytaert's avatar
   
Dries Buytaert committed
67
    if ($voc) {
68
      $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."));
69
      $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') .'>');
70

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

Dries Buytaert's avatar
   
Dries Buytaert committed
73
      $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.'));
74
      $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
75
      $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
76
      $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
77
      $number = drupal_map_assoc(array(10, 25, 50, 75, 100));
Dries Buytaert's avatar
   
Dries Buytaert committed
78
79
80
      $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
81
      $output .= form_group(t('Forum viewing options'), $group);
82

83
      $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
84
      $output .= form_group(t('"Forum topic" block settings'), $group);
Dries Buytaert's avatar
   
Dries Buytaert committed
85
86
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
87

Dries Buytaert's avatar
   
Dries Buytaert committed
88
89
90
  return $output;
}

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

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

  return $forum;
}

112
113
114
115
116
117
/**
 * 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
118
function forum_block($op = 'list', $delta = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
119

Dries Buytaert's avatar
   
Dries Buytaert committed
120
121
  if ($op == 'list') {
    $blocks[0]['info'] = t('Forum topics');
122
123
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
124
    if (user_access('access content')) {
Dries Buytaert's avatar
   
Dries Buytaert committed
125
      $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
126

Dries Buytaert's avatar
   
Dries Buytaert committed
127
      $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
128

Dries Buytaert's avatar
   
Dries Buytaert committed
129
      if ($content) {
130
        $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
131
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
132

Dries Buytaert's avatar
   
Dries Buytaert committed
133
134
      $blocks['subject'] = t('Forum topics');
      $blocks['content'] = $content;
Dries Buytaert's avatar
   
Dries Buytaert committed
135
136
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
137

Dries Buytaert's avatar
   
Dries Buytaert committed
138
139
140
  return $blocks;
}

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

Dries Buytaert's avatar
   
Dries Buytaert committed
147
148
  $links = array();

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
156
    $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
157
158
159

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
183
  return $links;
Dries Buytaert's avatar
   
Dries Buytaert committed
184
185
}

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

Dries Buytaert's avatar
   
Dries Buytaert committed
192
193
194
195
196
197
198
199
  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
200
201
202
203

  return $items;
}

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

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
231
  $node = forum_content($node, $teaser);
Dries Buytaert's avatar
   
Dries Buytaert committed
232
233
}

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

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

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

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

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

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

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

  return $output;
}

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
316
317
318
319
320
/**
 * 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
321
function _forum_format($topic) {
322
  if ($topic && $topic->timestamp) {
Dries Buytaert's avatar
   
Dries Buytaert committed
323
    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
324
325
326
327
328
329
  }
  else {
    return message_na();
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
330
331
332
333
334
335
336
337
338
339
340
341
342
/**
 * 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
343
344
345
346
347
function forum_get_forums($tid = 0) {
  if (!$tid) {
    $tid = 0;
  }

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

Dries Buytaert's avatar
   
Dries Buytaert committed
351
  if (count($_forums)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
352

Dries Buytaert's avatar
   
Dries Buytaert committed
353
354
355
356
357
358
    $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
359
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
360

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

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

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

  return $forums;
Dries Buytaert's avatar
   
Dries Buytaert committed
388
389
}

390
391
392
393
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
394
395
  $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
396

397
  return $ancient + $recent;
Dries Buytaert's avatar
   
Dries Buytaert committed
398
399
}

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

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

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

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
424
  $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
425

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

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

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

Dries Buytaert's avatar
Dries Buytaert committed
455
  return $topics;
Dries Buytaert's avatar
   
Dries Buytaert committed
456
457
}

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

Dries Buytaert's avatar
   
Dries Buytaert committed
464
  $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
465
466
467
468

  return $nid ? $nid : 0;
}

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
485
486
487
488
489
      $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
490

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

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

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

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

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

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

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

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

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

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

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

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
577
578
  if ($forums) {

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

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

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

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

602
603
        $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
604

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
619
  return theme('table', $header, $rows);
Dries Buytaert's avatar
   
Dries Buytaert committed
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
?>