node.module 14.5 KB
Newer Older
Dries's avatar
 
Dries committed
1
2
<?php

Dries's avatar
   
Dries committed
3
4
5
6
7
8
9
10
11
12
class Node {
  function Node($node) {
    global $user;
    $this->userid = $node[userid] ? $node[userid] : $user->userid;
    $this->title = $node[title];
    $this->timestamp = $node[timestamp] ? $node[timestamp] : time();
    $this->cid = $node[cid];
    $this->tid = $node[tid];
  }
}
Dries's avatar
 
Dries committed
13

Dries's avatar
CHANGES    
Dries committed
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function node_conf_filters() {
  $output .= form_select(t("Strip HTML tags"), "filter_html", variable_get("filter_html", 0), array("Disabled", "Enabled"), t("Strip HTML and PHP tags."));
  $output .= form_textfield(t("Allowed HTML tags"), "allowed_html", variable_get("allowed_html", "<A><B><BLOCKQUOTE><DD><DL><DT><I><LI><OL><U><UL>"), 64, 128, t("If enabled, optionally specify tags which should not be stripped.  'STYLE' attributes, 'ON' attributes and unclosed tags are always stripped."));
  $output .= "<HR>";
  $output .= form_select(t("Strip link tags"), "filter_link", variable_get("filter_link", 0), array("Disabled", "Enabled"), t("Substitute special [[link]] tags."));
  $output .= "<HR>";
  return $output;
}

function node_filter_html($text) {
  $text = eregi_replace("([ \f\r\t\n\'\"])style=[^>]+", "\\1", $text);
  $text = eregi_replace("([ \f\r\t\n\'\"])on[a-z]+=[^>]+", "\\1", $text);
  $text = strip_tags($text, variable_get("allowed_html", ""));
  return $text;
}

function node_filter_link($text) {
Dries's avatar
   
Dries committed
31
32
33
34
35
  $src = array("/\[\[(([^\|]*?)(\|([^\|]*?))?)\]\]/e");  // [link|description]
  $dst = array(format_tag('\\2', '\\4'));                // [link|description]
  return preg_replace($src, $dst, $text);
}

Dries's avatar
CHANGES    
Dries committed
36
37
38
39
40
41
function node_filter($text) {
  if (variable_get("filter_html", 0)) $text = node_filter_html($text);
  if (variable_get("filter_link", 0)) $text = node_filter_link($text);
  return $text;
}

Dries's avatar
Dries committed
42
43
44
45
46
47
function node_cron() {
  db_query("UPDATE node SET status = '". node_status("posted") ."', timestamp_posted = '' WHERE timestamp_posted > 0 AND timestamp_posted < ". time());
  db_query("UPDATE node SET status = '". node_status("queued") ."', timestamp_posted = '' WHERE timestamp_queued > 0 AND timestamp_queued < ". time());
  db_query("UPDATE node SET status = '". node_status("dumped") ."', timestamp_posted = '' WHERE timestamp_hidden > 0 AND timestamp_hidden < ". time());
}

Dries's avatar
   
Dries committed
48
function node_overview($query) {
Dries's avatar
   
Dries committed
49
  global $user;
Dries's avatar
 
Dries committed
50

Dries's avatar
   
Dries committed
51
52
  $color = array("#ffdc9b", "#dedec4");
  $query = node_query($query ? $query : 0);
Dries's avatar
Dries committed
53

Dries's avatar
   
Dries committed
54
  $result = db_query("SELECT n.*, u.userid, c.name AS category FROM node n LEFT JOIN users u ON n.author = u.id LEFT JOIN category c ON n.cid = c.cid $query[1] LIMIT 50");
Dries's avatar
 
Dries committed
55

Dries's avatar
   
Dries committed
56
  $output .= status($query[0]);
Dries's avatar
 
Dries committed
57
  $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
Dries's avatar
Dries committed
58
59
  $output .= " <TR><TH>title</TH><TH>type</TH><TH>status</TH><TH>meta attributes</TH><TH>author</TH><TH>date</TH></TR>\n";

Dries's avatar
 
Dries committed
60
  while ($node = db_fetch_object($result)) {
Dries's avatar
Dries committed
61
62
    unset ($link);

Dries's avatar
   
Dries committed
63
64
65
66
67
    $link[] = "<A HREF=\"admin.php?mod=node&type=$node->type&op=edit&id=$node->nid\">edit content</A>";
    $link[] = "<A HREF=\"admin.php?mod=node&op=option&id=$node->nid\">edit options</A>";
    $link[] = "<A HREF=\"admin.php?mod=node&op=status&id=$node->nid\">edit status</A>";
    $link[] = "<A HREF=\"admin.php?mod=node&op=attribute&id=$node->nid\">edit attributes</A>";
    $link[] = "<A HREF=\"admin.php?mod=node&op=delete&id=$node->nid\">delete node</A>";
Dries's avatar
Dries committed
68

Dries's avatar
   
Dries committed
69
    $bg = $color[$i++ % sizeof($color)];
Dries's avatar
Dries committed
70

Dries's avatar
   
Dries committed
71
72
    $output .= " <TR BGCOLOR=\"$bg\"><TD><A HREF=\"node.php?id=$node->nid\">". check_output($node->title) ."</A></TD><TD ALIGN=\"center\">$node->type</TD><TD>". node_status($node->status) ."</TD><TD>". check_output($node->attribute) ."</TD><TD>". format_username($node->userid) ."</TD><TD>". format_date($node->timestamp, "small") ."</TD></TR>\n";
    $output .= " <TR BGCOLOR=\"$bg\"><TD ALIGN=\"right\" COLSPAN=\"6\"><SMALL>". implode(", ", $link) ."</SMALL></TD>\n";
Dries's avatar
 
Dries committed
73
74
75
76
77
78
  }
  $output .= "</TABLE>\n";

  return $output;
}

Dries's avatar
Dries committed
79
80
81
function node_edit_option($id) {
  global $user;

82
  $node = node_get_object(array("nid" => $id));
Dries's avatar
 
Dries committed
83

Dries's avatar
Dries committed
84
85
86
87
88
89
  $form .= form_item("Document title", check_output($node->title));
  $form .= form_select("Comment", "comment", $node->comment, node_comment_status(), "Allow users to post comments to this document.");
  $form .= form_select("Promote", "promote", $node->promote, node_promote_status(), "Promote this document on the main page.");
  $form .= form_textfield("Moderate", "moderate", $node->moderate, 35, 255, t("A comma-seperated list of the moderators their usernames."));
  $form .= form_hidden("nid", $node->nid);
  $form .= form_submit("Save node");
Dries's avatar
 
Dries committed
90

Dries's avatar
   
Dries committed
91
  return form("admin.php?mod=node&id=$node->nid", $form);
Dries's avatar
 
Dries committed
92
93
}

Dries's avatar
Dries committed
94
function node_edit_attribute($id) {
Dries's avatar
   
Dries committed
95
  global $user;
Dries's avatar
 
Dries committed
96

97
  $node = node_get_object(array("nid" => $id));
Dries's avatar
 
Dries committed
98

Dries's avatar
Dries committed
99
  $form .= form_item("Document title", check_output($node->title));
Dries's avatar
   
Dries committed
100
  $form .= form_textfield("Attributes", "attribute", $node->attribute, 50, 128, htmlentities("A list meta attributes.  Format: <type>:<value>;<type>:<value>;.  Example: 'software:apache;type:webserver;os:linux;'."));
Dries's avatar
   
Dries committed
101
102
  $form .= form_hidden("nid", $node->nid);
  $form .= form_submit("Save node");
Dries's avatar
 
Dries committed
103

Dries's avatar
   
Dries committed
104
  return form("admin.php?mod=node&id=$node->nid", $form);
Dries's avatar
 
Dries committed
105
106
}

Dries's avatar
Dries committed
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
function node_edit_status($id) {
  global $REQUEST_URI;

  $node = node_get_object(array("nid" => $id));

  $form .= form_item("Document title", check_output($node->title));
  $form .= form_select("Current status", "status", $node->status, node_status($node->type));
  $form .= form_textfield("Automatically post document", "timestamp_posted", ($node->timestamp_posted ? format_date($node->timestamp_posted) : ""), 30, 55, "The date at which your document will be automatically posted.  Leave empty if you don't want to schedule this document, or fill out a string containing an English date format.  Example input: '". date("j F Y G:i") ."', '". date("m/d/y H:i") ."', '". date("F j, Y H:i") ."', ...");
  $form .= form_textfield("Automatically queue document", "timestamp_queued", ($node->timestamp_queued ? format_date($node->timestamp_queued) : ""), 30, 55, "The date at which your document will be automatically queued.  Leave empty if you don't want to schedule this document, or fill out a string containing an English date format.  Example input: '". date("j F Y G:i") ."', '". date("m/d/y H:i") ."', '". date("F j, Y H:i") ."', ...");
  $form .= form_textfield("Automatically hide document", "timestamp_hidden", ($node->timestamp_hidden ? format_date($node->timestamp_hidden) : ""), 30, 55, "The date at which your document will be automatically hidden.  Leave empty if you don't want to schedule this document, or fill out a string containing an English date format.  Example input: '". date("j F Y G:i") ."', '". date("m/d/y H:i") ."', '". date("F j, Y H:i") ."', ...");
  $form .= form_hidden("nid", $node->nid);
  $form .= form_submit("Save node");

  return form($REQUEST_URI, $form);
}

Dries's avatar
 
Dries committed
123
function node_delete($id) {
Dries's avatar
   
Dries committed
124
  return (node_del(array("nid" => $id)) ? "node has been deleted." : "failed to delete node: node must be dumped first.");
Dries's avatar
 
Dries committed
125
126
}

Dries's avatar
   
Dries committed
127
function node_query($type = -1) {
Dries's avatar
Dries committed
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  $queries[] = array("all nodes: recent additions", "ORDER BY n.timestamp DESC");
  $queries[] = array("all nodes: status set to 'posted'", "WHERE n.status = '". node_status("posted") ."' ORDER BY n.timestamp DESC");
  $queries[] = array("all nodes: status set to 'queued'", "WHERE n.status = '". node_status("queued") ."' ORDER BY n.timestamp DESC");
  $queries[] = array("all nodes: status set to 'dumped'", "WHERE n.status = '". node_status("dumped") ."' ORDER BY n.timestamp DESC");
  $queries[] = array("all nodes: scheduled to be posted", "WHERE n.timestamp_posted > 0 ORDER BY n.timestamp DESC");
  $queries[] = array("all nodes: scheduled to be queued", "WHERE n.timestamp_queued > 0 ORDER BY n.timestamp DESC");
  $queries[] = array("all nodes: scheduled to be hidden", "WHERE n.timestamp_hidden > 0 ORDER BY n.timestamp DESC");

  foreach (module_list() as $name) {
    if (module_hook($name, "user")) {
      $queries[] = array("$name: recent additions", "WHERE n.type = '$name' ORDER BY n.timestamp DESC");
      $queries[] = array("$name: status set to 'posted'", "WHERE n.type = '$name' AND n.status = '". node_status("posted") ."' ORDER BY n.timestamp DESC");
      $queries[] = array("$name: status set to 'queued'", "WHERE n.type = '$name' AND n.status = '". node_status("queued") ."' ORDER BY n.timestamp DESC");
      $queries[] = array("$name: status set to 'dumped'", "WHERE n.type = '$name' AND n.status = '". node_status("dumped") ."' ORDER BY n.timestamp DESC");
      $queries[] = array("$name: scheduled to be posted", "WHERE n.type = '$name' AND n.timestamp_posted > 0 ORDER BY n.timestamp DESC");
      $queries[] = array("$name: scheduled to be queued", "WHERE n.type = '$name' AND n.timestamp_queued > 0 ORDER BY n.timestamp DESC");
      $queries[] = array("$name: scheduled to be hidden", "WHERE n.type = '$name' AND n.timestamp_hidden > 0 ORDER BY n.timestamp DESC");
    }
  }

Dries's avatar
   
Dries committed
148
  return ($type < 0 ? $queries : $queries[$type]);
Dries's avatar
   
Dries committed
149
150
}

Dries's avatar
   
Dries committed
151
152
153
function node_listing($queries) {
  global $mod;
  foreach ($queries as $key=>$array) {
Dries's avatar
   
Dries committed
154
    $output .= "<LI><A HREF=\"admin.php?mod=$mod&query=$key\">$array[0]</A></LI>\n";
Dries's avatar
   
Dries committed
155
156
157
158
  }
  return "<OL>$output</OL>\n";
}

Dries's avatar
   
Dries committed
159
160
161
162
163
164
165
166
167
168
function node_setting() {
  global $REQUEST_URI;

  $threshold_post = array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13, 14 => 14, 15 => 15, 20 => 20, 25 => 25, 30 => 30, 35 => 35, 40 => 40, 45 => 45, 50 => 50, 60 => 60, 70 => 70, 80 => 80, 90 => 90, 100 => 100);
  $threshold_dump = array(-1 => -1, -2 => -2, -3 => -3, -4 => -4, -5 => -5, -6 => -6, -7 => -7, -8 => -8, -9 => -9, -10 => -10, -11 => -11, -12 => -12, -13 => -13, -14 => -14, -15 => -15, -20 => -20, -25 => -25, -30 => -30);
  $threshold_expire = array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13, 14 => 14, 15 => 15, 20 => 20, 25 => 25, 30 => 30, 35 => 35, 40 => 40, 45 => 45, 50 => 50, 60 => 60, 70 => 70, 80 => 80, 90 => 90, 100 => 100);

  foreach (module_list() as $name) {
    if (module_hook($name, "user")) {
      $form .= "<H3>Default settings for $name nodes</H3>";
Dries's avatar
Dries committed
169
170
171
172
173
174
175
      $form .= form_select(t("Comment"), $name ."_comment", variable_get($name ."_comment", 0), node_comment_status(), "By default, allow or dissallow users to post comments in this category.");
      $form .= form_select(t("Promote"), $name ."_promote", variable_get($name ."_promote", 0), node_promote_status(), "By default, promote new submissions in this category to the front page.");
      $form .= form_select(t("Status"), $name ."_status", variable_get($name ."_status", node_status("queued")), node_status($name), "What to do with new submissions in this category?");
      $form .= form_select(t("Post threshold"), $name ."_post", variable_get($name ."_post", 4), $threshold_post, "If new submissions are subject to moderation, select a post threshold.");
      $form .= form_select(t("Dump threshold"), $name ."_dump", variable_get($name ."_dump", -2), $threshold_dump, "If new submissions are subject to moderation, select a dump threshold.");
      $form .= form_select(t("Expiration threshold"), $name ."_expire", variable_get($name ."_expire", 8), $threshold_expire, "If new submissions are subject to moderation, select a expiration threshold.");
      $form .= form_textfield("Moderate", $name ."_moderate", variable_get($name ."_moderate", ""), 35, 255, "A comma-seperated list of the moderators' usernames.");
Dries's avatar
   
Dries committed
176
177
178
179
180
181
182
183
184
    }
  }

  $form .= form_submit("Save settings");
  $form .= form_submit("Reset to defaults");

  return form($REQUEST_URI, $form);
}

Dries's avatar
Dries committed
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
function node_admin_save($edit) {
  if (isset($edit[status])) {
    $edit[timestamp_posted] = (strtotime($edit[timestamp_posted]) > time()) ? strtotime($edit[timestamp_posted]) : 0;
    $edit[timestamp_queued] = (strtotime($edit[timestamp_queued]) > time()) ? strtotime($edit[timestamp_queued]) : 0;
    $edit[timestamp_hidden] = (strtotime($edit[timestamp_hidden]) > time()) ? strtotime($edit[timestamp_hidden]) : 0;
    node_save($edit, array(status, timestamp_posted, timestamp_queued, timestamp_hidden));
  }
  else if (isset($edit[attribute])) {
    node_save($edit, array(attribute));
  }
  else {
    node_save($edit, array(comment, moderate, promote));
  }
}

function node_search() {
  global $REQUEST_URI;

  foreach (module_list() as $name) {
    if (module_hook($name, "user")) {
      $options .= "<OPTION VALUE=\"$name\">$name</OPTION>\n";
    }
  }

  $output .= "<FORM ACTION=\"$REQUEST_URI\" METHOD=\"POST\">\n";
  $output .= " <INPUT SIZE=\"50\" VALUE=\"". check_form($keys) ."\" NAME=\"keys\" TYPE=\"text\">\n";
Dries's avatar
   
Dries committed
211
  $output .= " <SELECT NAME=\"type\">$options</SELECT>\n";
Dries's avatar
Dries committed
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
  $output .= " <INPUT TYPE=\"submit\" VALUE=\"Search\">\n";
  $output .= "</FORM>\n";

  return $output;
}

function node_module_edit($edit, $type) {
  $edit[type] = $type;
  return node_invoke($edit, "form");
}

function node_module_save($edit, $type) {
  $edit[type] = $type;
  return node_invoke($edit, "save");
}

Dries's avatar
 
Dries committed
228
function node_admin() {
Dries's avatar
Dries committed
229
  global $op, $id, $edit, $query, $type, $keys;
Dries's avatar
   
Dries committed
230

Dries's avatar
Dries committed
231
232
233
234
235
236
237
  foreach (module_list() as $name) {
    if (module_hook($name, "status") && $name != "node") {
      $link[] = "<A HREF=\"admin.php?mod=node&type=$name&op=add\">add $name</A>";
    }
  }

  print "<SMALL>". implode(" | ", $link) ." | <A HREF=\"admin.php?mod=node&op=default\">node settings</A> | <A HREF=\"admin.php?mod=node&op=listing\">node listings</A> | <A HREF=\"admin.php?mod=node&op=search\">search node</A> | <A HREF=\"admin.php?mod=node\">overview</A></SMALL><HR>\n";
Dries's avatar
 
Dries committed
238
239
240
241

  $id = check_input($edit[nid] ? $edit[nid] : $id);

  switch ($op) {
Dries's avatar
Dries committed
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
    case "add":
      print module_invoke($type, "form");
      break;
    case "search":
      print node_search($id);
      print search_data($keys, $type);
      break;
    case "status":
      print node_edit_status($id);
      break;
    case "option":
      print node_edit_option($id);
      break;
    case "attribute":
      print node_edit_attribute($id);
Dries's avatar
 
Dries committed
257
      break;
Dries's avatar
   
Dries committed
258
259
260
    case "default":
      print node_setting();
      break;
Dries's avatar
Dries committed
261
    case "delete":
Dries's avatar
 
Dries committed
262
      print status(node_delete($id));
Dries's avatar
   
Dries committed
263
      print node_overview($query);
Dries's avatar
 
Dries committed
264
      break;
Dries's avatar
   
Dries committed
265
    case "listing":
Dries's avatar
   
Dries committed
266
      print node_listing(node_query());
Dries's avatar
   
Dries committed
267
      break;
Dries's avatar
   
Dries committed
268
    case "Save settings":
Dries's avatar
   
Dries committed
269
      print status(conf_save($edit));
Dries's avatar
   
Dries committed
270
      print node_setting();
Dries's avatar
   
Dries committed
271
272
273
      break;
    case "Reset to defaults":
      print status(conf_default($edit));
Dries's avatar
   
Dries committed
274
      print node_setting();
Dries's avatar
   
Dries committed
275
      break;
Dries's avatar
 
Dries committed
276
    case "Save node":
Dries's avatar
Dries committed
277
      print node_admin_save($edit);
Dries's avatar
   
Dries committed
278
      print node_overview($query);
Dries's avatar
Dries committed
279
280
281
      break;
    case "edit":
      print node_module_edit(node_get_array(array("nid" => $id)), $type);
Dries's avatar
 
Dries committed
282
      break;
Dries's avatar
Dries committed
283
284
    case "Preview":
      print node_module_edit($edit, $type);
Dries's avatar
 
Dries committed
285
      break;
Dries's avatar
Dries committed
286
287
288
    case "Submit":
      print status(node_module_save($edit, $type));
      // fall through:
Dries's avatar
 
Dries committed
289
    default:
Dries's avatar
   
Dries committed
290
      print node_overview($query);
Dries's avatar
 
Dries committed
291
292
293
294
  }
}

?>