comment.module 27 KB
Newer Older
1
<?php
2
// $Id$
Dries's avatar
 
Dries committed
3

Dries's avatar
   
Dries committed
4
$GLOBALS["cmodes"] = array(1 => "Flat list - collapsed", 2 => "Flat list - expanded", 3 => "Threaded list - collapsed", 4 => "Threaded list - expanded");
Dries's avatar
   
Dries committed
5
$GLOBALS["corder"] = array(1 => "Date - newest first", 2 => "Date - oldest first");
Dries's avatar
   
Dries committed
6

Dries's avatar
   
Dries committed
7
8
9
function comment_help() {
  $output .= "<p>The comment module enables users to submit posts that are directly associated with a piece of content.  These associated posts are called <i>comments</i>.  Comments may be <i>threaded</i>, which means that Drupal keeps track of multiple subconversations around a piece of content.  Threading helps to keep the comment conversation more organized.  Users are presented with several ways to view the comment conversation, and if desired, users may easily choose a <i>flat</i> presentation of comments instead of threaded.  Further, users may choose to order their comments view by <i>newest first</i> or by <i>oldest first</i>.  Finally, users may view a folded list or an expanded list of comments.  Folded limits the comment display to <i>subject</i> only.  Drupal remembers the comment view preference of each user whenever he changes a view setting.</p>";
  $output .= "<p>Since a busy site generates lots of comments, Drupal takes care to present a personalized view of comments for each user.  The home page lists displays the number of read and unread comments for a given post for the current user.  Also, the tracker module (when installed) displays all recent comments on the site.  Finally, comments which the user has not yet read are highlighted with a red star (this graphic may depend on the current theme).</p>";
Kjartan's avatar
Kjartan committed
10
11
  $output .= "<p>Comments behave like other user submissions in Drupal.  Specifically, ". la("filters", array("mod" => "system", "type" => "filter")) ." like smileys and HTML work fine if the administrator has enabled them.  Also, throttles are usually enabled to prevent a single user from spamming the web site with too many comments in a short period of time.</p>";
  $output .= "<p>Administrators may control which persons are allowed to submit and administer comments.  These controls appear in the ". la("user permissions", array("mod" => "user", "op" => "permission")) ." administration page.  Additionally, administrators may edit or search through comments on the ". la("comments admininistration page", array("mod" => "comment")) .", as well as set the default display view for new users.</p>";
Dries's avatar
   
Dries committed
12
13
14
15

  return $output;
}

16
function comment_system($field){
Kjartan's avatar
Kjartan committed
17
  $system["description"] = t("Enables user to comment on content (nodes).");
18
19
20
  return $system[$field];
}

Dries's avatar
   
Dries committed
21
function comment_settings($mode, $order, $threshold) {
Dries's avatar
   
Dries committed
22
23
  global $user;

Dries's avatar
   
Dries committed
24
25
  if ($user->uid) {
    $user = user_save($user, array("mode" => $mode, "sort" => $order, "threshold" => $threshold));
Dries's avatar
   
Dries committed
26
27
28
  }
}

Dries's avatar
   
Dries committed
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function comment_num_all($nid) {
  $comment = db_fetch_object(db_query("SELECT COUNT(c.nid) AS number FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$nid' GROUP BY n.nid"));
  return $comment->number ? $comment->number : 0;
}

function comment_num_new($nid) {
  global $user;

  if ($user->uid) {

    /*
    ** Retrieve the timestamp at which the current user last viewed
    ** the specified node and use this timestamp to find the number
    ** of new comments.
    */

Dries's avatar
   
Dries committed
45
46
    $history = db_fetch_object(db_query("SELECT timestamp FROM history WHERE uid = '$user->uid' AND nid = '%s'", $nid));
    $comment = db_fetch_object(db_query("SELECT COUNT(c.nid) AS number FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '%s' AND timestamp > '". ($history->timestamp ? $history->timestamp : 0) ."' GROUP BY n.nid", $nid));
Dries's avatar
   
Dries committed
47
48
49
50
51
52
53
54
55
56
57
58
59

    return $comment->number ? $comment->number : 0;
  }
  else {
    return 0;
  }

}

function comment_tag_new($nid) {
  global $user;

  if ($user->uid) {
Dries's avatar
   
Dries committed
60
61
    $nid = check_query($nid);

Dries's avatar
   
Dries committed
62
63
64
65
66
67
68
69
70
71
    $result = db_query("SELECT timestamp FROM history WHERE uid = '$user->uid' AND nid = '$nid'");
    if (db_fetch_object($result)) {
      db_query("UPDATE history SET timestamp = '". time() ."' WHERE uid = '$user->uid' AND nid = '$nid'");
    }
    else {
      db_query("INSERT INTO history (uid, nid, timestamp) VALUES ('$user->uid', '$nid', '". time() ."')");
    }
  }
}

Dries's avatar
   
Dries committed
72
73
74
function comment_is_new($comment) {
  global $user;
  static $date;
Dries's avatar
   
Dries committed
75

Dries's avatar
   
Dries committed
76
  if (!$date[$comment->nid]) {
Dries's avatar
   
Dries committed
77
78
    if ($user->uid) {
      $history = db_fetch_object(db_query("SELECT timestamp FROM history WHERE uid = '$user->uid' AND nid = '$comment->nid'"));
Dries's avatar
   
Dries committed
79
      $date[$comment->nid] = $history->timestamp ? $history->timestamp : 0;
Dries's avatar
   
Dries committed
80
81
    }
    else {
Dries's avatar
   
Dries committed
82
      $date[$comment->nid] = time();
Dries's avatar
   
Dries committed
83
84
85
    }
  }

Dries's avatar
   
Dries committed
86
  if ($comment->timestamp > $date[$comment->nid]) {
Dries's avatar
   
Dries committed
87
88
89
90
91
92
93
    return 1;
  }
  else {
    return 0;
  }
}

Dries's avatar
   
Dries committed
94
function comment_access($op, $comment) {
Dries's avatar
   
Dries committed
95
96
  global $user;

Dries's avatar
   
Dries committed
97
98
99
100
101
102
103
104
105
106
107
  if ($op == "edit") {

    /*
    ** Authenticated users can edit their comments as long they have
    ** not been replied to.  This, in order to avoid people changing
    ** or revising their statements based on the replies their posts
    ** got. Furthermore, users can't reply to their own comments and
    ** are encouraged to extend their original comment.
    */

    return $user->uid && $user->uid == $comment->uid && comment_num_replies($comment->cid) == 0;
Dries's avatar
   
Dries committed
108
  }
Dries's avatar
   
Dries committed
109

Dries's avatar
   
Dries committed
110
111
112
113
114
115
116
117
118
119
120
}

function comment_form($edit) {
  global $user;

  $form .= "<a name=\"comment\"></a>\n";

  // name field:
  $form .= form_item(t("Your name"), format_name($user));

  // subject field:
Dries's avatar
   
Dries committed
121
  $form .= form_textfield(t("Subject"), "subject", $edit["subject"], 50, 64);
Dries's avatar
   
Dries committed
122
123

  // comment field:
Dries's avatar
   
Dries committed
124
  $form .= form_textarea(t("Comment"), "comment", $edit["comment"] ? $edit["comment"] : $user->signature, 70, 10, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
Dries's avatar
   
Dries committed
125
126

  // preview button:
Dries's avatar
   
Dries committed
127
  $form .= form_hidden("cid", $edit["cid"]);
Dries's avatar
   
Dries committed
128
  $form .= form_hidden("pid", $edit["pid"]);
Dries's avatar
   
Dries committed
129
  $form .= form_hidden("nid", $edit["nid"]);
Dries's avatar
   
Dries committed
130

Dries's avatar
   
Dries committed
131
  if (!$edit["comment"]) {
Dries's avatar
   
Dries committed
132
133
134
135
136
137
138
139
140
141
    $form .= form_submit(t("Preview comment"));
  }
  else {
    $form .= form_submit(t("Preview comment"));
    $form .= form_submit(t("Post comment"));
  }

  return form($form);
}

Dries's avatar
   
Dries committed
142
143
144
145
146
147
148
149
150
151
152
function comment_edit($cid) {
  global $user;

  $comment = db_fetch_object(db_query("SELECT c.*, u.name, u.uid FROM comments c LEFT JOIN users u ON c.uid = u.uid WHERE c.cid = '$cid'"));

  if (comment_access("edit", $comment)) {
    comment_preview(object2array($comment));
  }
}

function comment_reply($pid, $nid) {
153
  global $theme;
Dries's avatar
   
Dries committed
154

155
  if (user_access("access comments")) {
Dries's avatar
   
Dries committed
156
    if ($pid) {
Dries's avatar
   
Dries committed
157
      $comment = db_fetch_object(db_query("SELECT c.*, u.uid, u.name FROM comments c LEFT JOIN users u ON c.uid = u.uid WHERE c.cid = '%s'", $pid));
Dries's avatar
   
Dries committed
158
159
160
161
162
163
      comment_view($comment, t("reply to this comment"));
    }
    else {
      node_view(node_load(array("nid" => $nid)));
      $pid = 0;
    }
Dries's avatar
   
Dries committed
164

Dries's avatar
   
Dries committed
165
166
    if (node_comment_mode($nid) == 1) {
      $theme->box(t("Reply"), t("This discussion is closed: you can't post new comments."));
Kjartan's avatar
Kjartan committed
167
168
    }
    else if (user_access("post comments", $context)) {
Dries's avatar
   
Dries committed
169
170
171
172
173
      $theme->box(t("Reply"), comment_form(array("pid" => $pid, "nid" => $nid)));
    }
    else {
      $theme->box(t("Reply"), t("You are not authorized to post comments."));
    }
Kjartan's avatar
Kjartan committed
174
175
  }
  else {
Dries's avatar
   
Dries committed
176
    $theme->box(t("Reply"), t("You are not authorized to view comments."));
Dries's avatar
   
Dries committed
177
178
179
180
181
182
  }
}

function comment_preview($edit) {
  global $theme, $user;

Dries's avatar
   
Dries committed
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
  foreach ($edit as $key => $value) {
    $comment->$key = filter($value);
  }

  /*
  ** Attach the user information:
  */

  $comment->uid = $user->uid;
  $comment->name = $user->name;

  /*
  ** Attach the time:
  */

  $comment->timestamp = time();

  /*
  ** Preview the comment:
  */

  comment_view($comment, t("reply to this comment"));
Dries's avatar
   
Dries committed
205
206

  $theme->box(t("Reply"), comment_form($edit));
Kjartan's avatar
Kjartan committed
207
208

  if ($edit["pid"]) {
Kjartan's avatar
Kjartan committed
209
    $comment = db_fetch_object(db_query("SELECT c.*, u.uid, u.name FROM comments c LEFT JOIN users u ON c.uid = u.uid WHERE c.cid = '%s'", $edit["pid"]));
Kjartan's avatar
Kjartan committed
210
211
212
213
214
215
    comment_view($comment, t("reply to this comment"));
  }
  else {
    node_view(node_load(array("nid" => $edit["nid"])));
    $edit["pid"] = 0;
  }
Dries's avatar
   
Dries committed
216
217
218
219
220
}

function comment_post($edit) {
  global $theme, $user;

Dries's avatar
   
Dries committed
221
222
  $context->nid = $edit["nid"];
  if (user_access("post comments", $context) && node_comment_mode($edit["nid"]) == 2) {
Dries's avatar
   
Dries committed
223

Dries's avatar
   
Dries committed
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
    /*
    ** Validate the comment's subject.  If not specified, extract
    ** one from the comment's body.
    */

    $edit["subject"] = strip_tags(($edit["subject"] ? $edit["subject"] : substr($edit["comment"], 0, 29)));

    /*
    ** Validate the comment's body.
    */

    $edit["comment"] = filter($edit["comment"]);

    /*
    ** Check for duplicate comments.  Note that we have to use the
    ** validated/filtered data to perform such check.
    */

Dries's avatar
   
Dries committed
242
    $duplicate = db_result(db_query("SELECT COUNT(cid) FROM comments WHERE pid = '%s' AND nid = '%s' AND subject = '%s' AND comment = '%s'", $edit["pid"], $edit["nid"], $edit["subject"], $edit["comment"]), 0);
Dries's avatar
   
Dries committed
243
244

    if ($duplicate != 0) {
Dries's avatar
   
Dries committed
245
      watchdog("warning", "comment: duplicate '". $edit["subject"] ."'");
Dries's avatar
   
Dries committed
246
247
248
    }
    else {

Dries's avatar
   
Dries committed
249
      if ($edit["cid"]) {
Dries's avatar
   
Dries committed
250

Dries's avatar
   
Dries committed
251
252
253
254
255
256
        /*
        ** Update the comment in the database.  Note that the update
        ** query will fail if the comment isn't owned by the current
        ** user.
        */

Dries's avatar
   
Dries committed
257
        db_query("UPDATE comments SET subject = '%s', comment = '%s' WHERE cid = '%s' AND uid = '$user->uid'", $edit["subject"], $edit["comment"], $edit["cid"]);
Dries's avatar
   
Dries committed
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276

        /*
        ** Add entry to the watchdog log:
        */

        watchdog("special", "comment: updated '". $edit["subject"] ."'");
      }
      else {
        /*
        ** Check the user's comment submission rate.  If exceeded,
        ** throttle() will bail out.
        */

        throttle("post comment", variable_get("max_comment_rate", 60));

        /*
        ** Add the comment to database:
        */

Dries's avatar
   
Dries committed
277
        db_query("INSERT INTO comments (nid, pid, uid, subject, comment, hostname, timestamp) VALUES ('%s', '%s', '$user->uid', '%s', '%s', '%s', '%s')", $edit["nid"], $edit["pid"], $edit["subject"], $edit["comment"], getenv("REMOTE_ADDR"), time());
Dries's avatar
   
Dries committed
278
279
280
281

        /*
        ** Add entry to the watchdog log:
        */
Dries's avatar
   
Dries committed
282

Dries's avatar
   
Dries committed
283
284
        watchdog("special", "comment: added '". $edit["subject"] ."'");
      }
Dries's avatar
   
Dries committed
285
286
287
288

      /*
      ** Clear the cache:
      */
Dries's avatar
   
Dries committed
289
290

      cache_clear();
Dries's avatar
   
Dries committed
291

Dries's avatar
   
Dries committed
292
293
    }
  }
Dries's avatar
   
Dries committed
294
295
296
297
298

  /*
  ** Redirect the user the node he commented on:
  */

Dries's avatar
   
Dries committed
299
  drupal_goto(drupal_url(array("id" => $edit["nid"]), "node"));
Dries's avatar
   
Dries committed
300

Dries's avatar
   
Dries committed
301
302
}

Dries's avatar
   
Dries committed
303
function comment_num_replies($id) {
Dries's avatar
   
Dries committed
304
305
306
307
308
309
310
311
312

  $result = db_query("SELECT COUNT(cid) FROM comments WHERE pid = '$id'");
  return ($result) ? db_result($result, 0) : 0;

}

function comment_moderation($comment) {
  global $user;

Dries's avatar
   
Dries committed
313
314
315
  // XXX: disabled for now
  return "";

Dries's avatar
   
Dries committed
316
  $values = array("--", "1", "2", "3", "4", "5");
Dries's avatar
   
Dries committed
317
318
319
320
321
322
323

  $moderate = db_fetch_object(db_query("SELECT * FROM moderate WHERE cid = '$comment->cid' AND uid = '$user->uid'"));

  foreach ($values as $key => $value) {
    $options .= " <option value=\"$key\"". ($moderate->score == $key ? " selected=\"selected\"" : "") .">$value</option>\n";
  }

Dries's avatar
   
Dries committed
324
  $output .= "<select name=\"moderate[comment][$comment->cid]\">$options</select><br />". ($comment->score ? $comment->score : "--") ." / $comment->votes";
Dries's avatar
   
Dries committed
325
326
327
328
329

  return $output;
}

function comment_threshold($threshold) {
Dries's avatar
   
Dries committed
330
331
332
  // XXX: disabled for now
  return "";

Dries's avatar
   
Dries committed
333
  for ($i = 0; $i < 6; $i++) $options .= " <option value=\"$i\"". ($threshold == $i ? " selected=\"selected\"" : "") .">". t("Visibility") ." - $i</option>";
Dries's avatar
   
Dries committed
334
335
336
337
338
339
  return "<select name=\"threshold\">$options</select>\n";
}

function comment_mode($mode) {
  global $cmodes;

Dries's avatar
   
Dries committed
340
  foreach ($cmodes as $key => $value) $options .= " <option value=\"$key\"". ($mode == $key ? " selected=\"selected\"" : "") .">". t($value) ."</option>\n";
Dries's avatar
   
Dries committed
341
342
343
344
345
346
  return "<select name=\"mode\">$options</select>\n";
}

function comment_order($order) {
  global $corder;

Dries's avatar
   
Dries committed
347
  foreach ($corder as $key=>$value) $options .= " <option value=\"$key\"". ($order == $key ? " selected=\"selected\"" : "") .">". t($value) ."</option>\n";
Dries's avatar
   
Dries committed
348
349
350
  return "<select name=\"order\">$options</select>\n";
}

Dries's avatar
   
Dries committed
351
function comment_query($nid, $order, $pid = -1) {
Dries's avatar
   
Dries committed
352

Dries's avatar
   
Dries committed
353
  $query .= "SELECT c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name FROM comments c LEFT JOIN users u ON c.uid = u.uid WHERE c.nid = '$nid'";
Dries's avatar
   
Dries committed
354
355
356
357
358

  if ($pid >= 0) {
    $query .= " AND pid = '$pid'";
  }

Dries's avatar
   
Dries committed
359
  $query .= " GROUP BY c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name";
Dries's avatar
   
Dries committed
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381

  if ($order == 1) {
    $query .= " ORDER BY c.timestamp DESC";
  }
  else if ($order == 2) {
    $query .= " ORDER BY c.timestamp";
  }

  return db_query($query);

}

function comment_visible($comment, $threshold = 0) {
  if ($comment->votes == 0 || $comment->score >= $threshold) {
    return 1;
  }
  else {
    return 0;
  }
}

function comment_links($comment, $return = 1) {
Dries's avatar
   
Dries committed
382
  global $user, $theme;
Dries's avatar
   
Dries committed
383

Dries's avatar
   
Dries committed
384
385
  $links = array();

Dries's avatar
   
Dries committed
386
  if ($return) {
Kjartan's avatar
Kjartan committed
387
    $links[] = l("<span style=\"color: $theme->type;\">". t("return") ."</span>", array("id" => $comment->nid), "node", $comment->cid);
Dries's avatar
   
Dries committed
388
  }
Dries's avatar
   
Dries committed
389
390

  if (user_access("administer comments")) {
Dries's avatar
   
Dries committed
391
    $links[] = la("<span style=\"color: $theme->type;\">". t("administer") ."</span>", array("mod" => "comment", "op" => "edit", "id" => $comment->cid));
Dries's avatar
   
Dries committed
392
393
  }

Dries's avatar
   
Dries committed
394
395
396
397
398
399
  /*
  ** Here we should check if this node has read-only comments, but we
  ** already check on submit and this way we save a query.  It's just
  ** a cosmetic issue. otherwise just uncomment the next line and
  ** related bracket some lines below.
  */
Dries's avatar
   
Dries committed
400
401

  //if (node_comment_mode($comment->nid)) {
Dries's avatar
   
Dries committed
402
  if (user_access("post comments")) {
Dries's avatar
   
Dries committed
403
    if (comment_access("edit", $comment)) {
Kjartan's avatar
Kjartan committed
404
      $links[] = lm("<span style=\"color: $theme->type\">". t("edit your comment") ."</span>", array("mod" => "comment", "op" => "edit", "id" => $comment->cid), "", array("title" => t("Make changes to your comment.")));
Dries's avatar
   
Dries committed
405
406
    }
    else {
Kjartan's avatar
Kjartan committed
407
      $links[] = lm("<span style=\"color: $theme->type;\">". t("reply to this comment") ."</span>", array("mod" => "comment", "op" => "reply", "id" => $comment->nid, "pid" => $comment->cid), "", array("title" => t("Reply to this comment.")));
Dries's avatar
   
Dries committed
408
    }
Dries's avatar
   
Dries committed
409
  }
Dries's avatar
   
Dries committed
410
  //}
Dries's avatar
   
Dries committed
411
412

  return $theme->links($links);
Dries's avatar
   
Dries committed
413
414
415
}

function comment_view($comment, $folded = 0) {
Dries's avatar
   
Dries committed
416
417
418
  global $theme, $id;

  if (comment_is_new($comment)) {
Dries's avatar
   
Dries committed
419
    $comment->subject = "$comment->subject <span style=\"color: red;\">*</span>";
Dries's avatar
   
Dries committed
420
  }
Dries's avatar
   
Dries committed
421
422
423
424
425

  if ($folded) {
    $theme->comment($comment, $folded);
  }
  else {
426
    print "<li>". l(check_output($comment->subject), array("id" => $comment->nid, "cid" => $comment->cid), "node", $comment->cid, array("title" => t("Read comment."))) ." ". t("by") ." ". format_name($comment) ."</li>\n";
Dries's avatar
   
Dries committed
427
428
429
  }
}

Dries's avatar
   
Dries committed
430
function comment_thread_min($comments, $threshold, $pid = 0) {
Dries's avatar
   
Dries committed
431
432
  global $user;

Dries's avatar
   
Dries committed
433
434
435
436
437
438
439
  foreach ($comments as $comment) {
    if ($comment->pid == $pid) {
      print "<ul>";
      print comment_view($comment);
      comment_thread_min($comments, $threshold, $comment->cid);
      print "</ul>";
    }
Dries's avatar
   
Dries committed
440
441
442
  }
}

Dries's avatar
   
Dries committed
443
function comment_thread_max($comments, $threshold, $pid = 0, $level = 0) {
Dries's avatar
   
Dries committed
444
445
446
447
448
449
450
451
452
453
454
  global $user;

  /*
  ** We had quite a few browser specific issues: expanded comments below
  ** the top level got truncated on the right hand side.  A range of
  ** solutions have been proposed and tried but either the right margins of
  ** the comments didn't line up well, or the heavily nested tables made
  ** for slow rendering and cluttered HTML.  This is the best work-around
  ** in terms of speed and size.
  */

Dries's avatar
   
Dries committed
455
456
  foreach ($comments as $comment) {
    if ($comment->pid == $pid) {
Steven Wittens's avatar
Steven Wittens committed
457
458
459
      if ($level) {
        print "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr><td width=\"". ($level * 25) ."\">&nbsp;</td><td>\n";
      }
Dries's avatar
   
Dries committed
460
      comment_view($comment, comment_links($comment, 0));
Steven Wittens's avatar
Steven Wittens committed
461
462
463
      if ($level) {
        print "</td></tr></table>\n";
      }
Dries's avatar
   
Dries committed
464

Dries's avatar
   
Dries committed
465
466
      comment_thread_max($comments, $threshold, $comment->cid, $level + 1);
    }
Dries's avatar
   
Dries committed
467
468
469
470
  }

}

Kjartan's avatar
Kjartan committed
471
function comment_render($nid, $cid = 0) {
Dries's avatar
   
Dries committed
472
  global $user, $theme, $mode, $order, $threshold;
Dries's avatar
   
Dries committed
473
474
475
476
477
478
479

  if (user_access("access comments")) {

    /*
    ** Pre-process variables:
    */

Dries's avatar
   
Dries committed
480
481
    if (empty($nid)) {
      $nid = 0;
Dries's avatar
   
Dries committed
482
483
484
    }

    if (empty($mode)) {
Dries's avatar
   
Dries committed
485
      $mode = $user->uid ? $user->mode : variable_get("default_comment_mode", 4);
Dries's avatar
   
Dries committed
486
487
488
    }

    if (empty($order)) {
Dries's avatar
   
Dries committed
489
      $order = $user->uid ? $user->sort : variable_get("default_comment_order", 1);
Dries's avatar
   
Dries committed
490
491
492
    }

    if (empty($threshold)) {
Dries's avatar
   
Dries committed
493
494
      // $threshold = $user->uid ? $user->threshold : variable_get("default_comment_threshold", 3);
      $threshold = 0;
Dries's avatar
   
Dries committed
495
496
497
    }

    print "<a name=\"comment\"></a>\n";
Kjartan's avatar
Kjartan committed
498
499
    print "<form method=\"post\" action=\"". drupal_url(array("mod" => "comment"), "module") ."\">\n";
    print form_hidden("nid", $nid);
Dries's avatar
   
Dries committed
500
501
502
503
504

    /*
    ** Render control panel:
    */

505
506
507
    if (comment_num_all($nid)) {
      $theme->box(t("Control panel"), $theme->comment_controls($threshold, $mode, $order));
    }
Dries's avatar
   
Dries committed
508

Kjartan's avatar
Kjartan committed
509
    if ($cid) {
Dries's avatar
   
Dries committed
510
      $result = db_query("SELECT c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name FROM comments c LEFT JOIN users u ON c.uid = u.uid WHERE c.cid = '$cid' GROUP BY c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name");
Dries's avatar
   
Dries committed
511
512
513
514
      if ($comment = db_fetch_object($result)) {
        comment_view($comment, comment_links($comment));
      }
    }
Dries's avatar
   
Dries committed
515
516
517
518

    if ($cid) {
      $result = comment_query($nid, $order, $cid);
    }
Dries's avatar
   
Dries committed
519
    else {
Dries's avatar
   
Dries committed
520
521
522
523
      $result = comment_query($nid, $order);
    }

    if ($mode == 1) {
524
      if (db_num_rows($result)) {
Dries's avatar
   
Dries committed
525
        print "<table border=\"0\" cellpadding=\"2\" cellspacing=\"2\">\n";
Dries's avatar
   
Dries committed
526
        print " <tr><th>". t("Subject") ."</th><th>". t("Author") ."</th><th>". t("Date") ."</th></tr>\n";
Dries's avatar
   
Dries committed
527
528
        while ($comment = db_fetch_object($result)) {
          if (comment_visible($comment, $threshold)) {
Dries's avatar
   
Dries committed
529
            print " <tr><td>". l(check_output($comment->subject), array("id" => $comment->nid, "cid" => $comment->cid), "node", $comment->cid) ."</td><td>". format_name($comment) ."</td><td>". format_date($comment->timestamp, "small") ."</td></tr>\n";
Dries's avatar
   
Dries committed
530
531
532
533
          }
        }
        print "</table>\n";
      }
Dries's avatar
   
Dries committed
534
535
536
537
538
539
540
541
542
    }
    else if ($mode == 2) {
      while ($comment = db_fetch_object($result)) {
        comment_view($comment, (comment_visible($comment, $threshold) ? comment_links($comment, 0) : 0));
      }
    }
    else if ($mode == 3) {
      while ($comment = db_fetch_object($result)) {
        $comments[] = $comment;
Dries's avatar
   
Dries committed
543
      }
Dries's avatar
   
Dries committed
544

Dries's avatar
   
Dries committed
545
      if ($comments) {
Kjartan's avatar
Kjartan committed
546
        if ($cid) {
Dries's avatar
   
Dries committed
547
548
549
          comment_thread_min($comments, $threshold, $cid, 1);
        }
        else {
Dries's avatar
   
Dries committed
550
          comment_thread_min($comments, $threshold);
Dries's avatar
   
Dries committed
551
552
        }
      }
Dries's avatar
   
Dries committed
553
554
555
556
557
    }
    else {
      while ($comment = db_fetch_object($result)) {
        $comments[] = $comment;
      }
Dries's avatar
   
Dries committed
558

Dries's avatar
   
Dries committed
559
560
561
562
563
      if ($comments) {
        if ($cid) {
          comment_thread_max($comments, $threshold, $cid, 1);
        }
        else {
Kjartan's avatar
Kjartan committed
564
          comment_thread_max($comments, $threshold, 0, 0);
Dries's avatar
   
Dries committed
565
566
567
568
569
570
        }
      }
    }

    print "</form>";

Dries's avatar
   
Dries committed
571
572
573
574
575
    /*
    ** Tag the node's comments as being read:
    */

    comment_tag_new($nid);
Dries's avatar
   
Dries committed
576
577
578
  }
}

Dries's avatar
   
Dries committed
579
function comment_search($keys) {
Dries's avatar
   
Dries committed
580
  global $PHP_SELF;
Kjartan's avatar
Kjartan committed
581

Dries's avatar
   
Dries committed
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
  /*
  ** Return the results of performing a search using the indexed search
  ** for this particular type of node.
  **
  ** Pass an array to the "do_search" function which dictates what it
  ** will search through, and what it will search for
  **
  ** "keys"'s value is the keywords entered by the user
  **
  ** "type"'s value is used to identify the node type in the search
  ** index.
  **
  ** "select"'s value is used to relate the data from the specific nodes
  ** table to the data that the search_index table has in it, and the the
  ** do_search functino will rank it.
  **
  ** The select must always provide the following fields - lno, title,
  ** created, uid, name, count
  **
  ** The select statement may optionally provide "nid", which is a secondary
  ** identifier which is currently used byt the comment module.
  */

Kjartan's avatar
Kjartan committed
605
  $find = do_search(array("keys" => $keys, "type" => "comment", "select" => "select s.lno as lno, c.nid as nid, c.subject as title, c.timestamp as created, u.uid as uid, u.name as name, s.count as count FROM search_index s, comments c LEFT JOIN users u ON c.uid = u.uid WHERE s.lno = c.cid AND s.type = 'comment' AND s.word like '%'"));
Dries's avatar
   
Dries committed
606

Dries's avatar
   
Dries committed
607
608
  return $find;
}
Dries's avatar
 
Dries committed
609

Dries's avatar
   
Dries committed
610
function comment_perm() {
Dries's avatar
   
Dries committed
611
612
613
  return array("access comments", "post comments", "administer comments");
}

Dries's avatar
   
Dries committed
614
function comment_link($type, $node = 0, $main = 0) {
Dries's avatar
   
Dries committed
615

Dries's avatar
   
Dries committed
616
  if ($type == "admin" && user_access("administer comments")) {
Dries's avatar
   
Dries committed
617
    $links[] = la(t("comments"), array("mod" => "comment"));
Dries's avatar
   
Dries committed
618
619
  }

Dries's avatar
   
Dries committed
620
  if ($type == "node" && $node->comment) {
Dries's avatar
   
Dries committed
621
622
623
624
625
626
627
628

    if ($main) {

      /*
      ** Main page: display the number of comments that have been posted.
      */

      if (user_access("access comments")) {
Dries's avatar
   
Dries committed
629
630
631
        $all = comment_num_all($node->nid);
        $new = comment_num_new($node->nid);

Kjartan's avatar
Kjartan committed
632
        $links[] = l(format_plural($all, "comment", "comments") . ($new ? ", $new ". t("new") : ""), array("id" => $node->nid), "node", "comment", array("title" => t("View this posting and all of its comments.")));
Dries's avatar
   
Dries committed
633
634
635
636
637
      }
    }
    else {
      /*
      ** Node page: add a "post comment" link if the user is allowed to
Dries's avatar
   
Dries committed
638
      ** post comments and if this node is not read-only
Dries's avatar
   
Dries committed
639
640
641
      */

      if (user_access("post comments")) {
Dries's avatar
   
Dries committed
642
        if ($node->comment == 2) {
Kjartan's avatar
Kjartan committed
643
          $links[] = lm(t("add new comment"), array("mod" => "comment", "op" => "reply", "id" => $node->nid), "comment", array("title" => t("Share your thoughts and opinions related to this posting.")));
Kjartan's avatar
Kjartan committed
644
645
        }
        else {
Dries's avatar
   
Dries committed
646
647
          $links[] = t("This discussion is closed: you can't post new comments.");
        }
Dries's avatar
   
Dries committed
648
649
650
651
      }
    }
  }

Dries's avatar
   
Dries committed
652
  return $links ? $links : array();
Dries's avatar
   
Dries committed
653
654
}

Dries's avatar
   
Dries committed
655
656
function comment_node_link($node) {

Dries's avatar
Dries committed
657
  if (user_access("administer comments") && comment_num_all($node->nid)) {
Dries's avatar
   
Dries committed
658

Dries's avatar
   
Dries committed
659
660
661
    /*
    ** Edit comments:
    */
Dries's avatar
   
Dries committed
662

Dries's avatar
   
Dries committed
663
    $result = db_query("SELECT c.cid, c.subject, u.uid, u.name FROM comments c LEFT JOIN users u ON u.uid = c.uid WHERE nid = '$node->nid' ORDER BY c.timestamp");
Dries's avatar
   
Dries committed
664

Dries's avatar
   
Dries committed
665
666
667
668
669
    $output .= "<h3>". t("Edit comments") ."</h3>";
    $output .= "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">";
    $output .= " <tr><th>title</th><th>author</th><th colspan=\"3\">operations</th></tr>";

    while ($comment = db_fetch_object($result)) {
Kjartan's avatar
Kjartan committed
670
      $output .= "<tr><td>". l($comment->subject, array("id" => $node->nid, "cid" => $comment->cid), "node", $comment->cid) ."</td><td>". format_name($comment) ."</td><td>". l(t("view comment"), array("id" => $node->nid, "cid" => $comment->cid), $comment->cid) ."</td><td>". la(t("edit comment"), array("mod" => "comment", "op" => "edit", "id" => $comment->cid)) ."</td><td>". la(t("delete comment"), array("mod" => "comment", "op" => "delete", "id" => $comment->cid)) ."</td></tr>";
Dries's avatar
   
Dries committed
671
672
673
674
675
676
    }

    $output .= "</table>";

    return $output;
  }
Dries's avatar
   
Dries committed
677
678
}

Dries's avatar
   
Dries committed
679
680

function comment_save($id, $edit) {
Dries's avatar
   
Dries committed
681
  db_query("UPDATE comments SET subject = '%s', comment = '%s' WHERE cid = '$id'", filter($edit["subject"]), filter($edit["comment"]));
Dries's avatar
   
Dries committed
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
  watchdog("special", "comment: modified '". $edit["subject"] ."'");
}

function comment_page() {
  global $theme, $op, $edit, $id, $pid, $cid;

  switch ($op) {
    case "edit":
      $theme->header();
      comment_edit(check_query($id));
      $theme->footer();
      break;
    case "reply":
      $theme->header();
      comment_reply(check_query($pid), check_query($id));
      $theme->footer();
      break;
    case t("Preview comment"):
      $theme->header();
      comment_preview($edit);
      $theme->footer();
      break;
    case t("Post comment"):
      comment_post($edit);
      break;
    case t("Update settings"):
Kjartan's avatar
Kjartan committed
708
      global $mode, $order, $threshold;
Dries's avatar
   
Dries committed
709
      comment_settings(check_query($mode), check_query($order), check_query($threshold));
Dries's avatar
   
Dries committed
710
      drupal_goto(drupal_url(array("id" => $edit["nid"], "mode" => $mode, "order" => $order), "node"));
Dries's avatar
   
Dries committed
711
712
713
714
715
716
      break;
    default:
  }
}

function comment_admin_edit($id) {
Dries's avatar
   
Dries committed
717

Dries's avatar
   
Dries committed
718
  $result = db_query("SELECT c.*, u.name, u.uid FROM comments c LEFT JOIN users u ON c.uid = u.uid WHERE c.cid = '$id'");
Dries's avatar
 
Dries committed
719
720
  $comment = db_fetch_object($result);

Dries's avatar
   
Dries committed
721
  $form .= form_item(t("Author"), format_name($comment));
Dries's avatar
   
Dries committed
722
723
  $form .= form_textfield(t("Subject"), "subject", $comment->subject, 70, 128);
  $form .= form_textarea(t("Comment"), "comment", $comment->comment, 70, 15);
Dries's avatar
   
Dries committed
724
  $form .= form_hidden("cid", $id);
Dries's avatar
   
Dries committed
725
  $form .= form_submit(t("Submit"));
Dries's avatar
   
Dries committed
726
  $form .= form_submit(t("Delete"));
Dries's avatar
 
Dries committed
727

Dries's avatar
   
Dries committed
728
  return form($form);
Dries's avatar
 
Dries committed
729
730
}

Dries's avatar
   
Dries committed
731
function comment_admin_overview() {
Dries's avatar
   
Dries committed
732
  $result = db_query("SELECT c.*, u.name, u.uid FROM comments c LEFT JOIN users u ON u.uid = c.uid ORDER BY timestamp DESC LIMIT 50");
Dries's avatar
   
Dries committed
733

Dries's avatar
   
Dries committed
734
735
  $output .= "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">\n";
  $output .= " <tr><th>subject</th><th>author</th><th>date</th><th colspan=\"2\">operations</th></tr>\n";
Dries's avatar
 
Dries committed
736
  while ($comment = db_fetch_object($result)) {
Kjartan's avatar
Kjartan committed
737
    $output .= " <tr><td>". l(check_output($comment->subject), array("id" => $comment->nid, "cid" => $comment->cid, "pid" => $comment->pid), "node", $comment->cid) ."</td><td>". format_name($comment) ."</td><td>". format_date($comment->timestamp, "small") ."</td><td>". la(t("edit comment"), array("mod" => comment, "op" => edit, "id" => $comment->cid)) ."</td><td>". la(t("delete comment"), array("mod" => "comment", "op" => "delete", "id" => $comment->cid)) ."</td></tr>\n";
Dries's avatar
 
Dries committed
738
  }
Dries's avatar
   
Dries committed
739
  $output .= "</table>\n";
Dries's avatar
   
Dries committed
740

Dries's avatar
   
Dries committed
741
  return $output;
Dries's avatar
 
Dries committed
742
743
}

Dries's avatar
   
Dries committed
744
745
746
function comment_delete($edit) {

  if ($edit["confirm"]) {
Dries's avatar
   
Dries committed
747
    db_query("DELETE FROM comments WHERE cid = '%s'", $edit["cid"]);
Dries's avatar
   
Dries committed
748
749
750
751
752
753
754
755
756
757
758
    watchdog("special", "comment: deleted comment #". $edit["cid"]);
  }
  else {
    $output .= form_item(t("Confirm deletion"), "");
    $output .= form_hidden("cid", $edit["cid"]);
    $output .= form_hidden("confirm", 1);
    $output .= form_submit(t("Delete"));
    $output = form($output);
  }

  return $output;
Dries's avatar
   
Dries committed
759
760
}

Dries's avatar
 
Dries committed
761
function comment_admin() {
Dries's avatar
   
Dries committed
762
  global $op, $id, $edit, $mod, $keys, $order;
Dries's avatar
 
Dries committed
763

Dries's avatar
   
Dries committed
764
  if (user_access("administer comments")) {
Dries's avatar
   
Dries committed
765

Dries's avatar
   
Dries committed
766
    print "<small>". la(t("overview"), array("mod" => "comment")) ." | ". la(t("search comment"), array("mod" => "comment", "op" => "search")) ." | ". la(t("help"), array("mod" => "comment", "op" => "help")) ."</small><hr />\n";
Dries's avatar
   
Dries committed
767
768

    switch ($op) {
Dries's avatar
   
Dries committed
769
770
771
      case "help":
        print comment_help();
        break;
Dries's avatar
   
Dries committed
772
      case "edit":
Dries's avatar
   
Dries committed
773
        print comment_admin_edit($id);
Dries's avatar
   
Dries committed
774
775
        break;
      case "search":
Dries's avatar
   
Dries committed
776
        print search_type("comment", drupal_url(array("mod" => "comment", "op" => "search"), "admin"));
Dries's avatar
   
Dries committed
777
        break;
Dries's avatar
   
Dries committed
778
      case "delete":
Dries's avatar
   
Dries committed
779
780
781
782
        print comment_delete(array("cid" => $id));
        break;
      case t("Delete"):
        print comment_delete($edit);
Dries's avatar
   
Dries committed
783
        break;
Dries's avatar
   
Dries committed
784
      case t("Submit"):
Dries's avatar
   
Dries committed
785
        print status(comment_save(check_query($id), $edit));
Dries's avatar
   
Dries committed
786
        print comment_admin_overview();
Dries's avatar
   
Dries committed
787
788
        break;
      default:
Dries's avatar
   
Dries committed
789
        print comment_admin_overview();
Dries's avatar
   
Dries committed
790
791
792
793
    }
  }
  else {
    print message_access();
Dries's avatar
 
Dries committed
794
795
  }
}
Dries's avatar
   
Dries committed
796

Kjartan's avatar
Kjartan committed
797
798
function comment_update_index() {

Dries's avatar
   
Dries committed
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
  /*
  ** Return an array of values to dictate how to update the search index
  ** for this particular type of node.
  **
  ** "last_update"'s value is used with variable_set to set the
  ** last time this node type (comment) had an index update run.
  **
  ** "node_type"'s value is used to identify the node type in the search
  ** index (commentt in this case).
  **
  ** "select"'s value is used to select the node id and text fields from
  ** the table we are indexing. In this case, we also check against the
  ** last run date for the comments update.
  */

Kjartan's avatar
Kjartan committed
814
  return array("last_update" => "comment_cron_last", "node_type" => "comment", "select" => "SELECT c.cid as lno, c.subject as text1, c.comment as text2 FROM comments c WHERE timestamp > ". variable_get("comment_cron_last", 1));
Kjartan's avatar
Kjartan committed
815
816
}

Dries's avatar
   
Dries committed
817
?>