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
?>