node.module 14.8 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 63 64 65 66 67 68
    unset ($link);

    $link[] = user_access($user, $node->type) ? "<A HREF=\"admin.php?mod=node&type=$node->type&op=edit&id=$node->nid\">edit content</A>" : "edit content";
    $link[] = user_access($user, "node") ? "<A HREF=\"admin.php?mod=node&op=option&id=$node->nid\">edit options</A>" : "edit options";
    $link[] = user_access($user, "node") ? "<A HREF=\"admin.php?mod=node&op=status&id=$node->nid\">edit status</A>" : "edit status";
    $link[] = user_access($user, "node") ? "<A HREF=\"admin.php?mod=node&op=attribute&id=$node->nid\">edit attributes</A>" : "edit attributes";
    $link[] = user_access($user, "node") ? "<A HREF=\"admin.php?mod=node&op=delete&id=$node->nid\">delete node</A>" : "delete node";

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 100
  $form .= form_item("Document title", check_output($node->title));
  $form .= form_textfield("Attributes", "attribute", $edit[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 = "") {
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 149 150
  return ($queries[$type] ? $queries[$type] : $queries);
}

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 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
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";
  $output .= " <SELECT NAME=\"module\">$options</SELECT>\n";
  $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
  }
}

?>