body = $book[body]; $this->parent = $book[parent]; $this->weight = $book[weight]; } } function book_perm() { return array("administer book"); } function book_link($type) { if ($type == "admin" && user_access("administer book")) { $links[] = "collaborative book"; } if ($type == "page" && user_access("access content")) { $links[] = "". t("collaborative book") .""; } return $links ? $links : array(); } 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 ($main) { $theme->node($node, $main); } else { 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; $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("administer nodes") ? "admin.php?mod=node&type=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; // 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("administer nodes")) { $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 $REQUEST_URI, $user; if ($edit[title]) { $form .= book_view(new Book(node_preview($edit))); } $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_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], 70, 20, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", ""))); $form .= form_textarea(t("Log message"), "log", $edit[log], 70, 5, t("An explanation of the additions or updates being made to help the group understand your motivations.")); if (user_access("administer nodes")) { $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("nid", $edit[nid]); } if ($edit[pid] > 0) { $form .= form_hidden("pid", $edit[pid]); } if ($edit && !$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, comment => variable_get("book_comment", 0), log, moderate => variable_get("book_moderate", ""), parent, pid, promote => variable_get("book_promote", 0), score => 0, status => variable_get("book_status", $status[queued]), timestamp => time(), title, type => "book", votes => 0, weight)); } else if (user_access("administer nodes")) { node_save($edit, array(body, log, parent, title, type => "book", weight)); } } function book_delete($node) { if ($node->pid && $node->status == node_status("posted")) { db_query("UPDATE node SET status = '". node_status("posted") ."' WHERE nid = '$node->pid'"); } } function book_insert($node) { if ($node->pid && $node->status == node_status("posted")) { db_query("UPDATE node SET status = '". node_status("expired") ."' WHERE nid = '$node->pid'"); } } function book_update($node) { if ($node->pid && $node->status == node_status("posted")) { db_query("UPDATE node SET status = '". node_status("expired") ."' WHERE nid = '$node->pid'"); } } function book_parent($nid) { global $status; if ($node = node_get_object(array("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_admin() { if (user_access("administer book")) { print book_tree(); } else { print message_access(); } } function book_page() { global $status, $theme; if (user_access("access content")) { $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(); } else { $theme->header(); $theme->box(t("Access denied"), message_access()); $theme->footer(); } } function book_edit($id) { global $status; if ($node = node_get_object(array("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(n.nid) FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE b.pid = '$node->nid' AND n.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_edit($id)); break; case t("Preview"): $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($query) { global $book; if ($book) { print book_export_html($book, $depth = 1); } } ?>