Commit b6f1c9c7 authored by Dries's avatar Dries
Browse files

- node system:
    + fixed a typo in node_load(): it should be faster now

- book module:
    + removed the functions book_parent() and book_parent_query() as
      they were no longer needed.  Gerhard & co: this should fix the
      occasional SQL errors you get, and should improve performance.

    + made the "next", "previous" and "up" links work correctly ...

    + XHTML-ified the code

    + added some missing translations

  I'm working on the book module now to make it possible to update book
  pages.
parent 29364d5b
......@@ -96,13 +96,14 @@ function node_load($conditions) {
** Retrieve the node:
*/
$node = db_fetch_object(db_query("SELECT n.*, u.uid, u.name FROM node n LEFT JOIN users u ON u.uid = n.uid LEFT JOIN comments c ON c.lid = n.nid WHERE ". implode(" AND ", $cond)));
$node = db_fetch_object(db_query("SELECT n.*, u.uid, u.name FROM node n LEFT JOIN users u ON u.uid = n.uid WHERE ". implode(" AND ", $cond)));
/*
** Unserialize the revisions field:
*/
if ($node->revisions) {
unset($node->revisions);
$node->revisions = unserialize($node->revisions);
}
......
......@@ -20,9 +20,15 @@ function book_access($op, $node) {
}
if ($op == "update") {
return 1;
}
/*
** 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) {
......@@ -39,35 +45,75 @@ function book_load($node) {
}
function book_insert($node) {
if ($node->pid && $node->status == 1) {
db_query("UPDATE node SET status = 0 WHERE nid = '$node->pid'");
}
db_query("INSERT INTO book (nid, pid, parent, weight, log) VALUES ('$node->nid', '$node->pid', '$node->parent', '$node->weight', '$node->log')");
db_query("INSERT INTO book (nid, parent, weight) VALUES ('$node->nid', '$node->parent', '$node->weight')");
}
function book_update($node) {
if ($node->pid && $node->status == 1) {
db_query("UPDATE node SET status = 0 WHERE nid = '$node->pid'");
}
db_query("UPDATE book SET parent = '$node->parent', weight = '$node->weight', log = '$node->log' WHERE nid = '$node->nid'");
db_query("UPDATE book SET parent = '$node->parent', weight = '$node->weight' WHERE nid = '$node->nid'");
}
function book_delete($node) {
if ($node->pid && $node->status == 1) {
db_query("UPDATE node SET status = 1 WHERE nid = '$node->pid'");
}
db_query("DELETE FROM book WHERE nid = '$node->nid'");
}
function book_save($node) {
if ($node->nid && user_access("administer nodes")) {
return array("pid", "log", "parent", "weight");
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, "promote" => 0, "status" => 0, "log", "parent", "weight");
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) {
......@@ -85,63 +131,60 @@ function book_view($node, $main = 0) {
}
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 WHERE n.status = 1 AND $list 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 $list 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"));
$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";
$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>";
$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\">update</A></TD></TR>\n";
$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>Last updated by ". format_name($node) ." on ". format_date($node->created) ."</I></SMALL> " : "") ."</TD></TR>\n";
$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>";
$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\"><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>\n";
$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>\n";
$output .= "</TABLE>\n";
$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_parent_query($parent) {
if ($parent > 0) {
$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()) {
// 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 ". book_parent_query($parent) ." ORDER BY b.weight");
/*
** 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:
*/
// add root node:
if (user_access("administer nodes")) {
$toc[0] = "<root>";
}
// build table of contents:
/*
** Build the table of contents:
*/
while ($node = db_fetch_object($result)) {
$toc[$node->nid] = "$indent $node->title";
$toc = book_toc($node->nid, "$indent-", $toc);
......@@ -150,48 +193,20 @@ function book_toc($parent = "", $indent = "", $toc = array()) {
return $toc;
}
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"), "log", $node->log, 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."));
}
if ($node->pid > 0) {
$output .= form_hidden("pid", $node->pid);
}
return $output;
}
function book_parent($nid) {
if ($node = node_load(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;
if ($depth < 3 || strstr($PHP_SELF,"admin.php")) {
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 n.status = 1 AND ". book_parent_query($parent) ." ORDER BY b.weight, n.title");
$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>". (strstr($PHP_SELF, "admin.php") ? " <SMALL>(weight: $node->weight/$node->parent, status: $node->status) (<A HREF=\"admin.php?mod=node&type=book&op=edit&id=$node->nid\">edit</A>)</SMALL>" : "") ."</LI>\n";
$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>";
$output = "<ul>$output</ul>";
}
return $output;
}
......@@ -201,11 +216,11 @@ function book_render() {
$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>";
$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->box(t("Handbook"), "<dl>$output</dl>");
$theme->footer();
}
......@@ -234,7 +249,7 @@ 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>";
$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);
......@@ -246,9 +261,8 @@ 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>";
$output .= "<h$depth>". check_output($node->title) ."</h$depth>";
if ($node->body) $output .= "<blockquote>". check_output($node->body, 1) ."</blockquote>";
if ($node->pid) $output .= book_export_html_recursive($node->pid, $depth + 1);
$output .= book_export_html_recursive($node->nid, $depth + 1);
}
......
......@@ -20,9 +20,15 @@ function book_access($op, $node) {
}
if ($op == "update") {
return 1;
}
/*
** 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) {
......@@ -39,35 +45,75 @@ function book_load($node) {
}
function book_insert($node) {
if ($node->pid && $node->status == 1) {
db_query("UPDATE node SET status = 0 WHERE nid = '$node->pid'");
}
db_query("INSERT INTO book (nid, pid, parent, weight, log) VALUES ('$node->nid', '$node->pid', '$node->parent', '$node->weight', '$node->log')");
db_query("INSERT INTO book (nid, parent, weight) VALUES ('$node->nid', '$node->parent', '$node->weight')");
}
function book_update($node) {
if ($node->pid && $node->status == 1) {
db_query("UPDATE node SET status = 0 WHERE nid = '$node->pid'");
}
db_query("UPDATE book SET parent = '$node->parent', weight = '$node->weight', log = '$node->log' WHERE nid = '$node->nid'");
db_query("UPDATE book SET parent = '$node->parent', weight = '$node->weight' WHERE nid = '$node->nid'");
}
function book_delete($node) {
if ($node->pid && $node->status == 1) {
db_query("UPDATE node SET status = 1 WHERE nid = '$node->pid'");
}
db_query("DELETE FROM book WHERE nid = '$node->nid'");
}
function book_save($node) {
if ($node->nid && user_access("administer nodes")) {
return array("pid", "log", "parent", "weight");
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, "promote" => 0, "status" => 0, "log", "parent", "weight");
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) {
......@@ -85,63 +131,60 @@ function book_view($node, $main = 0) {
}
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 WHERE n.status = 1 AND $list 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 $list 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"));
$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";
$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>";
$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\">update</A></TD></TR>\n";
$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>Last updated by ". format_name($node) ." on ". format_date($node->created) ."</I></SMALL> " : "") ."</TD></TR>\n";
$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>";
$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\"><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>\n";
$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>\n";
$output .= "</TABLE>\n";
$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_parent_query($parent) {
if ($parent > 0) {
$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()) {
// 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 ". book_parent_query($parent) ." ORDER BY b.weight");
/*
** 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:
*/
// add root node:
if (user_access("administer nodes")) {
$toc[0] = "<root>";
}
// build table of contents:
/*
** Build the table of contents:
*/
while ($node = db_fetch_object($result)) {
$toc[$node->nid] = "$indent $node->title";
$toc = book_toc($node->nid, "$indent-", $toc);
......@@ -150,48 +193,20 @@ function book_toc($parent = "", $indent = "", $toc = array()) {
return $toc;
}
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"), "log", $node->log, 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."));
}
if ($node->pid > 0) {
$output .= form_hidden("pid", $node->pid);
}
return $output;
}
function book_parent($nid) {
if ($node = node_load(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;
if ($depth < 3 || strstr($PHP_SELF,"admin.php")) {
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 n.status = 1 AND ". book_parent_query($parent) ." ORDER BY b.weight, n.title");
$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>". (strstr($PHP_SELF, "admin.php") ? " <SMALL>(weight: $node->weight/$node->parent, status: $node->status) (<A HREF=\"admin.php?mod=node&type=book&op=edit&id=$node->nid\">edit</A>)</SMALL>" : "") ."</LI>\n";
$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>";
$output = "<ul>$output</ul>";
}
return $output;
}
......@@ -201,11 +216,11 @@ function book_render() {
$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>";
$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->box(t("Handbook"), "<dl>$output</dl>");
$theme->footer();
}
......@@ -234,7 +249,7 @@ 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>";
$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);
......@@ -246,9 +261,8 @@ 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");