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 = array()) {
Dries's avatar
 
Dries committed
49
  global $user;
Dries's avatar
 
Dries committed
50

Dries's avatar
Dries committed
51 52
  $colors = array("#ffdc9b", "#dedec4");

Dries's avatar
 
Dries committed
53
  $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
54

Dries's avatar
 
Dries committed
55
  $output .= status($query[0]);
Dries's avatar
 
Dries committed
56
  $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
Dries's avatar
Dries committed
57 58
  $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
59
  while ($node = db_fetch_object($result)) {
Dries's avatar
Dries committed
60 61 62 63 64 65 66 67 68 69 70 71
    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";

    $color = $colors[$i++ % sizeof($colors)];

    $output .= " <TR BGCOLOR=\"$color\"><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=\"$color\"><TD ALIGN=\"right\" COLSPAN=\"6\"><SMALL>". implode(", ", $link) ."</SMALL></TD>\n";
Dries's avatar
 
Dries committed
72 73 74 75 76 77
  }
  $output .= "</TABLE>\n";

  return $output;
}

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

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

Dries's avatar
Dries committed
83 84 85 86 87 88
  $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
89

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

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

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

Dries's avatar
Dries committed
98 99
  $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
100 101
  $form .= form_hidden("nid", $node->nid);
  $form .= form_submit("Save node");
Dries's avatar
 
Dries committed
102

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

Dries's avatar
Dries committed
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
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
122
function node_delete($id) {
Dries's avatar
 
Dries committed
123
  return (node_del(array("nid" => $id)) ? "node has been deleted." : "failed to delete node: node must be dumped first.");
Dries's avatar
 
Dries committed
124 125
}

Dries's avatar
 
Dries committed
126
function node_query($type = "") {
Dries's avatar
Dries committed
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
  $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
147 148 149
  return ($queries[$type] ? $queries[$type] : $queries);
}

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

Dries's avatar
 
Dries committed
158 159 160 161 162 163 164 165 166 167
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
168 169 170 171 172 173 174
      $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
175 176 177 178 179 180 181 182 183
    }
  }

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

  return form($REQUEST_URI, $form);
}

Dries's avatar
Dries committed
184 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
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
227
function node_admin() {
Dries's avatar
Dries committed
228
  global $op, $id, $edit, $query, $type, $keys;
Dries's avatar
 
Dries committed
229

Dries's avatar
Dries committed
230 231 232 233 234 235 236
  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
237 238 239 240

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

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

?>