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

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

Dries's avatar
   
Dries committed
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
55
56
57
58
59
60
61
62
63
64
65
66
67
function comment_help($section = "admin/comment/help") {
  $output = "";

  switch ($section) {
    case 'admin/help':
    case 'admin/comment/help':
      $output .= "<p>When enabled, the Drupal comment module creates a discussion board for each Drupal node. Users can post comments to discuss a forum topic, weblog post, collaborative book page, etc.</p>";
      $output .= "<h3>User control of comment display</h3>";
      $output .= "<p>Attached to each comment board is a control panel for customizing the way that comments are displayed. Users can control the chronological ordering of posts (newest or oldest first) and the number of posts to display on each page. Additional settings include:</p>";
      $output .= "<ul>";
      $output .= "<li><b>Threaded</b> -- Displays the posts grouped according to conversations and subconversations, much like the subject view of an email client.</li>";
      $output .= "<li><b>Flat</b> --  Displays the posts in chronological order, in the order in which they are posted.</li>";
      $output .= "<li><b>Expanded</b> -- Displays the title and text for each post.</li>";
      $output .= "<li><b>Collapsed</b> -- Displays only the title for each post.</li>";
      $output .= "</ul>";
      $output .= strtr("<p>When a user chooses <i>save settings</i>, the comments are then redisplayed using the user's new choices. Administrators can set the default settings for the comment control panel, along with other comment defaults, in %comment-config.</p>",array("%comment-config" => l(t("site configuration &raquo; modules &raquo; comment"), "admin/system/modules/comment") ));
      $output .= "<p>NOTE: When comment moderation is enabled, users will have another control panel option to control thresholds (see below).</p>";

      $output .= "<h3>Additional comment configurations</h3>";
      $output .= strtr("<p>Comments behave like other user submissions in Drupal. Filters, smileys and HTML that work in nodes will also work with content. To prevent a single user from spamming the web site with too many comments, administrators can set a comment throttle in %site-config under <i>Submission settings</i>.</p>", array("%site-config" => l(t("site configuration"), "admin/system") ));
      $output .= strtr("<p>Administrators can control access to various comment module functions through %user-permissions. Know that in a new Drupal installation, all comment permissions are disabled by default. The choice of which permissions to grant to which roles (groups of users) is left up to the site administrator.</p>", array("%user-permissions" => l(t("user management &raquo; user permissions"), "admin/user/permission") ));
      $output .= "<p>The following permissions can be enabled for anonymous users, authenticated users, or any other user roles that the administrator chooses to define:</p>";
      $output .= "<ul>";
      $output .= "<li><b>Access comments</b> -- Allows users to view comments.</li>";
      $output .= "<li><b>Administrate comments</b> -- Allows users complete control over configuring, editing and deleting all comments on the site. Best reserved for <b>very</b> trusted users.</li>";
      $output .= "<li><b>Moderate comments</b> -- Allows users to rate comment postings (see more on moderation below).</li>";
      $output .= "<li><b>Post comments</b> -- Allows users to post comments into an administrator moderation queue. Administrators then post the comment to the site.</li>";
      $output .= "<li><b>Post comments without approval</b> -- Allows users to directly post comments. This bypasses the administrator moderation queue.</li>";
      $output .= "</ul>";

      $output .= "<h3>Notification of new comments</h3>";
      $output .= "<p>Drupal provides specific features to inform site members when new comments have been posted:</p>";
      $output .= "<ul>";
      $output .= "<li>On the home page, Drupal displays the total number of comments attached to each node, and tracks comments read by individual site members. Members which have logged in will see a notice accompanying nodes which contain comments that they have not read.</li>";
      $output .= strtr("<li>The <i>tracker</i> module, disabled by default, displays all the site's recent posts. When logged in, members will find a %tracker in their user information block with a link to the %tracker-recent page. This page is a useful way to browse new or updated nodes and comments. Content which the user has not yet read is tagged with a red star (this graphic depends on the current theme). Visit the comment board for any node, and Drupal will display a red <i>new</i> label beside the text of unread comments.</li>",array("%tracker" => l(t("view recent posts"), "tracker"), "%tracker-recent" => l(t("Recent activity"), "tracker") ));
      $output .= strtr("<li>Some administrators may want to %download-notify, install and configure the notify module. Users can then request that Drupal send them an email when new comments are posted (the notify module requires that cron.php be configured properly).</li>", array("%download-notify" => l(t("download"), "drupal.org/node/view/68", array("location" => "global")) ));
      $output .= "</ul>";

      $output .= "<h3>Comment moderation</h3>";
      $output .= "<p>On sites with active commenting from users, the administrator can turn over comment moderation to the community. </p>";
      $output .= "<p>With comment moderation, each comment is automatically assigned an initial rating. As users read comments, they can apply a vote which affects the comment rating. At the same time, users have an additional option in the control panel which allows them to set a threshold for the comments they wish to view. Those comments with ratings lower than the set threshold will not be shown.</p>";
      $output .= strtr("<p>To enable moderation, the administrator must grant %permission permissions. Then, a number of options in %comment-moderation must be configured.</p>", array("%permission" => l(t("moderate comments"), "admin/user/permissions"), "%comment-moderation" => l(t("comment management &raquo; comment moderation"), "admin/comment/moderation") ));

      $output .= "<h4>Moderation votes</h4>";
      $output .= strtr("<p>The first step is to create moderation labels which allow users to rate a comment.  Go to %comment-votes. In the <i>vote</i> field, enter the textual labels which users will see when casting their votes. Some examples are</p>", array("%comment-votes" => l(t("comment management &raquo; comment moderation &raquo; votes"), "admin/comment/moderation/votes") ));
      $output .= "<ul>";
      $output .= "<li>Excellent +3</li>";
      $output .= "<li>Insightful +2</li>";
      $output .= "<li>Caught My Attention +1</li>";
      $output .= "<li>Useful +1</li>";
      $output .= "<li>Redundant -1</li>";
      $output .= "<li>Flame -3</li>";
      $output .= "</ul>";
      $output .= "<p>So that users know how their votes affect the comment, these examples include the vote value as part of the label, although that is optional.</p>";
      $output .= "<p>Using the weight option, you can control the order in which the votes appear to users. Setting the weight heavier (positive numbers) will make the vote label appear at the bottom of the list. Lighter (a negative number) will push it to the top. To encourage positive voting, a useful order might be higher values, positive votes, at the top, with negative votes at the bottom.</p>";

      $output .= "<h4>Moderators/vote values matrix</h4>";

      $output .= strtr("<p>Next go to %comment-matrix.  Enter the values for the vote labels for each permission role in the vote matrix. The values entered here will be used to create the rating for each comment.</p>", array("%comment-matrix" => l(t("comment management &raquo; comment moderation &raquo; matrix"), "admin/comment/moderation/,atrix") ));
      $output .= "<p>NOTE: Comment ratings are calculated by averaging user votes with the initial rating.</p>";
      $output .= "<h4>Creating comment thresholds</h4>
Dries's avatar
   
Dries committed
68
69
70
71
72
<p>In <i>comment management &raquo; comment moderation &raquo; thresholds</i>, you'll have to create some comment thresholds to make the comment rating system useful. When comment moderation is enabled and the thresholds are created, users will find another comment control panel option for selecting thresholds. They'll use the thresholds you enter here to filter out comments with low ratings. Consequently, you'll probably want to create more than one threshold to give users some flexibility in filtering comments.</p>
<p>When creating the thresholds, note that the <i>Minimum score</i> is asking you for the lowest rating that a comment can have in order to be displayed.</p>
<p>To see a common example of how thresholds work, you might visit <a href=\"http://slashdot.org/\">Slashdot</a> and view one of their comment boards associated with a story. You can reset the thresholds in their comment control panel.</p>

<h4>Initial comment scores</h4>
Dries's avatar
   
Dries committed
73
74
75
76
<p>Finally, you may want to enter some <i>initial comment scores</i>. In <i>comment management &raquo; initial comment scores </i>you can assign a beginning rating for all comments posted by a particular permission role. If you do not assign any initial scores, Drupal will assign a rating of <b>0</b> as the default.</p>";
    break;
  }
  return t($output);
Dries's avatar
   
Dries committed
77
78
}

Dries's avatar
   
Dries committed
79
function comment_system($field) {
Kjartan's avatar
Kjartan committed
80
  $system["description"] = t("Enables user to comment on content (nodes).");
Dries's avatar
   
Dries committed
81
  $system["admin_help"] = t("Comments can be attached to any node. Below are the settings for comments. The display comes in two types, a \"flat list\" where everything is flush to the left side, and comments come in cronological order, and a \"threaded list\" where comments to other comments are placed immediately below the orignal, and slightly indented forming an outline of comments. They also come in two styles: \"expanded\", where you get to see both the title and the contents, and \"collapsed\" where you only see the titles. To set the default threshold you first have to set up thresholds in the <a href=\"%threshold\">comment management &gt;&gt; comment moderation &gt;&gt; thresholds</a> area. Preview comment forces a user to click on a \"Preview\" button so they can see what their comment will look like before they can actually add the comment to the system. If \"New comment form\" is enabled then at the bottom of every comment page there will be a form too add a new comment.", array("%threshold" => url("admin/comment/moderation/filters")));
82
83
84
  return $system[$field];
}

85
function comment_settings() {
Dries's avatar
   
Dries committed
86
  global $cmodes, $corder;
Dries's avatar
   
Dries committed
87

Dries's avatar
   
Dries committed
88
89
90
  $output .= form_select(t("Default display mode"), "comment_default_mode", variable_get("comment_default_mode", 4), $cmodes, t("The default view for comments. Expanded views display the body of the comment. Threaded views keep replies together."));
  $output .= form_select(t("Default display order"), "comment_default_order", variable_get("comment_default_order", 1), $corder, t("The default sorting for new users and anonymous users while viewing comments. These users may change their view using the comment control panel. For registered users, this change is remembered as a persistent user preference."));
  $output .= form_textfield(t("Default comments per page"), "comment_default_per_page", variable_get("comment_default_per_page", "50"), 5, 5, t("Default number of comments for each page; more comments are distributed in several pages."));
Dries's avatar
   
Dries committed
91

Dries's avatar
   
Dries committed
92
  $result = db_query("SELECT fid, filter FROM {moderation_filters} ");
Dries's avatar
   
Dries committed
93
94
  while ($filter = db_fetch_object($result)) {
    $thresholds[$filter->fid] = ($filter->filter);
Dries's avatar
   
Dries committed
95
96
  }

Dries's avatar
   
Dries committed
97
  $output .= form_select(t("Default threshold"), "comment_default_threshold", variable_get("comment_default_threshold", 0), $thresholds, t("Thresholds are values below which comments are hidden. These thresholds are useful for busy sites which want to hide poor comments from most users."));
Dries's avatar
   
Dries committed
98

Dries's avatar
   
Dries committed
99
100
101
  $output .= form_select(t("Preview comment"), "comment_preview", variable_get("comment_preview", 1), array(t("Optional"), t("Required")), t("Must users preview comments before submitting?"));
  $output .= form_select(t("New comment form"), "comment_new_form", variable_get("comment_new_form", 0), array(t("Disabled"), t("Enabled")), t("New comment form in the node page?"));
  $output .= form_select(t("Comment controls"), "comment_controls", variable_get("comment_controls", 0), array(t("Above comments"), t("Below comments"), t("Above and below")), t("Position of the comment controls box."));
Dries's avatar
   
Dries committed
102

Dries's avatar
   
Dries committed
103
  return $output;
Dries's avatar
   
Dries committed
104
105
}

Dries's avatar
   
Dries committed
106
107
108
function comment_user($type, $edit, &$user) {
  switch ($type) {
    case "view_public":
Dries's avatar
   
Dries committed
109
      if ($user->signature) {
Dries's avatar
   
Dries committed
110
        return form_item(t("Signature"), check_output($user->signature));
Dries's avatar
   
Dries committed
111
112
      }
      break;
Dries's avatar
   
Dries committed
113
    case "view_private":
Dries's avatar
   
Dries committed
114
      if ($user->signature) {
Dries's avatar
   
Dries committed
115
        return form_item(t("Signature"), check_output($user->signature));
Dries's avatar
   
Dries committed
116
117
      }
      break;
Dries's avatar
   
Dries committed
118
119
    case "edit_form":
      // when user tries to edit his own data
Dries's avatar
   
Dries committed
120
      return form_textarea(t("Signature"), "signature", $edit["signature"], 70, 3, t("Your signature will be publicly displayed at the end of your comments.") ."<br />". form_allowed_tags_text());
Dries's avatar
   
Dries committed
121
122
    case "edit_validate":
      // validate user data editing
Dries's avatar
   
Dries committed
123
      return array("signature" => $edit["signature"]);
Dries's avatar
   
Dries committed
124
125
126
  }
}

Dries's avatar
   
Dries committed
127
function comment_access($op, $comment) {
Dries's avatar
   
Dries committed
128
129
  global $user;

Dries's avatar
   
Dries committed
130
131
132
133
134
135
136
137
138
139
140
  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
141
  }
Dries's avatar
   
Dries committed
142

Dries's avatar
   
Dries committed
143
144
145
146
147
}

function comment_form($edit) {
  global $user;

Dries's avatar
   
Dries committed
148
  $form .= "<a id=\"comment\"></a>\n";
Dries's avatar
   
Dries committed
149
150
151
152
153

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

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

  // comment field:
Dries's avatar
   
Dries committed
157
  $form .= form_textarea(t("Comment"), "comment", $edit["comment"] ? $edit["comment"] : $user->signature, 70, 10, form_allowed_tags_text());
Dries's avatar
   
Dries committed
158
159

  // preview button:
Dries's avatar
   
Dries committed
160
  $form .= form_hidden("cid", $edit["cid"]);
Dries's avatar
   
Dries committed
161
  $form .= form_hidden("pid", $edit["pid"]);
Dries's avatar
   
Dries committed
162
  $form .= form_hidden("nid", $edit["nid"]);
Dries's avatar
   
Dries committed
163

Dries's avatar
   
Dries committed
164
  if (!$edit["comment"] && variable_get("comment_preview", 1)) {
Dries's avatar
   
Dries committed
165
166
167
168
169
170
171
    $form .= form_submit(t("Preview comment"));
  }
  else {
    $form .= form_submit(t("Preview comment"));
    $form .= form_submit(t("Post comment"));
  }

Dries's avatar
   
Dries committed
172
  return form($form, "post", url("comment/reply/". $edit["nid"]));
Dries's avatar
   
Dries committed
173
174
}

Dries's avatar
   
Dries committed
175
176
177
function comment_edit($cid) {
  global $user;

Dries's avatar
   
Dries committed
178
  $comment = db_fetch_object(db_query("SELECT c.*, u.uid, u.name, u.data FROM {comments} c LEFT JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d AND c.status != 2", $cid));
Dries's avatar
   
Dries committed
179
180
181
182
183
184
185

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

function comment_reply($pid, $nid) {
Dries's avatar
   
Dries committed
186

Dries's avatar
   
Dries committed
187

188
  if (user_access("access comments")) {
Dries's avatar
   
Dries committed
189
190
191
192
193

    /*
    ** Show comment
    */

Dries's avatar
   
Dries committed
194
    if ($pid) {
Dries's avatar
   
Dries committed
195
      $comment = db_fetch_object(db_query("SELECT c.*, u.uid, u.name, u.data FROM {comments} c LEFT JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d AND c.status = 0", $pid));
Dries's avatar
   
Dries committed
196
      comment_view($comment);
Dries's avatar
   
Dries committed
197
    }
Dries's avatar
   
Dries committed
198
    else if (user_access("access content")) {
Dries's avatar
   
Dries committed
199
200
201
      node_view(node_load(array("nid" => $nid)));
      $pid = 0;
    }
Dries's avatar
   
Dries committed
202

Dries's avatar
   
Dries committed
203
204
205
206
    /*
    ** If possible, show reply form
    */

Dries's avatar
   
Dries committed
207
    if (node_comment_mode($nid) != 2) {
Dries's avatar
   
Dries committed
208
      theme("box", t("Reply"), t("This discussion is closed: you can't post new comments."));
Kjartan's avatar
Kjartan committed
209
    }
Dries's avatar
   
Dries committed
210
    else if (user_access("post comments")) {
Dries's avatar
   
Dries committed
211
      theme("box", t("Reply"), comment_form(array("pid" => $pid, "nid" => $nid)));
Dries's avatar
   
Dries committed
212
213
    }
    else {
Dries's avatar
   
Dries committed
214
      theme("box", t("Reply"), t("You are not authorized to post comments."));
Dries's avatar
   
Dries committed
215
    }
Kjartan's avatar
Kjartan committed
216
217
  }
  else {
Dries's avatar
   
Dries committed
218
    theme("box", t("Reply"), t("You are not authorized to view comments."));
Dries's avatar
   
Dries committed
219
220
221
222
  }
}

function comment_preview($edit) {
Dries's avatar
   
Dries committed
223
  global $user;
Dries's avatar
   
Dries committed
224

Dries's avatar
   
Dries committed
225
226
227
228
  foreach ($edit as $key => $value) {
    $comment->$key = $value;
  }

Dries's avatar
   
Dries committed
229
  /*
Dries's avatar
   
Dries committed
230
  ** Attach the user and time information:
Dries's avatar
   
Dries committed
231
232
233
234
235
236
237
238
239
240
  */

  $comment->uid = $user->uid;
  $comment->name = $user->name;
  $comment->timestamp = time();

  /*
  ** Preview the comment:
  */

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

Dries's avatar
   
Dries committed
243
  theme("box", t("Reply"), comment_form($edit));
Kjartan's avatar
Kjartan committed
244
245

  if ($edit["pid"]) {
Dries's avatar
   
Dries committed
246
    $comment = db_fetch_object(db_query("SELECT c.*, u.uid, u.name, u.data FROM {comments} c LEFT JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d AND c.status = 0", $edit["pid"]));
Dries's avatar
   
Dries committed
247
    comment_view($comment);
Kjartan's avatar
Kjartan committed
248
249
250
251
252
  }
  else {
    node_view(node_load(array("nid" => $edit["nid"])));
    $edit["pid"] = 0;
  }
Dries's avatar
   
Dries committed
253
254
255
}

function comment_post($edit) {
Dries's avatar
   
Dries committed
256
  global $user;
Dries's avatar
   
Dries committed
257

Dries's avatar
   
Dries committed
258
  if (user_access("post comments") && node_comment_mode($edit["nid"]) == 2) {
Dries's avatar
   
Dries committed
259

Dries's avatar
   
Dries committed
260
261
262
263
264
    /*
    ** Validate the comment's subject.  If not specified, extract
    ** one from the comment's body.
    */

Dries's avatar
   
Dries committed
265
    $edit["subject"] = strip_tags($edit["subject"]);
Dries's avatar
   
Dries committed
266

Dries's avatar
   
Dries committed
267
268
269
    if ($edit["subject"] == "") {
      $edit["subject"] = substr(strip_tags($edit["comment"]), 0, 29);
    }
Dries's avatar
   
Dries committed
270
271
272
273
274

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

Dries's avatar
   
Dries committed
275
276
277
278
    if ($edit["comment"] == "") {
      return array(t("Empty comment"), t("The comment you submitted is empty."));
    }

Dries's avatar
   
Dries committed
279
280
281
282
283
    /*
    ** Check for duplicate comments.  Note that we have to use the
    ** validated/filtered data to perform such check.
    */

Dries's avatar
   
Dries committed
284
    $duplicate = db_result(db_query("SELECT COUNT(cid) FROM {comments} WHERE pid = %d AND nid = %d AND subject = '%s' AND comment = '%s'", $edit["pid"], $edit["nid"], $edit["subject"], $edit["comment"]), 0);
Dries's avatar
   
Dries committed
285
286

    if ($duplicate != 0) {
Dries's avatar
   
Dries committed
287
      watchdog("warning", "comment: duplicate '". $edit["subject"] ."'");
Dries's avatar
   
Dries committed
288
      return array(t("Duplicate comment"), t("The comment you submitted has already been inserted."));
Dries's avatar
   
Dries committed
289
290
291
    }
    else {

Dries's avatar
   
Dries committed
292
      if ($edit["cid"]) {
Dries's avatar
   
Dries committed
293

Dries's avatar
   
Dries committed
294
295
296
297
298
299
        /*
        ** 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
300
        db_query("UPDATE {comments} SET subject = '%s', comment = '%s' WHERE cid = %d AND uid = '$user->uid'", $edit["subject"], $edit["comment"], $edit["cid"]);
Dries's avatar
   
Dries committed
301
302
303
304
305
306

        /*
        ** Fire a hook
        */

        module_invoke_all("comment", "update", $edit);
Dries's avatar
   
Dries committed
307
308
309
310
311

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

Dries's avatar
   
Dries committed
312
        watchdog("special", "comment: updated '". $edit["subject"] ."'", l(t("view comment"), "node/view/". $edit["nid"] ."#". $edit["cid"]));
Dries's avatar
   
Dries committed
313
314
315
316
317
318
319
320
321
322
323
324
325
      }
      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
326
327
328
329
330
        $status = user_access("post comments without approval") ? 0 : 1;
        $roles = variable_get("comment_roles", array());
        $score = $roles[$user->rid] ? $roles[$user->rid] : 0;
        $users = serialize(array(0 => $score));

Dries's avatar
   
Dries committed
331
        $edit["cid"] = db_next_id("comments_cid");
Dries's avatar
   
Dries committed
332

Dries's avatar
   
Dries committed
333
        db_query("INSERT INTO {comments} (cid, nid, pid, uid, subject, comment, hostname, timestamp, status, score, users) VALUES (%d, %d, %d, %d, '%s', '%s', '%s', %d, %d, %d, '%s')", $edit["cid"], $edit["nid"], $edit["pid"], $user->uid, $edit["subject"], $edit["comment"], getenv("REMOTE_ADDR"), time(), $status, $score, $users);
Dries's avatar
   
Dries committed
334
335
336
337
338
339

        /*
        ** Tell the other modules a new comment has been submitted:
        */

        module_invoke_all("comment", "insert", $edit);
Dries's avatar
   
Dries committed
340
341
342
343

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

Dries's avatar
   
Dries committed
345
        watchdog("special", "comment: added '". $edit["subject"] ."'", l(t("view comment"), "node/view/". $edit["nid"] ."#". $edit["cid"]));
Dries's avatar
   
Dries committed
346
      }
Dries's avatar
   
Dries committed
347
348

      /*
Dries's avatar
   
Dries committed
349
350
      ** Clear the cache so an anonymous user can see his comment being
      ** added.
Dries's avatar
   
Dries committed
351
      */
Dries's avatar
   
Dries committed
352

Dries's avatar
   
Dries committed
353
      cache_clear_all();
Dries's avatar
   
Dries committed
354
355
    }
  }
Dries's avatar
   
Dries committed
356
357
358
359
  else {
    watchdog("error", "comment: unauthorized comment submitted or comment submitted to a closed node '". $edit["subject"] ."'");
    return array(t("Error"), t("You are not authorized to post comments, or this node doesn't accept new comments."));
  }
Dries's avatar
   
Dries committed
360
361

  /*
Dries's avatar
   
Dries committed
362
  ** Redirect the user the node he commented on, or explain queue
Dries's avatar
   
Dries committed
363
364
  */

Dries's avatar
   
Dries committed
365
366
  if ($status == 1) {
    return array(t("Comment queued"), t("Your comment has been queued for moderation by site administrators and will be published after approval."));
Dries's avatar
   
Dries committed
367
368
369
370
  }
}

function comment_links($comment, $return = 1) {
Dries's avatar
   
Dries committed
371
  global $user;
Dries's avatar
   
Dries committed
372

Dries's avatar
   
Dries committed
373
  $links = array();
Dries's avatar
   
Dries committed
374

Dries's avatar
   
Dries committed
375
376
377
378
  /*
  ** If we are viewing just this comment, we link back to the node
  */

Dries's avatar
   
Dries committed
379
  if ($return) {
Dries's avatar
   
Dries committed
380
    $links[] = l(t("parent"), "node/view/$comment->nid#$comment->cid");
Dries's avatar
   
Dries committed
381
  }
Dries's avatar
   
Dries committed
382

Dries's avatar
   
Dries committed
383
384
385
386
  /*
  ** Admin link
  */

Dries's avatar
   
Dries committed
387
  if (user_access("administer comments") && user_access("access administration pages")) {
Dries's avatar
   
Dries committed
388
    $links[] = l(t("administer"), "admin/comment/edit/$comment->cid");
Dries's avatar
   
Dries committed
389
390
  }

Dries's avatar
   
Dries committed
391
  /*
Dries's avatar
   
Dries committed
392
  ** Possibly show edit and reply links
Dries's avatar
   
Dries committed
393
  */
Dries's avatar
   
Dries committed
394

Dries's avatar
   
Dries committed
395
396
397
  if (node_comment_mode($comment->nid) == 2) {
    if (user_access("post comments")) {
      if (comment_access("edit", $comment)) {
Dries's avatar
   
Dries committed
398
        $links[] = l(t("edit your comment"), "comment/edit/$comment->cid", array("title" => t("Make changes to your comment.")));
Dries's avatar
   
Dries committed
399
      }
Dries's avatar
   
Dries committed
400
      $links[] = l(t("reply to this comment"), "comment/reply/$comment->nid/$comment->cid");
Dries's avatar
   
Dries committed
401
402
    }
    else {
403
      $links[] = theme("comment_post_forbidden");
Dries's avatar
   
Dries committed
404
    }
Dries's avatar
   
Dries committed
405
  }
Dries's avatar
   
Dries committed
406
407
408
409

  if ($moderation = comment_moderation_form($comment)) {
    $links[] = $moderation;
  }
Dries's avatar
   
Dries committed
410

Dries's avatar
   
Dries committed
411
  return theme("links", $links);
Dries's avatar
   
Dries committed
412
413
}

Dries's avatar
   
Dries committed
414
415
416
417
418
function comment_view($comment, $links = "", $visible = 1) {

  /*
  ** Switch to folded/unfolded view of the comment
  */
Dries's avatar
   
Dries committed
419

Dries's avatar
   
Dries committed
420
  if (node_is_new($comment->nid, $comment->timestamp)) {
Dries's avatar
   
Dries committed
421
    $comment->new = 1;
Dries's avatar
   
Dries committed
422
    print "<a id=\"new\"></a>\n";
Dries's avatar
   
Dries committed
423
  }
Dries's avatar
   
Dries committed
424

Dries's avatar
   
Dries committed
425
  print "<a id=\"$comment->cid\"></a>\n";
Dries's avatar
   
Dries committed
426
427

  if ($visible) {
Dries's avatar
   
Dries committed
428
    $comment->comment = check_output($comment->comment);
429
    theme("comment", $comment, $links);
Dries's avatar
   
Dries committed
430
431
  }
  else {
432
    theme("comment_folded", $comment);
Dries's avatar
   
Dries committed
433
434
435
  }
}

Dries's avatar
   
Dries committed
436
function comment_render($node, $cid = 0) {
Dries's avatar
   
Dries committed
437
438
439
440
441
442
443
  global $user;

  $mode = $_GET["mode"];
  $order = $_GET["order"];
  $threshold = $_GET["threshold"];
  $comments_per_page = $_GET["comments_per_page"];
  $comment_page = $_GET["comment_page"];
Dries's avatar
   
Dries committed
444
445
446
447
448
449
450

  if (user_access("access comments")) {

    /*
    ** Pre-process variables:
    */

Dries's avatar
   
Dries committed
451
    $nid = $node->nid;
Dries's avatar
   
Dries committed
452
453
    if (empty($nid)) {
      $nid = 0;
Dries's avatar
   
Dries committed
454
455
456
    }

    if (empty($mode)) {
Dries's avatar
   
Dries committed
457
      $mode = $user->mode ? $user->mode : variable_get("comment_default_mode", 4);
Dries's avatar
   
Dries committed
458
459
460
    }

    if (empty($order)) {
Dries's avatar
   
Dries committed
461
      $order = $user->sort ? $user->sort : variable_get("comment_default_order", 1);
Dries's avatar
   
Dries committed
462
463
464
    }

    if (empty($threshold)) {
Dries's avatar
   
Dries committed
465
      $threshold = $user->uid ? $user->threshold : variable_get("comment_default_threshold", 0);
Dries's avatar
   
Dries committed
466
    }
Dries's avatar
   
Dries committed
467
    $threshold_min = db_result(db_query("SELECT minimum FROM {moderation_filters} WHERE fid = %d", $threshold));
Dries's avatar
   
Dries committed
468

Dries's avatar
   
Dries committed
469
470
471
    if (empty($comment_page)) {
      $comment_page = 1;
    }
Dries's avatar
   
Dries committed
472

Dries's avatar
   
Dries committed
473
474
475
    if (empty($comments_per_page)) {
      $comments_per_page = $user->comments_per_page ? $user->comments_per_page : variable_get("comment_default_per_page", "50");
    }
Dries's avatar
   
Dries committed
476

Dries's avatar
   
Dries committed
477
    print "<a id=\"comment\"></a>\n";
Dries's avatar
   
Dries committed
478
479


Kjartan's avatar
Kjartan committed
480
    if ($cid) {
Dries's avatar
   
Dries committed
481
482
483
484
485

      /*
      ** Single comment view
      */

Dries's avatar
   
Dries committed
486
      print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
Dries's avatar
   
Dries committed
487
488
      print form_hidden("nid", $nid);

Dries's avatar
   
Dries committed
489
      $result = db_query("SELECT c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name, u.data, c.score, c.users FROM {comments} c LEFT JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d AND c.status = 0 GROUP BY c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name, u.data, c.score, c.users", $cid);
Dries's avatar
   
Dries committed
490

Dries's avatar
   
Dries committed
491
492
493
      if ($comment = db_fetch_object($result)) {
        comment_view($comment, comment_links($comment));
      }
Dries's avatar
   
Dries committed
494

Dries's avatar
   
Dries committed
495
      if ((comment_user_can_moderate($node)) && $user->uid != $comment->uid && !(comment_already_moderated($user->uid, $comment->users))) {
Dries's avatar
   
Dries committed
496
        print "<div style=\"text-align: center;\">". form_submit(t("Moderate comment")) ."</div><br />";
Dries's avatar
   
Dries committed
497
      }
Dries's avatar
   
Dries committed
498
      print "</div></form>";
Dries's avatar
   
Dries committed
499
    }
Dries's avatar
   
Dries committed
500
    else {
Dries's avatar
   
Dries committed
501

Dries's avatar
   
Dries committed
502
503
504
505
      /*
      ** Multiple comments view
      */

Dries's avatar
   
Dries committed
506
      $query .= "SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name, u.data, c.score, c.users FROM {comments} c LEFT JOIN {users} u ON c.uid = u.uid WHERE c.nid = '". check_query($nid) ."' AND c.status = 0";
Dries's avatar
   
Dries committed
507
508
509
510
511

      $query .= " GROUP BY c.cid, c.pid, c.nid, c.subject, c.comment, c.timestamp, u.uid, u.name, u.data, c.score, c.users";

      if ($order == 1) {
        $query .= " ORDER BY c.timestamp DESC";
Dries's avatar
   
Dries committed
512
      }
Dries's avatar
   
Dries committed
513
514
515
516
517
518
519
520
521
522
523
524
      else if ($order == 2) {
        $query .= " ORDER BY c.timestamp";
      }

      /*
      ** Start a form, to use with comment control and moderation
      */

      $result = db_query($query);
      $comment_num = db_num_rows($result);

      if ($comment_num && ((variable_get("comment_controls", 0) == 0) || (variable_get("comment_controls", 0) == 2))) {
Dries's avatar
   
Dries committed
525
        print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
526
        theme("box", "", theme("comment_controls", $threshold, $mode, $order, $nid, $comment_page, $comment_num, $comments_per_page));
Dries's avatar
   
Dries committed
527
        print form_hidden("nid", $nid);
Dries's avatar
   
Dries committed
528
        print "</div></form>";
Dries's avatar
   
Dries committed
529
      }
Dries's avatar
   
Dries committed
530

Dries's avatar
   
Dries committed
531
      print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
Dries's avatar
   
Dries committed
532
533
534
535
536
537
538
539
540
541
542
      print form_hidden("nid", $nid);

      if ($comment_num) {
        if ($mode == 1) {
          /*
          ** Flat collapsed
          */

          while ($comment = db_fetch_object($result)) {
            $comments[$comment->cid] = $comment;
          }
543
          theme("comment_flat_collapsed", $comments, $threshold_min);
Dries's avatar
   
Dries committed
544
        }
Dries's avatar
   
Dries committed
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
        else if ($mode == 2) {
          /*
          ** Flat expanded
          **
          ** We page using PHP, not using SQL because otherwise we'd
          ** have to use two queries; one for each comment and one for
          ** the paged comments.  In method 1-3 we take all results
          ** anyway, wheras in method 4 we need every result to create
          ** proper pages.  It is here where we lose more, in fact for
          ** higher pages we transfer unneeded data from the db and
          ** the web server.
          **
          ** TODO: the comment above is a bit cryptic.  Mind to make it
          **       a bit more verbose/explanatory?
          */

          $comment_num = 0;
          $page = 1;
          while ($comment = db_fetch_object($result)) {
            if ($page == $comment_page) {
              $comments[$comment->cid] = $comment;
            }
            $comment_num++;
            if ($comment_num == $comments_per_page) {
              if ($page == $comment_page) {
                break;
              }
              else {
                $comment_num = 0;
                $page++;
              }
            }

            if ($user->uid != $comment->uid && !(comment_already_moderated($user->uid, $comment->users))) {
              $show_moderate_button = 1;
            }
          }

583
          theme("comment_flat_expanded", $comments, $threshold_min);
Dries's avatar
   
Dries committed
584
585

          if (comment_user_can_moderate($node) && $show_moderate_button) {
Dries's avatar
   
Dries committed
586
            print "<div style=\"text-align: center;\">". form_submit(t("Moderate comments")) ."</div><br />";
Dries's avatar
   
Dries committed
587
          }
Dries's avatar
   
Dries committed
588
        }
Dries's avatar
   
Dries committed
589
590
591
592
        else if ($mode == 3) {
          /*
          ** Threaded collapsed
          */
Dries's avatar
   
Dries committed
593

Dries's avatar
   
Dries committed
594
595
596
597
          while ($comment = db_fetch_object($result)) {
            $comments[$comment->cid] = $comment;
          }
          if ($comments) {
598
            theme("comment_thread_min", $comments, $threshold_min);
Dries's avatar
   
Dries committed
599
          }
Dries's avatar
   
Dries committed
600
601
        }
        else {
Dries's avatar
   
Dries committed
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
          /*
          ** Threaded expanded
          */

          while ($comment = db_fetch_object($result)) {
            $comments[$comment->cid] = $comment;

            if ($user->uid != $comment->uid && !(comment_already_moderated($user->uid, $comment->users))) {
              $show_moderate_button = 1;
            }
          }

          /*
          ** Build the comment structure
          */

          $structure = comment_thread_structure($comments, 0, 0, array());

          $comment_num = 0;
          $page = 1;
          foreach ($structure as $cid => $depth) {
            if ($page == $comment_page) {
624
              theme("comment_thread_max", $comments[$cid], $threshold_min, $depth - 1);
Dries's avatar
   
Dries committed
625
626
627
628
629
630
631
632
633
634
635
636
637
638
            }
            $comment_num++;
            if ($comment_num == $comments_per_page) {
              if ($page == $comment_page) {
                break;
              }
              else {
                $comment_num = 0;
                $page++;
              }
            }
          }

          if (comment_user_can_moderate($node) && $show_moderate_button) {
Dries's avatar
   
Dries committed
639
            print "<div style=\"text-align: center;\">". form_submit(t("Moderate comments")) ."</div><br />";
Dries's avatar
   
Dries committed
640
          }
Dries's avatar
   
Dries committed
641
642
        }
      }
Dries's avatar
   
Dries committed
643

Dries's avatar
   
Dries committed
644
      print "</div></form>";
Dries's avatar
   
Dries committed
645
646

      if ($comment_num && ((variable_get("comment_controls", 0) == 1) || (variable_get("comment_controls", 0) == 2))) {
Dries's avatar
   
Dries committed
647
        print "<form method=\"post\" action=\"". url("comment") ."\"><div>\n";
Dries's avatar
   
Dries committed
648
        theme("box", t("Control panel"), theme("comment_controls", $threshold, $mode, $order, $nid, $comment_page, $comment_num, $comments_per_page));
Dries's avatar
   
Dries committed
649
        print form_hidden("nid", $nid);
Dries's avatar
   
Dries committed
650
        print "</div></form>";
Dries's avatar
   
Dries committed
651
      }
Dries's avatar
   
Dries committed
652
653
    }

Dries's avatar
   
Dries committed
654
655
656
657
658
    /*
    ** If enabled, show new comment form
    */

    if (user_access("post comments") && node_comment_mode($nid) == 2 && variable_get("comment_new_form", 0)) {
Dries's avatar
   
Dries committed
659
      theme("box", t("Post new comment"), comment_form(array("nid" => $nid)));
Dries's avatar
   
Dries committed
660
    }
Dries's avatar
   
Dries committed
661
662
663
664

  }
}

Dries's avatar
   
Dries committed
665
666
667
function comment_perm() {
  return array("access comments", "post comments", "administer comments", "moderate comments", "post comments without approval", "administer moderation");
}
Dries's avatar
   
Dries committed
668

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

Dries's avatar
   
Dries committed
671
  if ($type == "node" && $node->comment) {
Dries's avatar
   
Dries committed
672
673
674
675
676
677
678
679

    if ($main) {

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

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

Dries's avatar
   
Dries committed
683
        if ($all) {
Dries's avatar
   
Dries committed
684
          $links[] = l(format_plural($all, "1 comment", "%count comments"), "node/view/$node->nid#comment", array("title" => t("Jump to the first comment of this posting.")));
Dries's avatar
   
Dries committed
685

Dries's avatar
   
Dries committed
686
          if ($new) {
Dries's avatar
   
Dries committed
687
            $links[] = l(format_plural($new, "1 new comment", "%count new comments"), "node/view/$node->nid#new", array("title" => t("Jump to the first new comment of this posting.")));
Dries's avatar
   
Dries committed
688
689
690
691
          }
        }
        else {
          if (user_access("post comments")) {
Dries's avatar
   
Dries committed
692
            $links[] = l(t("add new comment"), "comment/reply/$node->nid", array("title" => t("Add a new comment to this page.")));
Dries's avatar
   
Dries committed
693
694
          }
          else {
695
            $links[] = theme("comment_post_forbidden");
Dries's avatar
   
Dries committed
696
697
          }
        }
Dries's avatar
   
Dries committed
698
699
700
701
702
      }
    }
    else {
      /*
      ** Node page: add a "post comment" link if the user is allowed to
Dries's avatar
   
Dries committed
703
      ** post comments and if this node is not read-only
Dries's avatar
   
Dries committed
704
705
      */

Dries's avatar
   
Dries committed
706
707
      if ($node->comment == 2) {
        if (user_access("post comments")) {
Dries's avatar
   
Dries committed
708
          $links[] = l(t("add new comment"), "comment/reply/$node->nid#comment", array("title" => t("Share your thoughts and opinions related to this posting.")));
Kjartan's avatar
Kjartan committed
709
710
        }
        else {
711
          $links[] = theme("comment_post_forbidden");
Dries's avatar
   
Dries committed
712
        }
Dries's avatar
   
Dries committed
713
      }
Dries's avatar
   
Dries committed
714
      else {
Dries's avatar
   
Dries committed
715
        $links[] = t("Closed discussion: you can't post new comments.");
Dries's avatar
   
Dries committed
716
      }
Dries's avatar
   
Dries committed
717
718
719
    }
  }

Dries's avatar
   
Dries committed
720
  if ($type == "admin" && user_access("administer comments")) {
Dries's avatar
   
Dries committed
721
722
723
724
725
726

    menu("admin/comment", "comment management", "comment_admin", comment_help("admin/comment"), 2);
    menu("admin/comment/comments", "comment overview",NULL, comment_help("admin/comment/comments"), 2);
    menu("admin/comment/comments/0", "new or updated comments", "comment_admin", comment_help("admin/comment/comments/0"), 1);
    menu("admin/comment/comments/1", "comment approval queue", "comment_admin", comment_help("admin/comment/comments/1"), 2);
    menu("admin/comment/search", "search comments", "comment_admin", comment_help("admin/comment/search"), 8);
Dries's avatar
   
Dries committed
727
728
    menu("admin/comment/help", "help", "comment_help", NULL, 9);
    menu("admin/comment/edit", "edit comment", "comment_admin", NULL, 0, 1);
Dries's avatar
   
Dries committed
729
730
731

    // comment settings:
    if (user_access("administer moderation")) {
Dries's avatar
   
Dries committed
732
733
734
735
736
      menu("admin/comment/moderation", "comment moderation", NULL, comment_help("admin/comment/moderation"), 3);
      menu("admin/comment/moderation/votes", "votes", "comment_admin", comment_help("admin/comment/moderation/votes"));
      menu("admin/comment/moderation/matrix", "matrix", "comment_admin", comment_help("admin/comment/moderation/matrix"));
      menu("admin/comment/moderation/filters", "thresholds", "comment_admin", comment_help("admin/comment/moderation/filters"));
      menu("admin/comment/roles", "initial comment scores", "comment_admin", comment_help("admin/comment/roles"), 6);
Dries's avatar
   
Dries committed
737
738
739
    }
  }

Dries's avatar
   
Dries committed
740
  return $links ? $links : array();
Dries's avatar
   
Dries committed
741
742
}

Dries's avatar
   
Dries committed
743
function comment_page() {
Dries's avatar
   
Dries committed
744
745
  $op = $_POST["op"];
  $edit = $_POST["edit"];
Dries's avatar
   
Dries committed
746
747
748
749

  if (empty($op)) {
    $op = arg(1);
  }
Dries's avatar
   
Dries committed
750
751
752

  switch ($op) {
    case "edit":
Dries's avatar
   
Dries committed
753
      theme("header");
Dries's avatar
   
Dries committed
754
      comment_edit(check_query(arg(2)));
Dries's avatar
   
Dries committed
755
      theme("footer");
Dries's avatar
   
Dries committed
756
      break;
Dries's avatar
   
Dries committed
757
758
759
    case t("Moderate comments"):
    case t("Moderate comment"):
      comment_moderate($edit);
Dries's avatar
   
Dries committed
760
      drupal_goto(url("node/view/". $edit["nid"]));
Dries's avatar
   
Dries committed
761
      break;
Dries's avatar
   
Dries committed
762
    case "reply":
Dries's avatar
   
Dries committed
763
      theme("header");
Dries's avatar
   
Dries committed
764
      comment_reply(check_query(arg(3)), check_query(arg(2)));
Dries's avatar
   
Dries committed
765
      theme("footer");
Dries's avatar
   
Dries committed
766
767
      break;
    case t("Preview comment"):
Dries's avatar
   
Dries committed
768
      theme("header");
Dries's avatar
   
Dries committed
769
      comment_preview($edit);
Dries's avatar
   
Dries committed
770
      theme("footer");
Dries's avatar
   
Dries committed
771
772
      break;
    case t("Post comment"):
Dries's avatar
   
Dries committed
773
774
      list($error_title, $error_body) = comment_post($edit);
      if ($error_body) {
Dries's avatar
   
Dries committed
775
776
777
        theme("header");
        theme("box", $error_title, $error_body);
        theme("footer");
Dries's avatar
   
Dries committed
778
779
      }
      else {
Dries's avatar
   
Dries committed
780
        drupal_goto(url("node/view/". $edit["nid"]));
Dries's avatar
   
Dries committed
781
      }
Dries's avatar
   
Dries committed
782
      break;
783
    case t("Save settings"):
Dries's avatar
   
Dries committed
784
785
786
787
788
      $mode = $_POST["mode"];
      $order = $_POST["order"];
      $threshold = $_POST["threshold"];
      $comments_per_page = $_POST["comments_per_page"];

789
      comment_save_settings(check_query($mode), check_query($order), check_query($threshold), check_query($comments_per_page));
Dries's avatar
   
Dries committed
790
      drupal_goto(url("node/view/". $edit["nid"], "mode=$mode&order=$order&threshold=$threshold&comments_per_page=$comments_per_page"));
Dries's avatar
   
Dries committed
791
792
793
794
      break;
  }
}

Dries's avatar
   
Dries committed
795
796
797
/**
*** admin functions
**/
Dries's avatar
   
Dries committed
798

Dries's avatar
   
Dries committed
799
function comment_node_link($node) {
Dries's avatar
 
Dries committed
800

Dries's avatar
   
Dries committed
801
  if (user_access("administer comments")) {
Dries's avatar
 
Dries committed
802

Dries's avatar
   
Dries committed
803
804
805
    /*
    ** Edit comments:
    */
Dries's avatar
 
Dries committed
806

Dries's avatar
   
Dries committed
807
    $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 = %d AND c.status = 0 ORDER BY c.timestamp", $node->nid);
Dries's avatar
   
Dries committed
808

Dries's avatar
   
Dries committed
809
810

    $header = array(t("title"), t("author"), array("data" => t("operations"), "colspan" => 3));
Dries's avatar
   
Dries committed
811
812

    while ($comment = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
813
      $rows[] = array(l($comment->subject, "node/view/$node->nid#$comment->cid"), format_name($comment), l(t("view comment"), "node/view/$node->nid#$comment->cid"), l(t("edit comment"), "admin/comment/edit/$comment->cid"), l(t("delete comment"), "admin/comment/delete/$comment->cid"));
Dries's avatar
   
Dries committed
814
815
    }

Dries's avatar
   
Dries committed
816
817
818
819
    if ($rows) {
      $output  = "<h3>". t("Edit comments") ."</h3>";
      $output .= table($header, $rows);
    }
Dries's avatar
   
Dries committed
820
821

    return $output;
Dries's avatar
 
Dries committed
822
  }
Dries's avatar
   
Dries committed
823
}
Dries's avatar
   
Dries committed
824

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

Dries's avatar
   
Dries committed
827
  $result = db_query("SELECT c.*, u.name, u.uid FROM {comments} c LEFT JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d AND c.status != 2", $id);
Dries's avatar
   
Dries committed
828
829
830
831
832
833
834
835
836
837
838
839
840
841
  $comment = db_fetch_object($result);

  // if a comment is "deleted", it's deleted
  if ($comment) {
    $form .= form_item(t("Author"), format_name($comment));
    $form .= form_textfield(t("Subject"), "subject", $comment->subject, 70, 128);
    $form .= form_textarea(t("Comment"), "comment", $comment->comment, 70, 15);
    $form .= form_select(t("Status"), "status", $comment->status, array("published", "not published"));
    $form .= form_hidden("cid", $id);
    $form .= form_submit(t("Submit"));
    $form .= form_submit(t("Delete"));

    return form($form);
  }
Dries's avatar
 
Dries committed
842
843
}

Dries's avatar
   
Dries committed
844
845
846
function comment_delete($edit) {

  if ($edit["confirm"]) {
Dries's avatar
   
Dries committed
847
    db_query("UPDATE {comments} SET status = 2 WHERE cid = %d", $edit["cid"]);
Dries's avatar
   
Dries committed
848
    watchdog("special", "comment: deleted comment #". $edit["cid"]);
Dries's avatar
   
Dries committed
849
    $output = "deleted comment.";
Dries's avatar
   
Dries committed
850
851
852
853
854
855
856
857
858
859
  }
  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
860
861
}

Dries's avatar
   
Dries committed
862
function comment_save($id, $edit) {
Dries's avatar
   
Dries committed
863
  db_query("UPDATE {comments} SET subject = '%s', comment = '%s', status = %d WHERE cid = %d", $edit["subject"], $edit["comment"], $edit["status"], $id);
Dries's avatar
   
Dries committed
864
  watchdog("special", "comment: modified '". $edit["subject"] ."'");
Dries's avatar
   
Dries committed
865
  return "updated comment.";
Dries's avatar
   
Dries committed
866
867
}

Dries's avatar
   
Dries committed
868
function comment_admin_overview($status = 0) {
Dries's avatar
   
Dries committed
869

Dries's avatar
   
Dries committed
870
  $result = pager_query("SELECT c.*, u.name, u.uid FROM {comments} c LEFT JOIN {users} u ON u.uid = c.uid WHERE c.status = '". check_query($status). "' ORDER BY c.timestamp DESC",  50);
Dries's avatar
   
Dries committed
871

Dries's avatar
   
Dries committed
872
  $header = array(t("subject"), t("author"), t("status"), array("data" => t("operations"), "colspan" => 2));
Dries's avatar
   
Dries committed
873
  while ($comment = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
874
    $rows[] = array(l($comment->subject, "node/view/$comment->nid/$comment->cid#$comment->cid", array("title" => htmlspecialchars(substr($comment->comment, 0, 128)))) ." ". (node_is_new($comment->nid, $comment->timestamp) ? theme_mark() : ""), format_name($comment), ($comment->status == 0 ? t("published") : t("not published")) ."</td><td>". l(t("edit comment"), "admin/comment/edit/$comment->cid"), l(t("delete comment"), "admin/comment/delete/$comment->cid"));
Dries's avatar
   
Dries committed
875
876
  }

Dries's avatar
   
Dries committed
877
878
  if ($pager = pager_display(NULL, 50, 0, "admin")) {
    $rows[] = array(array("data" => $pager, "colspan" => 5));
Dries's avatar
   
Dries committed
879
880
  }

Dries's avatar
   
Dries committed
881
  return table($header, $rows);
Dries's avatar
   
Dries committed
882
883
884
885
886
887
}

function comment_mod_matrix($edit) {

  $output .= "<h3>Moderators/vote values matrix</h3>";

Dries's avatar
Dries committed
888
  if ($edit) {
Dries's avatar
   
Dries committed
889
    db_query("DELETE FROM {moderation_roles} ");
Dries's avatar
Dries committed
890
    foreach ($edit as $role_id => $votes) {
Dries's avatar
   
Dries committed
891
      foreach ($votes as $mid => $value) {
Dries's avatar
   
Dries committed
892
        $sql[] = "('$mid', '$role_id', '". ($value ? $value : 0 ) ."')";
Dries's avatar
   
Dries committed
893
894
      }
    }
Dries's avatar
   
Dries committed
895
    db_query("INSERT INTO {moderation_roles} (mid, rid, value) VALUES ". implode(", ", $sql));
Dries's avatar
   
Dries committed
896
897
  }

Dries's avatar
   
Dries committed
898
  $result = db_query("SELECT r.rid, r.name FROM {role} r, {permission} p WHERE r.rid = p.rid AND p.perm LIKE '%moderate comments%'");
Dries's avatar
   
Dries committed
899
900
901
902
903
  $role_names = array();
  while ($role = db_fetch_object($result)) {
    $role_names[$role->rid] = $role->name;
  }

Dries's avatar
   
Dries committed
904
  $result = db_query("SELECT rid, mid, value FROM {moderation_roles} ");
Dries's avatar
   
Dries committed
905
906
907
908
  while ($role = db_fetch_object($result)) {
    $mod_roles[$role->rid][$role->mid] = $role->value;
  }

Dries's avatar
Dries committed
909
  $header = array_merge(array(t("votes")), array_values($role_names));
Dries's avatar
   
Dries committed
910

Dries's avatar
   
Dries committed
911
  $result = db_query("SELECT mid, vote FROM {moderation_votes} ORDER BY weight");
Dries's avatar
   
Dries committed
912
  while ($vote = db_fetch_object($result)) {
Dries's avatar
Dries committed
913
    $row = array($vote->vote);
Dries's avatar
   
Dries committed
914
    foreach (array_keys($role_names) as $rid) {
Dries's avatar
Dries committed
915
      $row[] = array("data" => form_textfield(NULL, "$rid][$vote->mid", $mod_roles[$rid][$vote->mid], 4, 3), "align" => "center");
Dries's avatar
   
Dries committed
916
    }
Dries's avatar
Dries committed
917
    $rows[] = $row;
Dries's avatar
   
Dries committed
918
  }
Dries's avatar
Dries committed
919
  $output .= table($header, $rows);
Dries's avatar
   
Dries committed
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
  $output .= "<br />". form_submit(t("Submit votes"));

  return form($output);
}

function comment_mod_roles($edit) {

  $output .= "<h3>Initial comment scores</h3>";

  if ($edit) {
    variable_set("comment_roles", $edit);
  }

  $start_values = variable_get("comment_roles", array());

Dries's avatar
   
Dries committed
935
  $result = db_query("SELECT r.rid, r.name FROM {role} r, {permission} p WHERE r.rid = p.rid AND p.perm LIKE '%post comments%'");
Dries's avatar
   
Dries committed
936

Dries's avatar
Dries committed
937
  $header = array(t("user role"), t("initial score"));
Dries's avatar
   
Dries committed
938
939

  while ($role = db_fetch_object($result)) {
Dries's avatar
Dries committed
940
    $rows[] = array($role->name, array("data" => form_textfield(NULL, $role->rid, $start_values[$role->rid], 4, 3), "align" => "center"));
Dries's avatar
   
Dries committed
941
942
  }

Dries's avatar
Dries committed
943
  $output .= table($header, $rows);
Dries's avatar
   
Dries committed
944
945
946
947
948
949
  $output .= "<br />". form_submit(t("Save scores"));

  return form($output);
}

function comment_mod_votes($edit) {
Dries's avatar
   
Dries committed
950
  $op = $_POST["op"];
Dries's avatar
   
Dries committed
951

Dries's avatar
   
Dries committed
952
  $mid = arg(4);
Dries's avatar
   
Dries committed
953
954

  if ($op == t("Save vote")) {
Dries's avatar
   
Dries committed
955
    db_query("UPDATE {moderation_votes} SET vote = '%s', weight = %d WHERE mid = %d", $edit["vote"], $edit["weight"], $mid);
Dries's avatar
   
Dries committed
956
957
958
    $mid = 0;
  }
  else if ($op == t("Delete vote")) {
Dries's avatar
   
Dries committed
959
960
    db_query("DELETE FROM {moderation_votes} WHERE mid = %d", $mid);
    db_query("DELETE FROM {moderation_roles} WHERE mid = %d", $mid);
Dries's avatar
   
Dries committed
961
962
963
    $mid = 0;
  }
  else if ($op == t("Add new vote")) {
Dries's avatar
   
Dries committed
964
    db_query("INSERT INTO {moderation_votes} (vote, weight) VALUES ('%s', %d)", $edit["vote"], $edit["weight"]);
Dries's avatar
   
Dries committed
965
966
967
    $mid = 0;
  }

Dries's avatar
   
Dries committed
968
  $output .= "<h3>" . t("Moderation votes overview") . "</h3>";
Dries's avatar
Dries committed
969
  $header = array(t("votes"), t("weight"), t("operations"));
Dries's avatar
   
Dries committed
970

Dries's avatar
   
Dries committed
971
  $result = db_query("SELECT mid, vote, weight FROM {moderation_votes} ORDER BY weight");
Dries's avatar
   
Dries committed
972
  while ($vote = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
973
    $rows[] = array($vote->vote, array("data" => $vote->weight, "align" => "center"), array("data" => l(t("edit"), "admin/comment/moderation/votes/$vote->mid"), "align" => "center"));
Dries's avatar
   
Dries committed
974
  }
Dries's avatar
Dries committed
975
  $output .= table($header, $rows);
Dries's avatar
   
Dries committed
976
977

  if ($mid) {
Dries's avatar
   
Dries committed
978
    $vote = db_fetch_object(db_query("SELECT vote, weight FROM {moderation_votes} WHERE mid = %d", $mid));
Dries's avatar
   
Dries committed
979
980
  }

Dries's avatar
   
Dries committed
981
  $output .= "<br /><h3>". (isset($mid) ? "Edit" : "Add new") ."moderation option</h3>";
Dries's avatar
   
Dries committed
982
  $form .= form_textfield(t("Vote"), "vote", $vote->vote, 32, 64, t("The name of this vote.  Example: 'off topic', 'excellent', 'sucky'."));
Dries's avatar
   
Dries committed
983
  $form .= form_textfield(t("Weight"), "weight", $vote->weight, 32, 64, t("Used to order votes in the comment control box; heavier sink."));
Dries's avatar
   
Dries committed
984
985
986
987
988
989
990
991
992
993
994
995
996
997
  if ($mid) {
    $form .= form_submit(t("Save vote"));
    $form .= form_submit(t("Delete vote"));
  }
  else {
    $form .= form_submit(t("Add new vote"));
  }

  $output .= form($form);

  return $output;
}

function comment_mod_filters($edit) {
Dries's avatar
   
Dries committed
998
  $op = $_POST["op"];
Dries's avatar
   
Dries committed
999

Dries's avatar