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 t('A forum is a threaded discussion, enabling users to communicate about a particular topic.');
Dries Buytaert's avatar
   
Dries Buytaert committed
28
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
29
30
31
32
33

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

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

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

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

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

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

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

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

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

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

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

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

  return $forum;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  return $items;
}

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

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

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

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

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

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

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

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

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

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

295
  $output .= form_textarea(t('Body'), 'body', $node->body, 60, 20, '');
296
  $output .= filter_form('format', $node->format);
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
  db_query('INSERT INTO {forum} (nid, tid) VALUES (%d, %d)', $node->nid, $node->tid);
Dries Buytaert's avatar
   
Dries Buytaert committed
306
307
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  return $nid ? $nid : 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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