forum.module 26.8 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
189
190
191
192
193
194
195
196
197
198
199
200
201
/**
 * Implementation of hook_menu().
 */
function forum_menu() {
  $items = array();

  $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);

  return $items;
}

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

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

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

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

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

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

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

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

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

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

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

  return $output;
}

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
314
315
316
317
318
/**
 * 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
319
function _forum_format($topic) {
320
  if ($topic && $topic->timestamp) {
Dries Buytaert's avatar
   
Dries Buytaert committed
321
    return t('%time ago<br />by %author', array('%time' => format_interval(time() - $topic->timestamp), '%author' => format_name($topic)));
Dries Buytaert's avatar
   
Dries Buytaert committed
322
323
324
325
326
327
  }
  else {
    return message_na();
  }
}

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

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

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

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

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
    if ($counts[$forum->tid]) {
      $forum->num_topics = $counts[$forum->tid]->topic_count;
      $forum->num_posts = $counts[$forum->tid]->topic_count + $counts[$forum->tid]->comment_count;
    }
    else {
      $forum->num_topics = 0;
      $forum->num_posts = 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  return $nid ? $nid : 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
617
  return theme('table', $header, $rows);
Dries Buytaert's avatar
   
Dries Buytaert committed
618
619
}

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

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
650
651
    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
652
653
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
654

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

Dries Buytaert's avatar
   
Dries Buytaert committed
657
658
659
  return $output;
}

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

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

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

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

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

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

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

  return $output;
Dries Buytaert's avatar
   
Dries Buytaert committed
693
694
695
696
}

function _forum_user_last_visit($nid) {
  global $user;
697
698
699
  static $history = array();

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
725
726
727
728
729
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
730
?>