comment.module 23.6 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
10
11
12
13
14
15
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>";
  $output .= "<p>Comments behave like other user submissions in Drupal.  Specifically, <a href=\"admin.php?mod=system&type=filter\">filters</a> 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 <a href=\"admin.php?mod=user&op=permission\"></a>user permissions</a> administration page.  Additionally, administrators may edit or search through comments on the <a href=\"admin.php?mod=comment\">comments admininistration page<a>, as well as set the default display view for new users.</p>";

  return $output;
}

Dries's avatar
   
Dries committed
16
function comment_settings($mode, $order, $threshold) {
Dries's avatar
   
Dries committed
17
18
  global $user;

Dries's avatar
   
Dries committed
19
20
  if ($user->uid) {
    $user = user_save($user, array("mode" => $mode, "sort" => $order, "threshold" => $threshold));
Dries's avatar
   
Dries committed
21
22
23
  }
}

Dries's avatar
   
Dries committed
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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.
    */

    $history = db_fetch_object(db_query("SELECT timestamp FROM history WHERE uid = '$user->uid' AND nid = '$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' AND timestamp > '". ($history->timestamp ? $history->timestamp : 0) ."' GROUP BY n.nid"));

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

}

function comment_tag_new($nid) {
  global $user;

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

Dries's avatar
   
Dries committed
57
58
59
60
61
62
63
64
65
66
    $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
67
68
69
function comment_is_new($comment) {
  global $user;
  static $date;
Dries's avatar
   
Dries committed
70

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

  if ($comment->timestamp > $date) {
    return 1;
  }
  else {
    return 0;
  }
}

Dries's avatar
   
Dries committed
89
function comment_access($op, $comment) {
Dries's avatar
   
Dries committed
90
91
  global $user;

Dries's avatar
   
Dries committed
92
93
94
95
96
97
98
99
100
101
102
  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
103
  }
Dries's avatar
   
Dries committed
104

Dries's avatar
   
Dries committed
105
106
107
108
109
110
111
112
113
114
115
}

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
116
  $form .= form_textfield(t("Subject"), "subject", $edit["subject"], 50, 64);
Dries's avatar
   
Dries committed
117
118

  // comment field:
Dries's avatar
   
Dries committed
119
  $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
120
121

  // preview button:
Dries's avatar
   
Dries committed
122
  $form .= form_hidden("cid", $edit["cid"]);
Dries's avatar
   
Dries committed
123
  $form .= form_hidden("pid", $edit["pid"]);
Dries's avatar
   
Dries committed
124
  $form .= form_hidden("nid", $edit["nid"]);
Dries's avatar
   
Dries committed
125

Dries's avatar
   
Dries committed
126
  if (!$edit["comment"]) {
Dries's avatar
   
Dries committed
127
128
129
130
131
132
133
134
135
136
    $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
137
138
139
140
141
142
143
144
145
146
147
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) {
Dries's avatar
   
Dries committed
148
149
150
  global $theme;

  if ($pid) {
Dries's avatar
   
Dries committed
151
152
    $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 = '$pid'"));
    comment_view($comment, t("reply to this comment"));
Dries's avatar
   
Dries committed
153
154
  }
  else {
Dries's avatar
   
Dries committed
155
    node_view(node_load(array("nid" => $nid)));
Dries's avatar
   
Dries committed
156
157
158
159
    $pid = 0;
  }

  if (user_access("post comments")) {
Dries's avatar
   
Dries committed
160
    $theme->box(t("Reply"), comment_form(array("pid" => $pid, "nid" => $nid)));
Dries's avatar
   
Dries committed
161
162
163
164
165
166
167
168
169
  }
  else {
    $theme->box(t("Reply"), t("You are not authorized to post comments."));
  }
}

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

Dries's avatar
   
Dries committed
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
  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
192
193
194
195
196
197
198
199
200

  $theme->box(t("Reply"), comment_form($edit));
}

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

  if (user_access("post comments")) {

Dries's avatar
   
Dries committed
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
    /*
    ** 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
219
    $duplicate = db_result(db_query("SELECT COUNT(cid) FROM comments WHERE pid = '". check_query($edit["pid"]) ."' AND nid = '". check_query($edit["nid"]) ."' AND subject = '". check_query($edit["subject"]) ."' AND comment = '". check_query($edit["comment"]) ."'"), 0);
Dries's avatar
   
Dries committed
220
221

    if ($duplicate != 0) {
Dries's avatar
   
Dries committed
222
      watchdog("warning", "comment: duplicate '". $edit["subject"] ."'");
Dries's avatar
   
Dries committed
223
224
225
    }
    else {

Dries's avatar
   
Dries committed
226
      if ($edit["cid"]) {
Dries's avatar
   
Dries committed
227

Dries's avatar
   
Dries committed
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
        /*
        ** Update the comment in the database.  Note that the update
        ** query will fail if the comment isn't owned by the current
        ** user.
        */

        db_query("UPDATE comments SET subject = '". check_query($edit["subject"]) ."', comment = '". check_query($edit["comment"]) ."' WHERE cid = '". check_query($edit["cid"]) ."' AND uid = '$user->uid'");

        /*
        ** 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:
        */

        db_query("INSERT INTO comments (nid, pid, uid, subject, comment, hostname, timestamp) VALUES ('". check_query($edit["nid"]) ."', '". check_query($edit["pid"]) ."', '$user->uid', '". check_query($edit["subject"]) ."', '". check_query($edit["comment"]) ."', '". getenv("REMOTE_ADDR") ."', '". time() ."')");

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

Dries's avatar
   
Dries committed
260
261
        watchdog("special", "comment: added '". $edit["subject"] ."'");
      }
Dries's avatar
   
Dries committed
262
263
264
265

      /*
      ** Clear the cache:
      */
Dries's avatar
   
Dries committed
266
267

      cache_clear();
Dries's avatar
   
Dries committed
268

Dries's avatar
   
Dries committed
269
270
    }
  }
Dries's avatar
   
Dries committed
271
272
273
274
275
276
277
278

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

  $url = "node.php?id=". $edit["nid"];
  drupal_goto($url);

Dries's avatar
   
Dries committed
279
280
}

Dries's avatar
   
Dries committed
281
function comment_num_replies($id) {
Dries's avatar
   
Dries committed
282
283
284
285
286
287
288
289
290

  $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
291
292
293
  // XXX: disabled for now
  return "";

Dries's avatar
   
Dries committed
294
  $values = array("--", "1", "2", "3", "4", "5");
Dries's avatar
   
Dries committed
295
296
297
298
299
300
301

  $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
302
  $output .= "<select name=\"moderate[comment][$comment->cid]\">$options</select><br />". ($comment->score ? $comment->score : "--") ." / $comment->votes";
Dries's avatar
   
Dries committed
303
304
305
306
307

  return $output;
}

function comment_threshold($threshold) {
Dries's avatar
   
Dries committed
308
309
310
  // XXX: disabled for now
  return "";

Dries's avatar
   
Dries committed
311
  for ($i = 0; $i < 6; $i++) $options .= " <option value=\"$i\"". ($threshold == $i ? " selected=\"selected\"" : "") .">". t("Visibility") ." - $i</option>";
Dries's avatar
   
Dries committed
312
313
314
315
316
317
  return "<select name=\"threshold\">$options</select>\n";
}

function comment_mode($mode) {
  global $cmodes;

Dries's avatar
   
Dries committed
318
  foreach ($cmodes as $key => $value) $options .= " <option value=\"$key\"". ($mode == $key ? " selected=\"selected\"" : "") .">$value</option>\n";
Dries's avatar
   
Dries committed
319
320
321
322
323
324
  return "<select name=\"mode\">$options</select>\n";
}

function comment_order($order) {
  global $corder;

Dries's avatar
   
Dries committed
325
  foreach ($corder as $key=>$value) $options .= " <option value=\"$key\"". ($order == $key ? " selected=\"selected\"" : "") .">$value</option>\n";
Dries's avatar
   
Dries committed
326
327
328
  return "<select name=\"order\">$options</select>\n";
}

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

Dries's avatar
   
Dries committed
331
  $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
332
333
334
335
336

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

Dries's avatar
   
Dries committed
337
  $query .= " GROUP BY c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name";
Dries's avatar
   
Dries committed
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359

  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
360
  global $user, $theme;
Dries's avatar
   
Dries committed
361

Dries's avatar
   
Dries committed
362
363
  $links = array();

Dries's avatar
   
Dries committed
364
  if ($return) {
Dries's avatar
   
Dries committed
365
    $links[] = "<a href=\"node.php?id=$comment->nid#$comment->cid\"><span style=\"color: $theme->type;\">". t("return") ."</span></a>";
Dries's avatar
   
Dries committed
366
  }
Dries's avatar
   
Dries committed
367
368

  if (user_access("administer comments")) {
Dries's avatar
   
Dries committed
369
    $links[] = "<a href=\"admin.php?mod=comment&op=edit&id=$comment->cid\" title=\"". t("Administer this comment.") ."\"><span style=\"color: $theme->type;\">". t("administer") ."</span></a>";
Dries's avatar
   
Dries committed
370
371
372
  }

  if (user_access("post comments")) {
Dries's avatar
   
Dries committed
373
    if (comment_access("edit", $comment)) {
Dries's avatar
   
Dries committed
374
      $links[] = "<a href=\"module.php?mod=comment&op=edit&id=$comment->cid\" title=\"". t("Make changes to your comment.") ."\"><span style=\"color: $theme->type\">". t("edit your comment") ."</span></a>";
Dries's avatar
   
Dries committed
375
376
    }
    else {
Dries's avatar
   
Dries committed
377
      $links[] = "<a href=\"module.php?mod=comment&op=reply&id=$comment->nid&pid=$comment->cid\" title=\"". t("Reply to this comment.") ."\"><span style=\"color: $theme->type;\">". t("reply to this comment") ."</span></a>";
Dries's avatar
   
Dries committed
378
    }
Dries's avatar
   
Dries committed
379
  }
Dries's avatar
   
Dries committed
380

Dries's avatar
   
Dries committed
381

Dries's avatar
   
Dries committed
382
  return $theme->links($links);
Dries's avatar
   
Dries committed
383
384
385
}

function comment_view($comment, $folded = 0) {
Dries's avatar
   
Dries committed
386
387
388
  global $theme, $id;

  if (comment_is_new($comment)) {
Dries's avatar
   
Dries committed
389
    $comment->subject = "$comment->subject <span style=\"color: red;\">*</span>";
Dries's avatar
   
Dries committed
390
  }
Dries's avatar
   
Dries committed
391
392
393
394
395

  if ($folded) {
    $theme->comment($comment, $folded);
  }
  else {
Dries's avatar
   
Dries committed
396
    print "<a href=\"node.php?id=$comment->nid&cid=$comment->cid#$comment->cid\">". check_output($comment->subject) ."</a> by ". format_name($comment) ."</small><p />";
Dries's avatar
   
Dries committed
397
398
399
  }
}

Dries's avatar
   
Dries committed
400
function comment_thread_min($comments, $threshold, $pid = 0) {
Dries's avatar
   
Dries committed
401
402
  global $user;

Dries's avatar
   
Dries committed
403
404
405
406
407
408
409
  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
410
411
412
  }
}

Dries's avatar
   
Dries committed
413
function comment_thread_max($comments, $threshold, $pid = 0, $level = 0) {
Dries's avatar
   
Dries committed
414
415
416
417
418
419
420
421
422
423
424
  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
425
426
427
  foreach ($comments as $comment) {
    if ($comment->pid == $pid) {
      print "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr><td width=\"". ($level * 25) ."\">&nbsp;</td><td>\n";
Dries's avatar
   
Dries committed
428
      comment_view($comment, comment_links($comment, 0));
Dries's avatar
   
Dries committed
429
      print "</td></tr></table>\n";
Dries's avatar
   
Dries committed
430

Dries's avatar
   
Dries committed
431
432
      comment_thread_max($comments, $threshold, $comment->cid, $level + 1);
    }
Dries's avatar
   
Dries committed
433
434
435
436
  }

}

Dries's avatar
   
Dries committed
437
function comment_render($nid, $cid) {
Dries's avatar
   
Dries committed
438
439
440
441
442
443
444
445
  global $user, $theme, $mode, $order, $threshold, $REQUEST_URI;

  if (user_access("access comments")) {

    /*
    ** Pre-process variables:
    */

Dries's avatar
   
Dries committed
446
447
    if (empty($nid)) {
      $nid = 0;
Dries's avatar
   
Dries committed
448
449
450
451
452
453
454
    }

    if (empty($cid)) {
      $cid = 0;
    }

    if (empty($mode)) {
Dries's avatar
   
Dries committed
455
      $mode = $user->uid ? $user->mode : variable_get("default_comment_mode", 4);
Dries's avatar
   
Dries committed
456
457
458
    }

    if (empty($order)) {
Dries's avatar
   
Dries committed
459
      $order = $user->uid ? $user->sort : variable_get("default_comment_order", 1);
Dries's avatar
   
Dries committed
460
461
462
    }

    if (empty($threshold)) {
Dries's avatar
   
Dries committed
463
464
      // $threshold = $user->uid ? $user->threshold : variable_get("default_comment_threshold", 3);
      $threshold = 0;
Dries's avatar
   
Dries committed
465
466
467
468
469
470
471
472
473
474
475
476
    }

    print "<a name=\"comment\"></a>\n";
    print "<form method=\"post\" action=\"$REQUEST_URI\">\n";

    /*
    ** Render control panel:
    */

    $theme->box(t("Control panel"), $theme->comment_controls($threshold, $mode, $order));

    if ($cid > 0) {
Dries's avatar
   
Dries committed
477
      $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
478
479
480
481
482
483
      if ($comment = db_fetch_object($result)) {
        comment_view($comment, comment_links($comment));
      }
    }
    else {
      if ($mode == 1) {
Dries's avatar
   
Dries committed
484
        $result = comment_query($nid, $order);
Dries's avatar
   
Dries committed
485
486
487
488
        print "<table border=\"0\" cellpadding=\"2\" cellspacing=\"2\">\n";
        print " <tr><th>Subject</th><th>Author</th><th>Date</th><th>Score</th></tr>\n";
        while ($comment = db_fetch_object($result)) {
          if (comment_visible($comment, $threshold)) {
Dries's avatar
   
Dries committed
489
            print " <tr><td><a href=\"node.php?id=$comment->nid&cid=$comment->cid#$comment->cid\">". check_output($comment->subject) ."</a></td><td>". format_name($comment) ."</td><td>". format_date($comment->timestamp, "small") ."</td><td>$comment->score</td></tr>\n";
Dries's avatar
   
Dries committed
490
491
492
493
494
          }
        }
        print "</table>\n";
      }
      else if ($mode == 2) {
Dries's avatar
   
Dries committed
495
        $result = comment_query($nid, $order);
Dries's avatar
   
Dries committed
496
497
498
499
500
        while ($comment = db_fetch_object($result)) {
          comment_view($comment, (comment_visible($comment, $threshold) ? comment_links($comment, 0) : 0));
        }
      }
      else if ($mode == 3) {
Dries's avatar
   
Dries committed
501
        $result = comment_query($nid, $order);
Dries's avatar
   
Dries committed
502
        while ($comment = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
503
504
505
506
          $comments[] = $comment;
        }

        if ($comments) {
Dries's avatar
   
Dries committed
507
          comment_thread_min($comments, $threshold);
Dries's avatar
   
Dries committed
508
509
510
        }
      }
      else {
Dries's avatar
   
Dries committed
511
        $result = comment_query($nid, $order);
Dries's avatar
   
Dries committed
512
        while ($comment = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
513
514
515
516
          $comments[] = $comment;
        }

        if ($comments) {
Dries's avatar
   
Dries committed
517
          comment_thread_max($comments, $threshold);
Dries's avatar
   
Dries committed
518
519
520
521
522
523
        }
      }
    }

    print "</form>";

Dries's avatar
   
Dries committed
524
525
526
527
528
    /*
    ** Tag the node's comments as being read:
    */

    comment_tag_new($nid);
Dries's avatar
   
Dries committed
529
530
531
  }
}

Dries's avatar
   
Dries committed
532
function comment_search($keys) {
Dries's avatar
   
Dries committed
533
  global $PHP_SELF;
Dries's avatar
   
Dries committed
534
  $result = db_query("SELECT c.*, u.name FROM comments c LEFT JOIN users u ON c.uid = u.uid WHERE c.subject LIKE '%$keys%' OR c.comment LIKE '%$keys%' ORDER BY c.timestamp DESC LIMIT 20");
Dries's avatar
   
Dries committed
535
  while ($comment = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
536
    $find[$i++] = array("title" => check_output($comment->subject), "link" => (strstr($PHP_SELF, "admin.php") ? "admin.php?mod=comment&op=edit&id=$comment->cid" : "node.php?id=$comment->nid&cid=$comment->cid"), "user" => $comment->name, "date" => $comment->timestamp);
Dries's avatar
   
Dries committed
537
538
539
  }
  return $find;
}
Dries's avatar
 
Dries committed
540

Dries's avatar
   
Dries committed
541
function comment_perm() {
Dries's avatar
   
Dries committed
542
543
544
  return array("access comments", "post comments", "administer comments");
}

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

Dries's avatar
   
Dries committed
547
  if ($type == "admin" && user_access("administer comments")) {
Dries's avatar
   
Dries committed
548
549
550
    $links[] = "<a href=\"admin.php?mod=comment\">comments</a>";
  }

Dries's avatar
   
Dries committed
551
  if ($type == "node" && $node->comment) {
Dries's avatar
   
Dries committed
552
553
554
555
556
557
558
559

    if ($main) {

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

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

Dries's avatar
   
Dries committed
563
        $links[] = "<a href=\"node.php?id=$node->nid#comment\" title=\"". t("View this posting and all of its comments.") ."\">". format_plural($all, "comment", "comments") . ($new ? ", $new ". t("new") : "") ."</a>";
Dries's avatar
   
Dries committed
564
565
566
567
568
569
570
571
572
      }
    }
    else {
      /*
      ** Node page: add a "post comment" link if the user is allowed to
      ** post comments.
      */

      if (user_access("post comments")) {
Dries's avatar
   
Dries committed
573
        $links[] = "<a href=\"module.php?mod=comment&op=reply&id=$node->nid#comment\" title=\"". t("Share your thoughts and opinions related to this posting.") ."\">". t("add new comment") ."</a>";
Dries's avatar
   
Dries committed
574
575
576
577
      }
    }
  }

Dries's avatar
   
Dries committed
578
  return $links ? $links : array();
Dries's avatar
   
Dries committed
579
580
}

Dries's avatar
   
Dries committed
581
582
function comment_node_link($node) {

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

Dries's avatar
   
Dries committed
585
586
587
    /*
    ** Edit comments:
    */
Dries's avatar
   
Dries committed
588

Dries's avatar
   
Dries committed
589
    $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
590

Dries's avatar
   
Dries committed
591
592
593
594
595
596
597
598
599
600
601
602
    $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)) {
      $output .= "<tr><td><a href=\"node.php?id=$node->nid&cid=$comment->cid#$comment->cid\">$comment->subject</a></td><td>". format_name($comment) ."</td><td><a href=\"node.php?id=$node->nid&cid=$comment->cid#$comment->cid\">". t("view comment") ."</a></td><td><a href=\"admin.php?mod=comment&op=edit&id=$comment->cid\">". t("edit comment") ."</a></td><td><a href=\"admin.php?mod=comment&op=delete&id=$comment->cid\">". t("delete comment") ."</a></td></tr>";
    }

    $output .= "</table>";

    return $output;
  }
Dries's avatar
   
Dries committed
603
604
}

Dries's avatar
   
Dries committed
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640

function comment_save($id, $edit) {
  db_query("UPDATE comments SET subject = '". check_query(filter($edit["subject"])) ."', comment = '". check_query(filter($edit["comment"])) ."' WHERE cid = '$id'");
  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"):
      comment_settings(check_query($mode), check_query($order), check_query($threshold));
      break;
    default:
  }
}

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

Dries's avatar
   
Dries committed
642
  $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
643
644
  $comment = db_fetch_object($result);

Dries's avatar
   
Dries committed
645
  $form .= form_item(t("Author"), format_name($comment));
Dries's avatar
   
Dries committed
646
647
  $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
648
  $form .= form_hidden("cid", $id);
Dries's avatar
   
Dries committed
649
  $form .= form_submit(t("Submit"));
Dries's avatar
   
Dries committed
650
  $form .= form_submit(t("Delete"));
Dries's avatar
 
Dries committed
651

Dries's avatar
   
Dries committed
652
  return form($form);
Dries's avatar
 
Dries committed
653
654
}

Dries's avatar
   
Dries committed
655
function comment_admin_overview() {
Dries's avatar
   
Dries committed
656
  $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
657

Dries's avatar
   
Dries committed
658
659
  $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
660
  while ($comment = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
661
    $output .= " <tr><td><a href=\"node.php?id=$comment->nid&cid=$comment->cid&pid=$comment->pid#$comment->cid\">". check_output($comment->subject) ."</a></td><td>". format_name($comment) ."</td><td>". format_date($comment->timestamp, "small") ."</td><td><a href=\"admin.php?mod=comment&op=edit&id=$comment->cid\">edit comment</a></td><td><a href=\"admin.php?mod=comment&op=delete&id=$comment->cid\">delete comment</a></td></tr>\n";
Dries's avatar
 
Dries committed
662
  }
Dries's avatar
   
Dries committed
663
  $output .= "</table>\n";
Dries's avatar
   
Dries committed
664

Dries's avatar
   
Dries committed
665
  return $output;
Dries's avatar
 
Dries committed
666
667
}

Dries's avatar
   
Dries committed
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
function comment_delete($edit) {

  if ($edit["confirm"]) {
    db_query("DELETE FROM comments WHERE cid = '". check_query($edit["cid"]) ."'");
    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
683
684
}

Dries's avatar
 
Dries committed
685
function comment_admin() {
Dries's avatar
   
Dries committed
686
  global $op, $id, $edit, $mod, $keys, $order;
Dries's avatar
 
Dries committed
687

Dries's avatar
   
Dries committed
688
  if (user_access("administer comments")) {
Dries's avatar
   
Dries committed
689

Dries's avatar
   
Dries committed
690
    print "<small><a href=\"admin.php?mod=comment\">overview</a> | <a href=\"admin.php?mod=comment&op=search\">search comment</a></small><hr />\n";
Dries's avatar
   
Dries committed
691
692
693

    switch ($op) {
      case "edit":
Dries's avatar
   
Dries committed
694
        print comment_admin_edit($id);
Dries's avatar
   
Dries committed
695
696
        break;
      case "search":
Dries's avatar
   
Dries committed
697
        print search_type("comment", "admin.php?mod=comment&op=search");
Dries's avatar
   
Dries committed
698
        break;
Dries's avatar
   
Dries committed
699
      case "delete":
Dries's avatar
   
Dries committed
700
701
702
703
        print comment_delete(array("cid" => $id));
        break;
      case t("Delete"):
        print comment_delete($edit);
Dries's avatar
   
Dries committed
704
        break;
Dries's avatar
   
Dries committed
705
      case t("Submit"):
Dries's avatar
   
Dries committed
706
        print status(comment_save(check_query($id), $edit));
Dries's avatar
   
Dries committed
707
        print comment_admin_overview();
Dries's avatar
   
Dries committed
708
709
        break;
      default:
Dries's avatar
   
Dries committed
710
        print comment_admin_overview();
Dries's avatar
   
Dries committed
711
712
713
714
    }
  }
  else {
    print message_access();
Dries's avatar
 
Dries committed
715
716
  }
}
Dries's avatar
   
Dries committed
717

Dries's avatar
   
Dries committed
718
?>