node.module 14.9 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
 
Dries committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
function node_help() {
  global $mod;
 ?>
  <P>Todo.</P>
 <?php

  if ($mod == "node") {
    foreach (module_list() as $name) {
      if (module_hook($name, "status") && $name != "node") {
        print "<H3>". ucfirst($name) ." type</H3>";
        print module_invoke($name, "help");
      }
    }
  }
}

Dries's avatar
CHANGES  
Dries committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
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
47 48 49 50 51
  $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
52 53 54 55 56 57
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
58 59 60 61 62 63
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
64
function node_overview($query) {
Dries's avatar
 
Dries committed
65
  global $user;
Dries's avatar
 
Dries committed
66

Dries's avatar
 
Dries committed
67 68
  $color = array("#ffdc9b", "#dedec4");
  $query = node_query($query ? $query : 0);
Dries's avatar
Dries committed
69

Dries's avatar
 
Dries committed
70
  $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
71

Dries's avatar
 
Dries committed
72
  $output .= status($query[0]);
Dries's avatar
 
Dries committed
73
  $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
Dries's avatar
Dries committed
74 75
  $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
76
  while ($node = db_fetch_object($result)) {
Dries's avatar
Dries committed
77 78
    unset ($link);

Dries's avatar
 
Dries committed
79 80 81 82 83
    $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
84

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

Dries's avatar
 
Dries committed
87 88
    $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
89 90 91 92 93 94
  }
  $output .= "</TABLE>\n";

  return $output;
}

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

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

Dries's avatar
Dries committed
100 101 102 103 104 105
  $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
106

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

Dries's avatar
Dries committed
110
function node_edit_attribute($id) {
Dries's avatar
 
Dries committed
111
  global $user;
Dries's avatar
 
Dries committed
112

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

Dries's avatar
Dries committed
115
  $form .= form_item("Document title", check_output($node->title));
Dries's avatar
 
Dries committed
116
  $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
117 118
  $form .= form_hidden("nid", $node->nid);
  $form .= form_submit("Save node");
Dries's avatar
 
Dries committed
119

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

Dries's avatar
Dries committed
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
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
139
function node_delete($id) {
Dries's avatar
 
Dries committed
140
  return (node_del(array("nid" => $id)) ? "node has been deleted." : "failed to delete node: node must be dumped first.");
Dries's avatar
 
Dries committed
141 142
}

Dries's avatar
 
Dries committed
143
function node_query($type = -1) {
Dries's avatar
Dries committed
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
  $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
164
  return ($type < 0 ? $queries : $queries[$type]);
Dries's avatar
 
Dries committed
165 166
}

Dries's avatar
 
Dries committed
167 168 169
function node_listing($queries) {
  global $mod;
  foreach ($queries as $key=>$array) {
Dries's avatar
 
Dries committed
170
    $output .= "<LI><A HREF=\"admin.php?mod=$mod&query=$key\">$array[0]</A></LI>\n";
Dries's avatar
 
Dries committed
171 172 173 174
  }
  return "<OL>$output</OL>\n";
}

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

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

  return form($REQUEST_URI, $form);
}

Dries's avatar
Dries committed
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
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
227
  $output .= " <SELECT NAME=\"type\">$options</SELECT>\n";
Dries's avatar
Dries committed
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
  $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
244
function node_admin() {
Dries's avatar
Dries committed
245
  global $op, $id, $edit, $query, $type, $keys;
Dries's avatar
 
Dries committed
246

Dries's avatar
Dries committed
247 248 249 250 251 252
  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>";
    }
  }

Dries's avatar
 
Dries committed
253
  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> | <A HREF=\"admin.php?mod=node&op=help\">help</A></SMALL><HR>\n";
Dries's avatar
 
Dries committed
254 255 256 257

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

  switch ($op) {
Dries's avatar
Dries committed
258 259 260
    case "add":
      print module_invoke($type, "form");
      break;
Dries's avatar
 
Dries committed
261 262 263
    case "help":
      print node_help();
      break;
Dries's avatar
Dries committed
264 265 266 267 268 269 270 271 272 273 274 275
    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
276
      break;
Dries's avatar
 
Dries committed
277 278 279
    case "default":
      print node_setting();
      break;
Dries's avatar
Dries committed
280
    case "delete":
Dries's avatar
 
Dries committed
281
      print status(node_delete($id));
Dries's avatar
 
Dries committed
282
      print node_overview($query);
Dries's avatar
 
Dries committed
283
      break;
Dries's avatar
 
Dries committed
284
    case "listing":
Dries's avatar
 
Dries committed
285
      print node_listing(node_query());
Dries's avatar
 
Dries committed
286
      break;
Dries's avatar
 
Dries committed
287
    case "Save settings":
Dries's avatar
 
Dries committed
288
      print status(conf_save($edit));
Dries's avatar
 
Dries committed
289
      print node_setting();
Dries's avatar
 
Dries committed
290 291 292
      break;
    case "Reset to defaults":
      print status(conf_default($edit));
Dries's avatar
 
Dries committed
293
      print node_setting();
Dries's avatar
 
Dries committed
294
      break;
Dries's avatar
 
Dries committed
295
    case "Save node":
Dries's avatar
Dries committed
296
      print node_admin_save($edit);
Dries's avatar
 
Dries committed
297
      print node_overview($query);
Dries's avatar
Dries committed
298 299 300
      break;
    case "edit":
      print node_module_edit(node_get_array(array("nid" => $id)), $type);
Dries's avatar
 
Dries committed
301
      break;
Dries's avatar
Dries committed
302 303
    case "Preview":
      print node_module_edit($edit, $type);
Dries's avatar
 
Dries committed
304
      break;
Dries's avatar
Dries committed
305 306 307
    case "Submit":
      print status(node_module_save($edit, $type));
      // fall through:
Dries's avatar
 
Dries committed
308
    default:
Dries's avatar
 
Dries committed
309
      print node_overview($query);
Dries's avatar
 
Dries committed
310 311 312 313
  }
}

?>