body = $book[body]; $this->parent = $book[parent]; $this->weight = $book[weight]; } } function book_status() { return array(dumped, expired, queued, posted); } function book_location($node, $nodes = array()) { $parent = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE n.nid = '$node->parent'")); if ($parent->title) { $nodes = book_location($parent, $nodes); array_push($nodes, $parent); } return $nodes; } function book_view($node, $main = 0) { global $status, $theme; if ($node->nid && $node->parent) { $list = book_parent_query($node->parent); $next = db_fetch_object(db_query("SELECT n.nid, n.title FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE n.status = '$status[posted]' AND $list AND b.weight > '$node->weight' ORDER BY b.weight ASC")); $prev = db_fetch_object(db_query("SELECT n.nid, n.title FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE n.status = '$status[posted]' AND $list AND b.weight < '$node->weight' ORDER BY b.weight DESC")); } $output .= "\n"; if ($node->title) { foreach (book_location($node) as $level) { $location .= "$indent nid\">$level->title
"; $indent .= "-"; } $output .= " \n"; $output .= " "; $output .= " \n"; } if ($node->body) { $output .= " "; } if ($node->nid) { $output .= " "; } $output .= " "; $output .= " \n"; $output .= " \n"; $output .= "
$location". node_control($node) ."

". check_output($node->title) ."". ($node->body ? "
Last updated by ". format_username($node->userid) ." on ". format_date($node->timestamp) ." " : "") ."

". check_output($node->body, 1) ."

". book_tree($node->nid) ."

". ($prev ? "nid\">". t("previous") ."" : t("previous")) ."index". ($next ? "nid\">". t("next") ."" : t("next")) ."
". ($prev ? "". check_output($prev->title) ."" : " ") ."". ($node->parent ? "parent\">". t("up") ."" : t("up")) ."". ($next ? "". check_output($next->title) ."" : " ") ."
\n"; $theme->box(t("Handbook"), $output); } function book_search($keys) { global $status, $user; $result = db_query("SELECT n.*, u.userid FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid LEFT JOIN users u ON n.author = u.id WHERE n.type = 'book' AND n.status = '$status[posted]' AND (n.title LIKE '%". check_input($keys) ."%' OR b.body LIKE '%". check_input($keys) ."%') ORDER BY n.timestamp DESC LIMIT 20"); while ($node = db_fetch_object($result)) { $find[$i++] = array("title" => check_output($node->title), "link" => (user_access($user, "book") ? "admin.php?mod=book&op=edit&id=$node->nid" : "node.php?id=$node->nid"), "user" => $node->userid, "date" => $node->timestamp); } return $find; } function book_parent_query($parent) { if ($parent != "") { $list = array(); foreach (book_parent($parent) as $pid) array_push($list, "b.parent = $pid"); } else { $list = array("b.parent = ''"); } return "(". implode(" OR ", $list) .")"; } function book_toc($parent = "", $indent = "", $toc = array()) { global $status, $user; // select all child nodes: $result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE n.type = 'book' AND n.status = '$status[posted]' AND ". book_parent_query($parent) ." ORDER BY b.weight"); // add root node: if (user_access($user, "book")) { $toc[0] = " "; } // build table of contents: while ($node = db_fetch_object($result)) { $toc[$node->nid] = "$indent $node->title"; $toc = book_toc($node->nid, "$indent-", $toc); } return $toc; } function book_form($edit = array()) { global $allowed_html, $REQUEST_URI, $user; $form .= form_item(t("Author"), format_username(($edit[userid] ? $edit[userid] : $user->userid))); $form .= form_hidden(userid, $edit[userid]); $form .= form_textfield(t("Subject"), "title", $edit[title], 50, 64); $form .= form_item(t("Category"), category_form_select("book", $edit)); if ($edit[pid]) { $node = node_get_object("nid", $edit[pid]); $form .= form_item(t("Parent"), "id\">". check_output($node->title) ."", t("The parent subject or category the page belongs in.")); $form .= form_hidden("parent", $edit[parent]); } else { $form .= form_select(t("Parent"), "parent", $edit[parent], book_toc(), t("The parent subject or category the page belongs in.")); } $form .= form_textarea(t("Content"), "body", $edit[body], 50, 10, t("Allowed HTML tags") .": ". htmlspecialchars($allowed_html)); $form .= form_textarea(t("Log message"), "log", $edit[log], 50, 5, t("An explanation of the additions or updates being made to help the group understand your motivations.")); if (user_access($user, "book")) { $form .= form_select(t("Weight"), "weight", $edit[weight], array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30), t("The heavier nodes will sink and the lighter nodes will be positioned nearer the top.")); } if ($edit[nid] > 0) { $form .= form_hidden("pid", $edit[pid]); $form .= form_hidden("nid", $edit[nid]); } if (!$edit) { $form .= form_submit(t("Preview")); } else if (!$edit[title]) { $form .= "". t("Warning: you did not supply a title.") ."

\n"; $form .= form_submit(t("Preview")); } else { $form .= form_submit(t("Preview")); $form .= form_submit(t("Submit")); } return form($REQUEST_URI, $form); } function book_save($edit) { global $status, $user; if (!$edit[nid]) { node_save($edit, array(author => $user->id, body, cid, comment => category_comment($edit[cid]), log, moderate => topic_moderate($edit[tid]), promote => category_promote($edit[cid]), score => 0, status => (category_submission($edit[cid]) ? $status[queued] : $status[posted]), tid, timestamp => time(), title, type => "book", votes => 0, weight)); } else if (user_access($user)) { node_save($edit, array(body, cid, log, parent, tid, title, type => "book", weight)); } } function book_parent($nid) { global $status; if ($node = node_get_object("nid", $nid)) { $list[$nid] = $nid; } if ($node->pid) { $list = array_merge($list, book_parent($node->pid)); } return $list ? $list : array(); } function book_tree($parent = "", $depth = 0) { global $PHP_SELF, $status; if ($depth < 3 || strstr($PHP_SELF,"admin.php")) { // select all child nodes: $result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE n.type = 'book' AND n.status = '$status[posted]' AND ". book_parent_query($parent) ." ORDER BY b.weight"); // render output: while ($node = db_fetch_object($result)) { $output .= "

  • nid\">". check_output($node->title) ."". ($PHP_SELF == "/admin.php" ? " (weight: $node->weight/$node->parent, status: $node->status) (nid\">edit)" : "") ."
  • \n"; $output .= book_tree($node->nid, $depth + 1); } $output = ""; } return $output; } function book_list($query = array()) { return node_overview($query); } function book_query($type = "") { global $status; $queries = array(array("recent book pages", "WHERE n.type = 'book' ORDER BY n.timestamp DESC"), array("posted book pages", "WHERE n.type = 'book' AND n.status = '$status[posted]' ORDER BY n.timestamp DESC"), array("queued book pages", "WHERE n.type = 'book' AND n.status = '$status[queued]' ORDER BY n.timestamp DESC"), array("dumped book pages", "WHERE n.type = 'book' AND n.status = '$status[dumped]' ORDER BY n.timestamp DESC")); return ($queries[$type] ? $queries[$type] : $queries); } function book_admin() { global $op, $id, $edit, $mod, $keys, $type, $user; print "add new page | book listing | search book | list overview | tree overview
    \n"; $type = $type ? $type : 0; switch ($op) { case "add": print book_form(); break; case "edit": print book_form(node_get_array(nid, $id)); break; case "listing": print node_listing(book_query()); break; case "search": print search_form($keys); print search_data($keys, $mod); break; case "tree": print book_tree(); break; case t("Preview"): book_view(new Book($edit)); print book_form($edit); break; case t("Submit"): book_save($edit); // fall through: default: print book_list(book_query($type)); } } function book_page() { global $status, $theme; $result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE b.parent = 0 AND n.status = $status[posted] ORDER BY b.weight"); while ($node = db_fetch_object($result)) { $output .= "
    nid\">". check_output($node->title) ."
    ". check_output($node->body, 1) ."

    "; } $theme->header(); $theme->box(t("Handbook"), "
    $output
    "); $theme->footer(); } function book_update($id) { global $status; if ($node = node_get_object("nid", $id)) { if ($node->status != $status[posted]) { return t("You can only update accepted pages: pages that are still queued or already expired can not be updated."); } else if (db_result(db_query("SELECT COUNT(nid) FROM node WHERE pid = '$node->nid' AND status = '$status[queued]'"))) { return t("There is already an update for this node in the queue: we can only process one update at once."); } else { return book_form(array(nid => -1, pid => $id, title => $node->title, body => $node->body, parent => $node->parent)); } } } function book_user() { global $edit, $id, $op, $theme, $user; $title = t("Submit"); switch($op) { case "update": $theme->box($title, book_update($id)); break; case t("Preview"): book_view(new Book($edit)); $theme->box($title, book_form($edit)); break; case t("Submit"): book_save($edit); $theme->box($title, t("Thank you for your submission.")); break; default: $theme->box($title, book_form()); } } function book_export_html($parent = "", $depth = 0) { global $status; $result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE n.type = 'book' AND n.status = '$status[posted]' AND b.parent = '$parent' ORDER BY b.weight"); while ($node = db_fetch_object($result)) { $output .= "". check_output($node->title) .""; if ($node->body) $output .= check_output($node->body, 1); if ($node->pid) $output .= book_export_html($node->pid, $depth + 1); $output .= book_export_html($node->nid, $depth + 1); } return $output; } function book_export($uri) { if ($uri[2] == "book") { print book_export_html($uri[3], $depth = 1); } } ?>