book.module 9.42 KB
Newer Older
Dries's avatar
 
Dries committed
1
<?php
2
// $Id$
Dries's avatar
 
Dries committed
3

Dries's avatar
 
Dries committed
4 5 6 7 8 9 10 11 12 13 14
function book_node($field) {
  global $user;

  $info = array("name" => "book page");

  return $info[$field];
}

function book_access($op, $node) {

  if ($op == "view") {
Dries's avatar
 
Dries committed
15
    return ($node->nid && $node->status && !$node->moderate);
Dries's avatar
 
Dries committed
16 17 18 19 20 21 22 23
  }

  if  ($op == "create") {
    return 1;
  }

  if ($op == "update") {

Dries's avatar
 
Dries committed
24 25 26 27 28 29 30 31
    /*
    ** 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;
  }
Dries's avatar
 
Dries committed
32 33
}

Dries's avatar
 
Dries committed
34 35 36
function book_link($type) {
  if ($type == "page" && user_access("access content")) {
    $links[] = "<a href=\"module.php?mod=book\">". t("collaborative book") ."</a>";
Dries's avatar
 
Dries committed
37
  }
Dries's avatar
 
Dries committed
38 39

  return $links ? $links : array();
Dries's avatar
 
Dries committed
40 41
}

Dries's avatar
 
Dries committed
42 43 44
function book_load($node) {
  $book = db_fetch_object(db_query("SELECT parent, weight FROM book WHERE nid = '$node->nid'"));
  return $book;
Dries's avatar
 
Dries committed
45 46
}

Dries's avatar
 
Dries committed
47
function book_insert($node) {
Dries's avatar
 
Dries committed
48
  db_query("INSERT INTO book (nid, parent, weight) VALUES ('$node->nid', '$node->parent', '$node->weight')");
Dries's avatar
 
Dries committed
49
}
Dries's avatar
 
Dries committed
50

Dries's avatar
 
Dries committed
51
function book_update($node) {
Dries's avatar
 
Dries committed
52
  db_query("UPDATE book SET parent = '$node->parent', weight = '$node->weight' WHERE nid = '$node->nid'");
Dries's avatar
 
Dries committed
53
}
Dries's avatar
 
Dries committed
54

Dries's avatar
 
Dries committed
55 56
function book_delete($node) {
  db_query("DELETE FROM book WHERE nid = '$node->nid'");
Dries's avatar
 
Dries committed
57 58
}

Dries's avatar
 
Dries committed
59
function book_save($node) {
Dries's avatar
 
Dries committed
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
  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");
    }
Dries's avatar
 
Dries committed
78 79
  }
  else {
Dries's avatar
 
Dries committed
80
    return array("moderate" => 1, "parent", "promote" => 0, "status" => 1, "weight");
Dries's avatar
 
Dries committed
81
  }
Dries's avatar
 
Dries committed
82 83
}

Dries's avatar
 
Dries committed
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
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;
}

Dries's avatar
 
Dries committed
117
function book_location($node, $nodes = array()) {
Dries's avatar
 
Dries committed
118
  $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'"));
Dries's avatar
 
Dries committed
119 120 121 122 123 124 125
  if ($parent->title) {
    $nodes = book_location($parent, $nodes);
    array_push($nodes, $parent);
  }
  return $nodes;
}

Dries's avatar
 
Dries committed
126
function book_view($node, $main = 0) {
Dries's avatar
 
Dries committed
127
  global $theme;
Dries's avatar
 
Dries committed
128

Dries's avatar
 
Dries committed
129 130
  if ($main) {
    $theme->node($node, $main);
Dries's avatar
 
Dries committed
131
  }
Dries's avatar
 
Dries committed
132 133
  else {
    if ($node->nid && $node->parent) {
Dries's avatar
 
Dries committed
134 135
      $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"));
Dries's avatar
 
Dries committed
136
    }
Dries's avatar
 
Dries committed
137

Dries's avatar
 
Dries committed
138
    $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n";
Dries's avatar
 
Dries committed
139

Dries's avatar
 
Dries committed
140 141
    if ($node->title) {
      foreach (book_location($node) as $level) {
Dries's avatar
 
Dries committed
142
        $location .= "$indent <a href=\"node.php?id=$level->nid\">$level->title</a><br />";
Dries's avatar
 
Dries committed
143 144
        $indent .= "-";
      }
Dries's avatar
 
Dries committed
145

Dries's avatar
 
Dries committed
146 147 148
      $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>";
Dries's avatar
 
Dries committed
149
    }
Dries's avatar
 
Dries committed
150

Dries's avatar
 
Dries committed
151
    if ($node->body) {
Dries's avatar
 
Dries committed
152
      $output .= " <tr><td colspan=\"3\"><br />". check_output($node->body, 1) ."</td></tr>";
Dries's avatar
 
Dries committed
153
    }
Dries's avatar
 
Dries committed
154

Dries's avatar
 
Dries committed
155
    if ($node->nid) {
Dries's avatar
 
Dries committed
156
      $output .= " <tr><td colspan=\"3\"><br />". book_tree($node->nid) ."</td></tr>";
Dries's avatar
 
Dries committed
157
    }
Dries's avatar
 
Dries committed
158

Dries's avatar
 
Dries committed
159 160 161 162
    $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>";
Dries's avatar
 
Dries committed
163

Dries's avatar
 
Dries committed
164 165
    $theme->box(t("Handbook"), $output);
  }
Dries's avatar
 
Dries committed
166 167
}

Dries's avatar
 
Dries committed
168
function book_toc($parent = "", $indent = "", $toc = array()) {
Dries's avatar
 
Dries committed
169

Dries's avatar
 
Dries committed
170 171 172 173 174 175 176 177 178
  /*
  ** 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:
  */
Dries's avatar
 
Dries committed
179

Dries's avatar
 
Dries committed
180
  if (user_access("administer nodes")) {
Dries's avatar
 
Dries committed
181
    $toc[0] = "<root>";
Dries's avatar
 
Dries committed
182 183
  }

Dries's avatar
 
Dries committed
184 185 186 187
  /*
  ** Build the table of contents:
  */

Dries's avatar
 
Dries committed
188
  while ($node = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
189 190
    $toc[$node->nid] = "$indent $node->title";
    $toc = book_toc($node->nid, "$indent-", $toc);
Dries's avatar
 
Dries committed
191
  }
Dries's avatar
 
Dries committed
192

Dries's avatar
 
Dries committed
193 194 195
  return $toc;
}

Dries's avatar
Dries committed
196
function book_tree($parent = "", $depth = 0) {
Dries's avatar
 
Dries committed
197

Dries's avatar
 
Dries committed
198
  if ($depth < 3) {
Dries's avatar
 
Dries committed
199
    // select all child nodes:
Dries's avatar
 
Dries committed
200
    $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");
Dries's avatar
 
Dries committed
201 202 203

    // render output:
    while ($node = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
204
      $output .= "<li><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a></li>";
Dries's avatar
 
Dries committed
205 206
      $output .= book_tree($node->nid, $depth + 1);
    }
Dries's avatar
 
Dries committed
207
    $output = "<ul>$output</ul>";
Dries's avatar
 
Dries committed
208
  }
Dries's avatar
 
Dries committed
209

Dries's avatar
 
Dries committed
210 211 212
  return $output;
}

Dries's avatar
 
Dries committed
213
function book_render() {
Dries's avatar
 
Dries committed
214
  global $theme;
Dries's avatar
Dries committed
215

Dries's avatar
 
Dries committed
216
  $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");
Dries's avatar
 
Dries committed
217 218

  while ($node = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
219
    $output .= "<dt><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a></dt><dd>". check_output($node->body, 1) ."<br /><br /></dd>";
Dries's avatar
 
Dries committed
220 221 222
  }

  $theme->header();
Dries's avatar
 
Dries committed
223
  $theme->box(t("Handbook"), "<dl>$output</dl>");
Dries's avatar
 
Dries committed
224 225 226 227 228 229
  $theme->footer();
}

function book_page() {
  global $op, $id, $theme;

Dries's avatar
 
Dries committed
230
  if (user_access("access content")) {
Dries's avatar
Dries committed
231

Dries's avatar
 
Dries committed
232 233
    switch ($op) {
      case "feed":
Dries's avatar
 
Dries committed
234
        print book_export_html($id, $depth = 1);
Dries's avatar
 
Dries committed
235 236 237
        break;
      default:
        book_render();
Dries's avatar
 
Dries committed
238 239 240 241 242 243 244
    }
  }
  else {
    $theme->header();
    $theme->box(t("Access denied"), message_access());
    $theme->footer();
  }
Dries's avatar
 
Dries committed
245 246
}

Dries's avatar
 
Dries committed
247 248
function book_export_html($id = "", $depth = 1) {

Dries's avatar
 
Dries committed
249
  $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) ."'");
Dries's avatar
 
Dries committed
250 251

  while ($node = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
252
    $output .= "<h$depth>". check_output($node->title) ."</h$depth>";
Dries's avatar
 
Dries committed
253 254 255 256 257 258 259 260
    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) {
Dries's avatar
 
Dries committed
261
  $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");
Dries's avatar
 
Dries committed
262 263

  while ($node = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
264
    $output .= "<h$depth>". check_output($node->title) ."</h$depth>";
Dries's avatar
 
Dries committed
265 266
    if ($node->body) $output .= "<blockquote>". check_output($node->body, 1) ."</blockquote>";
    $output .= book_export_html_recursive($node->nid, $depth + 1);
Dries's avatar
 
Dries committed
267
  }
Dries's avatar
 
Dries committed
268

Dries's avatar
 
Dries committed
269 270
  return $output;
}
Dries's avatar
 
Dries committed
271

Dries's avatar
 
Dries committed
272
?>