book.module 16 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
function book_node($field) {
  global $user;

Dries's avatar
   
Dries committed
7
  $info["name"] = t("book page");
Dries's avatar
   
Dries committed
8
  $info["description"] = t("A book is a collaborative writing effort: users can collaborate writing the pages of the book, positioning the pages in the right order, and reviewing or modifying pages previously written.  So when you have some information to share or when you read a page of the book and you didn't like it, or if you think a certain page could have been written better, you can do something about it.");
Dries's avatar
   
Dries committed
9
10
11
12
13

  return $info[$field];
}

function book_access($op, $node) {
Dries's avatar
   
Dries committed
14
  global $user;
Dries's avatar
   
Dries committed
15
16

  if ($op == "view") {
Dries's avatar
   
Dries committed
17
18
19
20
21
22
23
24
    /*
    ** Everyone can access all published book pages whether these pages
    ** are still waiting for approval or not.  We might not always want
    ** to display pages that are waiting for approval, but we take care
    ** of that problem in the book_view() function.
    */

    return $node->status;
Dries's avatar
   
Dries committed
25
26
  }

Dries's avatar
   
Dries committed
27
  if ($op == "create") {
Dries's avatar
   
Dries committed
28
29
30
31
32
    return 1;
  }

  if ($op == "update") {

Dries's avatar
   
Dries committed
33
    /*
Dries's avatar
   
Dries committed
34
35
36
37
    ** Everyone can upate a book page if there are no suggested updates
    ** of that page waiting for approval and as long as the "create new
    ** revision"-bit is set; that is, only updates that don't overwrite
    ** the current or pending information are allowed.
Dries's avatar
   
Dries committed
38
    */
Dries's avatar
   
Dries committed
39
    return !$node->moderate && $node->revision;
Dries's avatar
   
Dries committed
40
  }
Dries's avatar
   
Dries committed
41
42
}

Dries's avatar
   
Dries committed
43
function book_save($op, $node) {
Dries's avatar
   
Dries committed
44
  global $user, $REQUEST_URI;
Dries's avatar
   
Dries committed
45
46
47
48
49
50
51
52
53
54
55
56
57
58

  if ($op == "approve") {
    return array("status" => 1);
  }

  if ($op == "create") {
    return array("moderate" => 1, "parent", "promote" => 0, "status" => 1, "weight");
  }

  if ($op == "decline") {
    return array("status" => 0);
  }

  if ($op == "update") {
Dries's avatar
   
Dries committed
59
    if (strstr($REQUEST_URI, "module.php?mod=node&op=edit")) {
Dries's avatar
   
Dries committed
60
      /*
Dries's avatar
   
Dries committed
61
62
63
      ** If a regular user updates a book page, we always create a new
      ** revision.  All new revisions have to be approved (moderation)
      ** and are not promoted by derault.  See also: book_load().
Dries's avatar
   
Dries committed
64
65
      */

Dries's avatar
   
Dries committed
66
      return array("created" => time(), "moderate" => 1, "name" => $user->name, "parent", "promote" => 0, "score" => 0, "status" => 1, "uid" => $user->uid, "users" => "", "revisions", "votes" => 0, "weight");
Dries's avatar
   
Dries committed
67
    }
Dries's avatar
   
Dries committed
68
    else if (user_access("adminster nodes")) {
Dries's avatar
   
Dries committed
69
      /*
Dries's avatar
   
Dries committed
70
71
72
73
74
      ** If a node administrator updates a book page, we don't create a
      ** new revision unless we are explicitly instructed to. If a node
      ** administrator updates a book page using the "update this book
      ** page"-link (like regular users do) then he'll be treated as a
      ** regular user.
Dries's avatar
   
Dries committed
75
76
      */

Dries's avatar
   
Dries committed
77
      return array("parent", "weight");
Dries's avatar
   
Dries committed
78
79
80
81
82
    }
  }

}

Dries's avatar
   
Dries committed
83
84
85
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
86
  }
Dries's avatar
   
Dries committed
87

Dries's avatar
   
Dries committed
88
89
90
91
  if ($type == "admin" && user_access("administer nodes")) {
    $links[] = "<a href=\"admin.php?mod=book\">". t("collaborative book") ."</a>";
  }

Dries's avatar
   
Dries committed
92
  return $links ? $links : array();
Dries's avatar
   
Dries committed
93
94
}

Dries's avatar
   
Dries committed
95
function book_load($node) {
Dries's avatar
   
Dries committed
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  global $user, $REQUEST_URI;

  $book = db_fetch_object(db_query("SELECT parent, weight FROM book WHERE nid = '$node->nid'"));

  if (strstr($REQUEST_URI, "module.php?mod=node&op=edit")) {
    /*
    ** If a user is about to update a book page, we overload some
    ** fields to reflect the changes.  We use the $REQUEST_URI to
    ** dectect this as we don't want to interfer with updating a
    ** book page through the admin pages.  See also: book_save().
    */

    $book->name = $user->name;
    $book->uid = $user->uid;
  }

  /*
  ** We set the revision field to indicate that we have to create
  ** a new revision when updating this book page.
  */

  $book->revision = 1;

Dries's avatar
   
Dries committed
119
  return $book;
Dries's avatar
   
Dries committed
120
121
}

Dries's avatar
   
Dries committed
122
function book_insert($node) {
Dries's avatar
   
Dries committed
123
  db_query("INSERT INTO book (nid, parent, weight) VALUES ('$node->nid', '$node->parent', '$node->weight')");
Dries's avatar
   
Dries committed
124
}
Dries's avatar
   
Dries committed
125

Dries's avatar
   
Dries committed
126
function book_update($node) {
Dries's avatar
   
Dries committed
127
  db_query("UPDATE book SET parent = '$node->parent', weight = '$node->weight' WHERE nid = '$node->nid'");
Dries's avatar
   
Dries committed
128
}
Dries's avatar
   
Dries committed
129

Dries's avatar
   
Dries committed
130
131
function book_delete($node) {
  db_query("DELETE FROM book WHERE nid = '$node->nid'");
Dries's avatar
   
Dries committed
132
133
}

Dries's avatar
   
Dries committed
134

Dries's avatar
   
Dries committed
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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:
    */

Dries's avatar
   
Dries committed
151
152
    $help = book_node("description");

Dries's avatar
   
Dries committed
153
154
155
156
157
158
159
    /*
    ** If a regular user updates a book page, we create a new revision
    ** authored by that user:
    */

    $output .= form_hidden("revision", 1);

Dries's avatar
   
Dries committed
160
    $node->uid = $user->uid;    // $node is passed by reference
Dries's avatar
   
Dries committed
161
162
163
164
165
166
167
    $node->name = $user->name;

  }

  return $output;
}

Dries's avatar
   
Dries committed
168
function book_location($node, $nodes = array()) {
Dries's avatar
   
Dries committed
169
  $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
170
171
172
173
174
175
176
  if ($parent->title) {
    $nodes = book_location($parent, $nodes);
    array_push($nodes, $parent);
  }
  return $nodes;
}

Dries's avatar
   
Dries committed
177
function book_view($node, $main = 0) {
Dries's avatar
   
Dries committed
178
179
180
181
182
183
184
185
186
  global $theme, $mod;

  /*
  ** Always display the most recently approved revision of a node
  ** unless we have to display it in the context of the moderation
  ** queue.
  */

  if ($node->moderate && $mod != "queue") {
Dries's avatar
   
Dries committed
187
    $node = node_revision_load($node, end(node_revision_list($node)));
Dries's avatar
   
Dries committed
188
189
190
191
192
193
194
  }

  /*
  ** Display the node.  If not displayed on the main page, we render
  ** the node as a page in the book with extra links to the previous
  ** and the next page.
  */
Dries's avatar
 
Dries committed
195

Dries's avatar
   
Dries committed
196
197
  if ($main) {
    $theme->node($node, $main);
Dries's avatar
   
Dries committed
198
  }
Dries's avatar
   
Dries committed
199
200
  else {
    if ($node->nid && $node->parent) {
201
202
      $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) ."')) AND (n.moderate = 0 OR n.revisions != '') 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) ."')) AND (n.moderate = 0 OR n.revisions != '') ORDER BY b.weight DESC, n.title DESC"));
Dries's avatar
   
Dries committed
203
    }
Dries's avatar
   
Dries committed
204

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

Dries's avatar
   
Dries committed
207
208
    if ($node->title) {
      foreach (book_location($node) as $level) {
Dries's avatar
   
Dries committed
209
        $location .= "$indent <a href=\"node.php?id=$level->nid\">$level->title</a><br />";
Dries's avatar
   
Dries committed
210
211
        $indent .= "-";
      }
Dries's avatar
   
Dries committed
212

Dries's avatar
   
Dries committed
213
214
215
      $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
216
    }
Dries's avatar
   
Dries committed
217

Dries's avatar
   
Dries committed
218
    if ($node->body) {
Dries's avatar
   
Dries committed
219
      $output .= " <tr><td colspan=\"3\"><br />". check_output($node->body, 1) ."</td></tr>";
Dries's avatar
   
Dries committed
220
    }
Dries's avatar
 
Dries committed
221

Dries's avatar
   
Dries committed
222
    if ($node->nid) {
Dries's avatar
   
Dries committed
223
      $output .= " <tr><td colspan=\"3\"><br />". book_tree($node->nid) ."</td></tr>";
Dries's avatar
   
Dries committed
224
    }
Dries's avatar
   
Dries committed
225

Dries's avatar
   
Dries committed
226
227
228
229
    $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
230

Dries's avatar
   
Dries committed
231
232
    $theme->box(t("Handbook"), $output);
  }
Dries's avatar
 
Dries committed
233
234
}

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

Dries's avatar
   
Dries committed
237
238
239
240
  /*
  ** Select all child nodes:
  */

241
  $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' AND (n.moderate = 0 OR n.revisions != '') ORDER BY b.weight");
Dries's avatar
   
Dries committed
242
243
244
245

  /*
  ** Add the root node:
  */
Dries's avatar
   
Dries committed
246

Dries's avatar
   
Dries committed
247
  if (user_access("administer nodes")) {
Dries's avatar
   
Dries committed
248
    $toc[0] = "<root>";
Dries's avatar
   
Dries committed
249
250
  }

Dries's avatar
   
Dries committed
251
252
253
254
  /*
  ** Build the table of contents:
  */

Dries's avatar
   
Dries committed
255
  while ($node = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
256
257
    $toc[$node->nid] = "$indent $node->title";
    $toc = book_toc($node->nid, "$indent-", $toc);
Dries's avatar
   
Dries committed
258
  }
Dries's avatar
   
Dries committed
259

Dries's avatar
   
Dries committed
260
261
262
  return $toc;
}

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

Dries's avatar
   
Dries committed
265
  if ($depth < 3) {
Dries's avatar
   
Dries committed
266
267
268
269
    /*
    ** Select all child nodes and render them into a table of contents:
    */

270
   $result = db_query("SELECT n.nid FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE n.type = 'book' AND b.parent = '$parent' AND (n.moderate = 0 OR n.revisions != '') ORDER BY b.weight, n.title");
Dries's avatar
   
Dries committed
271

Dries's avatar
   
Dries committed
272
273
274
     while ($page = db_fetch_object($result)) {
       // load the node:
       $node = node_load(array("nid" => $page->nid));
Dries's avatar
   
Dries committed
275

Dries's avatar
   
Dries committed
276
277
278
279
       // take the most recent approved revision:
       if ($node->moderate) {
         $node = node_revision_load($node, end(node_revision_list($node)));
       }
Dries's avatar
   
Dries committed
280

Dries's avatar
   
Dries committed
281
282
       // output the content:
       $output .= "<li><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a></li>";
Dries's avatar
   
Dries committed
283

Dries's avatar
   
Dries committed
284
285
286
287
288
       // build the sub-tree of each child:
       $output .= book_tree($node->nid, $depth + 1);
     }

     $output = "<ul>$output</ul>";
Dries's avatar
   
Dries committed
289

Dries's avatar
   
Dries committed
290
  }
Dries's avatar
   
Dries committed
291

Dries's avatar
   
Dries committed
292
293
294
  return $output;
}

Dries's avatar
   
Dries committed
295
function book_render() {
Dries's avatar
   
Dries committed
296
  global $theme;
Dries's avatar
Dries committed
297

298
  $result = db_query("SELECT n.nid FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE b.parent = 0 AND n.status = 1 AND (n.moderate = 0 OR n.revisions != '') ORDER BY b.weight");
Dries's avatar
   
Dries committed
299

Dries's avatar
   
Dries committed
300
301
302
303
304
305
  while ($page = db_fetch_object($result)) {
    // load the node:
    $node = node_load(array("nid" => $page->nid));

    // take the most recent approved revision:
    if ($node->moderate) {
Dries's avatar
   
Dries committed
306
      $node = node_revision_load($node, end(node_revision_list($node)));
Dries's avatar
   
Dries committed
307
308
309
    }

    // output the content:
Dries's avatar
   
Dries committed
310
    $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
311
312
313
  }

  $theme->header();
Dries's avatar
   
Dries committed
314
  $theme->box(t("Handbook"), "<dl>$output</dl>");
Dries's avatar
   
Dries committed
315
316
317
318
319
320
  $theme->footer();
}

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

Dries's avatar
   
Dries committed
321
  if (user_access("access content")) {
Dries's avatar
   
Dries committed
322
323
    switch ($op) {
      case "feed":
Dries's avatar
   
Dries committed
324
        print book_export_html($id, $depth = 1);
Dries's avatar
   
Dries committed
325
326
327
        break;
      default:
        book_render();
Dries's avatar
   
Dries committed
328
329
330
331
332
333
334
    }
  }
  else {
    $theme->header();
    $theme->box(t("Access denied"), message_access());
    $theme->footer();
  }
Dries's avatar
 
Dries committed
335
336
}

Dries's avatar
   
Dries committed
337
function book_export_html($id = "", $depth = 1) {
338
  $result = db_query("SELECT n.nid 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) ." AND (n.moderate = 0 OR n.revisions != '')'");
Dries's avatar
   
Dries committed
339

Dries's avatar
   
Dries committed
340
341
342
  while ($page = db_fetch_object($result)) {
    // load the node:
    $node = node_load(array("nid" => $page->nid));
Dries's avatar
   
Dries committed
343

Dries's avatar
   
Dries committed
344
345
    // take the most recent approved revision:
    if ($node->moderate) {
Dries's avatar
   
Dries committed
346
      $node = node_revision_load($node, end(node_revision_list($node)));
Dries's avatar
   
Dries committed
347
348
349
    }

    // output the content:
Dries's avatar
   
Dries committed
350
    $output .= "<h$depth>". check_output($node->title) ."</h$depth>";
Dries's avatar
   
Dries committed
351
352
353
354

    if ($node->body) {
      $output .= "<blockquote>". check_output($node->body, 1) ."</blockquote>";
    }
Dries's avatar
   
Dries committed
355
  }
Dries's avatar
   
Dries committed
356

Dries's avatar
   
Dries committed
357
358
359
360
361
362
  $output .= book_export_html_recursive($id, $depth);

  return $output;
}

function book_export_html_recursive($parent = "", $depth = 1) {
363
  $result = db_query("SELECT n.nid FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE n.type = 'book' AND n.status = 1 AND b.parent = '$parent' AND (n.moderate = 0 OR n.revisions != '') ORDER BY b.weight");
Dries's avatar
   
Dries committed
364

Dries's avatar
   
Dries committed
365
366
367
368
369
370
  while ($page = db_fetch_object($result)) {
    // load the node:
    $node = node_load(array("nid" => $page->nid));

    // take the most recent approved revision:
    if ($node->moderate) {
Dries's avatar
   
Dries committed
371
      $node = node_revision_load($node, end(node_revision_list($node)));
Dries's avatar
   
Dries committed
372
373
374
    }

    // output the content:
Dries's avatar
   
Dries committed
375
    $output .= "<h$depth>". check_output($node->title) ."</h$depth>";
Dries's avatar
   
Dries committed
376
377
378
379
380

    if ($node->body) {
      $output .= "<blockquote>". check_output($node->body, 1) ."</blockquote>";
    }

Dries's avatar
   
Dries committed
381
    $output .= book_export_html_recursive($node->nid, $depth + 1);
Dries's avatar
   
Dries committed
382
  }
Dries's avatar
   
Dries committed
383

Dries's avatar
   
Dries committed
384
385
  return $output;
}
Dries's avatar
   
Dries committed
386

Dries's avatar
   
Dries committed
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
function book_admin_page($nid, $depth = 0) {
  $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);

  $result = db_query("SELECT n.nid FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE n.type = 'book' AND b.parent = '$nid' ORDER BY b.weight, n.title");

  while ($node = db_fetch_object($result)) {
    $node = node_load(array("nid" => $node->nid));

    $output .= "<tr>";
    $output .= " <td><div style=\"padding-left: ". (25 * $depth) ."px;\">$node->title</div></td>";
    $output .= " <td align=\"center\">". ($rev = end(node_revision_list($node)) ? $rev : 0) ."</td>";
    $output .= " <td><a href=\"admin.php?mod=node&op=edit&id=$node->nid\">". t("edit page") ."</td>";
    $output .= " <td><a href=\"admin.php?mod=node&op=delete&id=$node->nid\">". t("delete page") ."</td>";
    $output .= "</tr>";
    $output .= book_admin_page($node->nid, $depth + 1);
  }

  return $output;
}

function book_admin_view($nid, $depth = 0) {

  $node = node_load(array("nid" => $nid));

  $output .= "<h3>". check_output($node->title) ."</h3>";
  $output .= "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">";
  $output .= " <tr><th>title</th><th>rev</th><th colspan=\"2\">operations</th></tr>";
  $output .= book_admin_page($nid);
  $output .= "</table>";

  return $output;
}

function book_admin_orphan() {

  $result = db_query("SELECT n.nid, n.title, b.parent FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE n.type = 'book'");

  while ($page = db_fetch_object($result)) {
    $pages[$page->nid] = $page;
  }

  $output .= "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">";
  $output .= " <tr><th>title</th><th colspan=\"2\">operations</th></tr>";
  foreach ($pages as $nid => $node) {
    if ($node->parent && empty($pages[$node->parent])) {
      $output .= "<tr><td><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a></td><td><a href=\"admin.php?mod=node&op=edit&id=$node->nid\">". t("edit page") ."</td><td><a href=\"admin.php?mod=node&op=delete&id=$node->nid\">". t("delete page") ."</td>";
    }
  }
  $output .= "</table>";

  return $output;
}

function book_admin_links() {
  $result = db_query("SELECT n.nid, n.title FROM node n LEFT JOIN book b ON n.nid = b.nid WHERE b.parent = 0 ORDER BY b.weight, n.title");

  while ($book = db_fetch_object($result)) {
    $links[] = "<a href=\"admin.php?mod=book&op=view&id=$book->nid\">". t("book") .": <i>". check_output($book->title) ."</i></a>";
  }

  return $links;
}

function book_admin() {
  global $id, $op;

  if (user_access("administer nodes")) {

    /*
    ** Compile a list of the administrative links:
    */

    $links = book_admin_links();
    $links[] = "<a href=\"admin.php?mod=book&op=orphan\">". t("orphan pages") ."</a>";

    print "<small>". implode(" &middot; ", $links) ."</small><hr />";

    switch ($op) {
      case "orphan":
        print book_admin_orphan();
        break;
      case "view":
        print book_admin_view($id);
        break;
      default:
    }
  }
}

Dries's avatar
 
Dries committed
476
?>