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

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

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

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

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

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

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

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

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

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

223
  $node = node_prepare($node, $teaser);
Dries Buytaert's avatar
   
Dries Buytaert committed
224
225
}

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
261
262
263
264
265
266
267
/**
 * Implementation of hook_update().
 */
function forum_update($node) {
  db_query('UPDATE {forum} SET tid = %d WHERE nid = %d', $node->tid, $node->nid);
}

268
269
270
/**
 * Implementation of hook_form().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
271
function forum_form(&$node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
272
  if (!$node->nid) {
Dries Buytaert's avatar
Dries Buytaert committed
273
    // new topic
Dries Buytaert's avatar
   
Dries Buytaert committed
274
    $node->taxonomy[] = arg(3);
275
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
276
277
278
  else {
    $node->taxonomy = array($node->tid);
  }
279

Dries Buytaert's avatar
   
Dries Buytaert committed
280
  $output = implode('', taxonomy_node_form('forum', $node));
Dries Buytaert's avatar
Dries Buytaert committed
281
282
283

  if ($node->nid) {
    // if editing, give option to leave shadows
Dries Buytaert's avatar
   
Dries Buytaert committed
284
285
    $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
286
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
287

288
  $output .= form_textarea(t('Body'), 'body', $node->body, 60, 20, '');
289
  $output .= filter_form('format', $node->format);
Dries Buytaert's avatar
   
Dries Buytaert committed
290
291
292
293

  return $output;
}

294
295
296
/**
 * Implementation of hook_insert().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
297
function forum_insert($node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
298
  db_query('INSERT INTO {forum} (nid, tid) VALUES (%d, %d)', $node->nid, $node->tid);
Dries Buytaert's avatar
   
Dries Buytaert committed
299
300
}

301
302
303
/**
 * Implementation of hook_delete().
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
304
function forum_delete(&$node) {
Dries Buytaert's avatar
   
Dries Buytaert committed
305
  db_query('DELETE FROM {forum} WHERE nid = %d', $node->nid);
Dries Buytaert's avatar
   
Dries Buytaert committed
306
}
Dries Buytaert's avatar
   
Dries Buytaert committed
307

Dries Buytaert's avatar
   
Dries Buytaert committed
308
309
310
/**
 * Formats a topic for display
 *
311
 * @TODO Give a better description. Not sure where this function is used yet.
Dries Buytaert's avatar
   
Dries Buytaert committed
312
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
313
function _forum_format($topic) {
314
  if ($topic && $topic->timestamp) {
Dries Buytaert's avatar
   
Dries Buytaert committed
315
    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
316
317
318
319
320
321
  }
  else {
    return message_na();
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
322
323
324
/**
 * Returns a list of all forums for a given taxonomy id
 *
325
 * Forum objects contain the following fields
Dries Buytaert's avatar
   
Dries Buytaert committed
326
327
328
329
330
331
332
333
334
 * -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
335
336
337
338
339
function forum_get_forums($tid = 0) {
  if (!$tid) {
    $tid = 0;
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
340
341
  $forums = array();
  $_forums = taxonomy_get_tree(variable_get('forum_nav_vocabulary', ''), $tid);
Dries Buytaert's avatar
   
Dries Buytaert committed
342

Dries Buytaert's avatar
   
Dries Buytaert committed
343
  if (count($_forums)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
344

Dries Buytaert's avatar
   
Dries Buytaert committed
345
346
347
348
349
350
    $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
351
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
352

Dries Buytaert's avatar
   
Dries Buytaert committed
353
354
355
356
  foreach ($_forums as $forum) {
    if (in_array($forum->tid, variable_get('forum_containers', array()))) {
      $forum->container = 1;
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
357

Dries Buytaert's avatar
   
Dries Buytaert committed
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
    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
375

Dries Buytaert's avatar
   
Dries Buytaert committed
376
377
378
379
    $forums[$forum->tid] = $forum;
  }

  return $forums;
Dries Buytaert's avatar
   
Dries Buytaert committed
380
381
}

382
383
384
385
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.
386
387
  $ancient = db_result(db_query("SELECT COUNT(n.nid) FROM {node} n INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d ". node_access_join_sql() ." WHERE n.created <= %d AND n.status = 1 AND n.type = 'forum' AND ". node_access_where_sql(), $term, NODE_NEW_LIMIT));
  $recent = db_result(db_query("SELECT COUNT(n.nid) FROM {node} n ". node_access_join_sql() ." INNER JOIN {history} h ON n.nid = h.nid AND h.uid = %d INNER JOIN {term_node} r ON n.nid = r.nid AND r.tid = %d WHERE n.status = 1 AND n.type = 'forum' AND n.created > %d AND ". node_access_where_sql(), $uid, $term, NODE_NEW_LIMIT));
Dries Buytaert's avatar
   
Dries Buytaert committed
388

389
  return $ancient + $recent;
Dries Buytaert's avatar
   
Dries Buytaert committed
390
391
}

Dries Buytaert's avatar
Dries Buytaert committed
392
function forum_get_topics($tid, $sortby, $forum_per_page) {
Dries Buytaert's avatar
   
Dries Buytaert committed
393
  global $user, $forum_topic_list_header;
Dries Buytaert's avatar
   
Dries Buytaert committed
394

Dries Buytaert's avatar
   
Dries Buytaert committed
395
  $forum_topic_list_header = array(
Dries Buytaert's avatar
   
Dries Buytaert committed
396
397
    array('data' => '&nbsp;'),
    array('data' => t('Topic'), 'field' => 'n.title'),
Dries Buytaert's avatar
   
Dries Buytaert committed
398
    array('data' => t('Replies'), 'field' => 'l.comment_count'),
Dries Buytaert's avatar
   
Dries Buytaert committed
399
    array('data' => t('Created'), 'field' => 'n.created'),
Dries Buytaert's avatar
   
Dries Buytaert committed
400
    array('data' => t('Last reply'), 'field' => 'l.last_comment_timestamp'),
Dries Buytaert's avatar
   
Dries Buytaert committed
401
  );
Dries Buytaert's avatar
   
Dries Buytaert committed
402

Dries Buytaert's avatar
   
Dries Buytaert committed
403
  $order = _forum_get_topic_order($sortby);
Dries Buytaert's avatar
   
Dries Buytaert committed
404
  for ($i = 0; $i < count($forum_topic_list_header); $i++) {
Dries Buytaert's avatar
   
Dries Buytaert committed
405
406
    if ($forum_topic_list_header[$i]['field'] == $order['field']) {
      $forum_topic_list_header[$i]['sort'] = $order['sort'];
Dries Buytaert's avatar
   
Dries Buytaert committed
407
408
409
410
    }
  }

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
416
  $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
417

Dries Buytaert's avatar
Dries Buytaert committed
418
  $result = pager_query($sql, $forum_per_page, 0, $sql_count);
Dries Buytaert's avatar
   
Dries Buytaert committed
419
420

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

Dries Buytaert's avatar
   
Dries Buytaert committed
438
439
440
441
442
443
    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
444
445
446
    $topics[] = $topic;
  }

Dries Buytaert's avatar
Dries Buytaert committed
447
  return $topics;
Dries Buytaert's avatar
   
Dries Buytaert committed
448
449
}

Dries Buytaert's avatar
   
Dries Buytaert committed
450
451
452
/**
 * Finds the first unread node for a given forum.
 */
Dries Buytaert's avatar
Dries Buytaert committed
453
function _forum_new($tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
454
455
  global $user;

Dries Buytaert's avatar
   
Dries Buytaert committed
456
  $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
457
458
459
460

  return $nid ? $nid : 0;
}

461
/**
462
 * Menu callback; prints a forum listing.
463
464
 */
function forum_page($tid = 0, $display = 'all') {
Dries Buytaert's avatar
   
Dries Buytaert committed
465
  global $user;
Dries Buytaert's avatar
   
Dries Buytaert committed
466

Dries Buytaert's avatar
   
Dries Buytaert committed
467
  if (module_exist('taxonomy')) {
468
    if ($display == 'new') {
Dries Buytaert's avatar
   
Dries Buytaert committed
469
      if ($nid = _forum_new($tid)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
470
        drupal_goto("node/$nid");
Dries Buytaert's avatar
   
Dries Buytaert committed
471
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
472
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
473
    else {
Dries Buytaert's avatar
   
Dries Buytaert committed
474
475
      $forum_per_page = variable_get('forum_per_page', 25);
      $sortby = variable_get('forum_order', 1);
Dries Buytaert's avatar
   
Dries Buytaert committed
476

Dries Buytaert's avatar
   
Dries Buytaert committed
477
478
479
480
481
      $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
482

Dries Buytaert's avatar
   
Dries Buytaert committed
483
      print theme('forum_display', $forums, $topics, $parents, $tid, $sortby, $forum_per_page);
Dries Buytaert's avatar
   
Dries Buytaert committed
484
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
485
486
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
487
    print theme('page', forum_help('admin/settings/forum'), t('Warning'));
Dries Buytaert's avatar
   
Dries Buytaert committed
488
489
490
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
491
/**
Dries Buytaert's avatar
   
Dries Buytaert committed
492
493
 * Format the forum body.
 *
Dries Buytaert's avatar
   
Dries Buytaert committed
494
 * @ingroup themeable
Dries Buytaert's avatar
   
Dries Buytaert committed
495
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
496
function theme_forum_display($forums, $topics, $parents, $tid, $sortby, $forum_per_page) {
Dries Buytaert's avatar
   
Dries Buytaert committed
497
  global $user;
Dries Buytaert's avatar
   
Dries Buytaert committed
498
  // forum list, topics list, topic browser and 'add new topic' link
Dries Buytaert's avatar
   
Dries Buytaert committed
499

Dries Buytaert's avatar
   
Dries Buytaert committed
500
501
  $vocabulary = taxonomy_get_vocabulary(variable_get('forum_nav_vocabulary', ''));
  $title = $vocabulary->name;
Dries Buytaert's avatar
   
Dries Buytaert committed
502

Dries Buytaert's avatar
   
Dries Buytaert committed
503
504
  // Breadcrumb navigation:
  $breadcrumb = array();
Dries Buytaert's avatar
   
Dries Buytaert committed
505
  if ($tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
506
    $breadcrumb[] = array('path' => 'forum', 'title' => $title);
Dries Buytaert's avatar
   
Dries Buytaert committed
507
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
508
509

  if ($parents) {
Dries Buytaert's avatar
   
Dries Buytaert committed
510
511
    $parents = array_reverse($parents);
    foreach ($parents as $p) {
512
513
      if ($p->tid == $tid) {
        $title = $p->name;
Dries Buytaert's avatar
   
Dries Buytaert committed
514
515
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
516
        $breadcrumb[] = array('path' => 'forum/'. $p->tid, 'title' => $p->name);
Dries Buytaert's avatar
   
Dries Buytaert committed
517
518
519
      }
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
520
521
  $breadcrumb[] = array('path' => $_GET['q']);
  menu_set_location($breadcrumb);
Dries Buytaert's avatar
   
Dries Buytaert committed
522

Dries Buytaert's avatar
   
Dries Buytaert committed
523
  if (count($forums) || count($parents)) {
524
525
    $output  = '<div id="forum">';
    $output .= '<ul>';
Dries Buytaert's avatar
   
Dries Buytaert committed
526
527
528

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

Dries Buytaert's avatar
   
Dries Buytaert committed
532
      $output .= ' <li>'. l(t('Active forum discussions.'), 'tracker') .'</li>';
Dries Buytaert's avatar
   
Dries Buytaert committed
533
534
535
    }

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
548
    if ($tid && !in_array($tid, variable_get('forum_containers', array()))) {
Dries Buytaert's avatar
   
Dries Buytaert committed
549
      $output .= theme('forum_topic_list', $tid, $topics, $sortby, $forum_per_page);
Dries Buytaert's avatar
   
Dries Buytaert committed
550
    }
551
    $output .= '</div>';
Dries Buytaert's avatar
   
Dries Buytaert committed
552
553
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
554
    $title = t('No forums defined');
Dries Buytaert's avatar
   
Dries Buytaert committed
555
    $output = '';
Dries Buytaert's avatar
   
Dries Buytaert committed
556
557
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
558
  print theme('page', $output, $title);
Dries Buytaert's avatar
   
Dries Buytaert committed
559
560
}

Dries Buytaert's avatar
   
Dries Buytaert committed
561
/**
Dries Buytaert's avatar
   
Dries Buytaert committed
562
563
 * Format the forum listing.
 *
Dries Buytaert's avatar
   
Dries Buytaert committed
564
 * @ingroup themeable
Dries Buytaert's avatar
   
Dries Buytaert committed
565
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
566
function theme_forum_list($forums, $parents, $tid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
567
568
  global $user;

Dries Buytaert's avatar
   
Dries Buytaert committed
569
570
  if ($forums) {

Dries Buytaert's avatar
   
Dries Buytaert committed
571
    $header = array(t('Forum'), t('Topics'), t('Posts'), t('Last post'));
Dries Buytaert's avatar
   
Dries Buytaert committed
572
573

    foreach ($forums as $forum) {
Dries Buytaert's avatar
   
Dries Buytaert committed
574
      if ($forum->container) {
575
576
        $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
577
578
579
580
581
582

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

Dries Buytaert's avatar
   
Dries Buytaert committed
583
        $rows[] = array(array('data' => $description, 'class' => 'container', 'colspan' => 4));
584
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
585
      else {
586
        $forum->old_topics = _forum_topics_read($forum->tid, $user->uid);
Dries Buytaert's avatar
   
Dries Buytaert committed
587
588
589
        if ($user->uid) {
          $new_topics = $forum->num_topics - $forum->old_topics;
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
590
591
592
        else {
          $new_topics = 0;
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
593

594
595
        $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
596

Dries Buytaert's avatar
   
Dries Buytaert committed
597
598
599
600
        if ($forum->description) {
          $description .= " <div class=\"description\">$forum->description</div>\n";
        }
        $description .= "</div>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
601

Dries Buytaert's avatar
   
Dries Buytaert committed
602
        $rows[] = array(
Dries Buytaert's avatar
   
Dries Buytaert committed
603
          array('data' => $description, 'class' => 'forum'),
604
          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
605
606
          array('data' => $forum->num_posts, 'class' => 'posts'),
          array('data' => _forum_format($forum->last_post), 'class' => 'last-reply'));
Dries Buytaert's avatar
   
Dries Buytaert committed
607
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
608
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
609
610
611

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

Dries Buytaert's avatar
   
Dries Buytaert committed
612
613
614
615
  }

}

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

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
646
647
    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
648
649
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
650

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

Dries Buytaert's avatar
   
Dries Buytaert committed
653
654
655
  return $output;
}

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

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

    if ($comment_mode == 1) {
Dries Buytaert's avatar
   
Dries Buytaert committed
668
      $icon = 'closed';
Dries Buytaert's avatar
   
Dries Buytaert committed
669
670
    }

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

Dries Buytaert's avatar
   
Dries Buytaert committed
675
    // default
Dries Buytaert's avatar
   
Dries Buytaert committed
676
    $file = "misc/forum-$icon.png";
Dries Buytaert's avatar
   
Dries Buytaert committed
677

Dries Buytaert's avatar
   
Dries Buytaert committed
678
    $output = theme('image', $file);
Dries Buytaert's avatar
   
Dries Buytaert committed
679
680
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
681
    $output = '&nbsp;';
Dries Buytaert's avatar
   
Dries Buytaert committed
682
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
683
684
685
686
687
688

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

  return $output;
Dries Buytaert's avatar
   
Dries Buytaert committed
689
690
691
692
}

function _forum_user_last_visit($nid) {
  global $user;
693
694
695
  static $history = array();

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

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

Dries Buytaert's avatar
   
Dries Buytaert committed
721
722
723
724
725
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
726
?>