drupal/modules/book/book.module

273 lines
9.4 KiB
Plaintext
Raw Normal View History

<?php
// $Id$
function book_node($field) {
global $user;
$info = array("name" => "book page");
return $info[$field];
}
function book_access($op, $node) {
if ($op == "view") {
return ($node->nid && $node->status && !$node->moderate);
}
if ($op == "create") {
return 1;
}
if ($op == "update") {
/*
** Everyone can upate a book page if the "create new revision"-bit
** is set: that is, only updates that don't overwrite the previous
** conent will be allowed.
*/
return $node->revision;
}
}
function book_link($type) {
if ($type == "page" && user_access("access content")) {
$links[] = "<a href=\"module.php?mod=book\">". t("collaborative book") ."</a>";
}
return $links ? $links : array();
}
function book_load($node) {
$book = db_fetch_object(db_query("SELECT parent, weight FROM book WHERE nid = '$node->nid'"));
return $book;
}
function book_insert($node) {
db_query("INSERT INTO book (nid, parent, weight) VALUES ('$node->nid', '$node->parent', '$node->weight')");
}
function book_update($node) {
db_query("UPDATE book SET parent = '$node->parent', weight = '$node->weight' WHERE nid = '$node->nid'");
}
function book_delete($node) {
db_query("DELETE FROM book WHERE nid = '$node->nid'");
}
function book_save($node) {
if ($node->nid) {
if (user_access("administer nodes")) {
/*
** If a node administrator updates a book page, we don't create a
** new revision unless explicitly specified.
*/
return array("parent", "weight");
}
else {
/*
** If a regular user updates a book page, we always create a new
** revision. These new revisions are subject to moderation, and
** are not or no longer being automatically promoted.
*/
return array("created" => time(), "moderate" => 1, "parent", "promote" => 0, "score" => 0, "status" => 1, "users" => "", "revisions", "votes" => 0, "weight");
}
}
else {
return array("moderate" => 1, "parent", "promote" => 0, "status" => 1, "weight");
}
}
function book_form($node, $help, $error) {
global $user;
$output .= form_select(t("Parent"), "parent", $node->parent, book_toc(), t("The parent subject or category the page belongs in."));
$output .= form_textarea(t("Content"), "body", $node->body, 60, 20, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));
$output .= form_textarea(t("Log message"), "history", $node->history, 60, 5, t("An explanation of the additions or updates being made to help the group understand your motivations."));
if (user_access("administer nodes")) {
$output .= form_select(t("Weight"), "weight", $node->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."));
}
else {
/*
** Carry out some explanation or submission guidelines:
*/
$help = t("\"update book page\"-help: to be written! It should explain the basic idea behind our collaborative book and how their update helps to improve the quality of the book. Also mention that all updates are subject to moderation or review. Any who can put this into a fluent English help text?");
/*
** If a regular user updates a book page, we create a new revision
** authored by that user:
*/
$output .= form_hidden("revision", 1);
$node->uid = $user->uid; // passed by reference
$node->name = $user->name;
}
return $output;
}
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 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 $theme;
if ($main) {
$theme->node($node, $main);
}
else {
if ($node->nid && $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 WHERE n.status = 1 AND b.parent = '$node->parent' AND (b.weight > '$node->weight' OR (b.weight = '$node->weight' AND n.title > '". check_query($node->title) ."')) ORDER BY b.weight ASC, n.title ASC"));
$prev = db_fetch_object(db_query("SELECT n.nid, n.title FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE n.status = 1 AND b.parent = '$node->parent' AND (b.weight < '$node->weight' OR (b.weight = '$node->weight' AND n.title < '". check_query($node->title) ."')) ORDER BY b.weight DESC, n.title DESC"));
}
$output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n";
if ($node->title) {
foreach (book_location($node) as $level) {
$location .= "$indent <a href=\"node.php?id=$level->nid\">$level->title</a><br />";
$indent .= "-";
}
$output .= " <tr><td colspan=\"2\">$location</td><td align=\"right\"><a href=\"module.php?mod=node&op=edit&id=$node->nid\">". t("update this book page") ."</a></td></tr>";
$output .= " <tr><td colspan=\"3\"><hr /></td></tr>";
$output .= " <tr><td colspan=\"3\"><b><big>". check_output($node->title) ."</big></b>". ($node->body ? "<br /><small><i>". sprintf(t("Last updated by %s on %s"), format_name($node), format_date($node->created)) ."</i></small> " : "") ."</td></tr>";
}
if ($node->body) {
$output .= " <tr><td colspan=\"3\"><br />". check_output($node->body, 1) ."</td></tr>";
}
if ($node->nid) {
$output .= " <tr><td colspan=\"3\"><br />". book_tree($node->nid) ."</td></tr>";
}
$output .= " <tr><td colspan=\"3\"><hr /></td></tr>";
$output .= " <tr><td align=\"left\" width=\"33%\">". ($prev ? "<a href=\"node.php?id=$prev->nid\">". t("previous") ."</a>" : t("previous")) ."</td><td align=\"center\" width=\"34%\"><a href=\"module.php?mod=book\">index</a></td><td align=\"right\" width=\"33%\">". ($next ? "<a href=\"node.php?id=$next->nid\">". t("next") ."</a>" : t("next")) ."</td></tr>";
$output .= " <tr><td align=\"left\" width=\"33%\">". ($prev ? "<small>". check_output($prev->title) ."</small>" : "&nbsp;") ."</td><td align=\"center\" width=\"34%\">". ($node->parent ? "<a href=\"node.php?id=$node->parent\">". t("up") ."</a>" : t("up")) ."</td><td align=\"right\" width=\"33%\">". ($next ? "<small>". check_output($next->title) ."</small>" : "&nbsp;") ."</td></tr>";
$output .= "</table>";
$theme->box(t("Handbook"), $output);
}
}
function book_toc($parent = "", $indent = "", $toc = array()) {
/*
** Select all child nodes:
*/
$result = db_query("SELECT n.nid, n.title FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE n.type = 'book' AND n.status = 1 AND b.parent = '$parent' ORDER BY b.weight");
/*
** Add the root node:
*/
if (user_access("administer nodes")) {
$toc[0] = "<root>";
}
/*
** Build the 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_tree($parent = "", $depth = 0) {
if ($depth < 3) {
// select all child nodes:
$result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE n.type = 'book' AND b.parent = '$parent' ORDER BY b.weight, n.title");
// render output:
while ($node = db_fetch_object($result)) {
$output .= "<li><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a></li>";
$output .= book_tree($node->nid, $depth + 1);
}
$output = "<ul>$output</ul>";
}
return $output;
}
function book_render() {
global $theme;
$result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE b.parent = 0 AND n.status = 1 ORDER BY b.weight");
while ($node = db_fetch_object($result)) {
$output .= "<dt><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a></dt><dd>". check_output($node->body, 1) ."<br /><br /></dd>";
}
$theme->header();
$theme->box(t("Handbook"), "<dl>$output</dl>");
$theme->footer();
}
function book_page() {
global $op, $id, $theme;
if (user_access("access content")) {
switch ($op) {
case "feed":
print book_export_html($id, $depth = 1);
break;
default:
book_render();
}
}
else {
$theme->header();
$theme->box(t("Access denied"), message_access());
$theme->footer();
}
}
function book_export_html($id = "", $depth = 1) {
$result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE n.type = 'book' AND n.status = 1 AND n.nid = '". check_input($id) ."'");
while ($node = db_fetch_object($result)) {
$output .= "<h$depth>". check_output($node->title) ."</h$depth>";
if ($node->body) $output .= "<blockquote>". check_output($node->body, 1) ."</blockquote>";
}
$output .= book_export_html_recursive($id, $depth);
return $output;
}
function book_export_html_recursive($parent = "", $depth = 1) {
$result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE n.type = 'book' AND n.status = 1 AND b.parent = '$parent' ORDER BY b.weight");
while ($node = db_fetch_object($result)) {
$output .= "<h$depth>". check_output($node->title) ."</h$depth>";
if ($node->body) $output .= "<blockquote>". check_output($node->body, 1) ."</blockquote>";
$output .= book_export_html_recursive($node->nid, $depth + 1);
}
return $output;
}
?>