Index: database/database.4.0.mysql =================================================================== RCS file: /cvs/drupal/drupal/database/database.4.0.mysql,v retrieving revision 1.5 diff -u -p -r1.5 database.4.0.mysql --- database/database.4.0.mysql 29 May 2006 16:04:41 -0000 1.5 +++ database/database.4.0.mysql 25 Jun 2006 12:45:45 -0000 @@ -133,12 +133,27 @@ CREATE TABLE blocks ( -- CREATE TABLE book ( + bid INT( 10 ) UNSIGNED NOT NULL default '0' PRIMARY KEY , + nid INT( 10 ) UNSIGNED NOT NULL default '0' , + book_author VARCHAR(255) NOT NULL default '' , + book_license LONGTEXT NOT NULL default '' , + weight TINYINT( 3 ) NOT NULL default '0', + KEY uid (uid) +); + +-- +-- Table structure for table 'book_pages' +-- + +CREATE TABLE book_pages ( vid int(10) unsigned NOT NULL default '0', nid int(10) unsigned NOT NULL default '0', + bid int(10) unsigned NOT NULL default '0', parent int(10) NOT NULL default '0', weight tinyint(3) NOT NULL default '0', PRIMARY KEY (vid), KEY nid (nid), + KEY bid (bid), KEY parent (parent) ); Index: database/database.4.1.mysql =================================================================== RCS file: /cvs/drupal/drupal/database/database.4.1.mysql,v retrieving revision 1.5 diff -u -p -r1.5 database.4.1.mysql --- database/database.4.1.mysql 29 May 2006 16:04:41 -0000 1.5 +++ database/database.4.1.mysql 25 Jun 2006 12:45:46 -0000 @@ -142,12 +142,28 @@ DEFAULT CHARACTER SET utf8; -- CREATE TABLE book ( + bid INT( 10 ) UNSIGNED NOT NULL default '0' PRIMARY KEY , + nid INT( 10 ) UNSIGNED NOT NULL default '0' , + book_author VARCHAR(255) NOT NULL default '' , + book_license LONGTEXT NOT NULL default '' , + weight TINYINT( 3 ) NOT NULL default '0', + KEY uid (uid) +); +DEFAULT CHARACTER SET utf8; + +-- +-- Table structure for table 'book_pages' +-- + +CREATE TABLE book_pages ( vid int(10) unsigned NOT NULL default '0', nid int(10) unsigned NOT NULL default '0', + bid int(10) unsigned NOT NULL default '0', parent int(10) NOT NULL default '0', weight tinyint(3) NOT NULL default '0', PRIMARY KEY (vid), KEY nid (nid), + KEY bid (bid), KEY parent (parent) ) DEFAULT CHARACTER SET utf8; Index: database/database.pgsql =================================================================== RCS file: /cvs/drupal/drupal/database/database.pgsql,v retrieving revision 1.178 diff -u -p -r1.178 database.pgsql --- database/database.pgsql 29 May 2006 16:04:41 -0000 1.178 +++ database/database.pgsql 25 Jun 2006 12:45:47 -0000 @@ -137,14 +137,31 @@ CREATE TABLE blocks ( -- CREATE TABLE book ( + bid integer NOT NULL default '0', + nid integer NOT NULL default '0', + book_author varchar(255) NOT NULL default '', + book_license text NOT NULL default '' , + weight smallint NOT NULL default '0' +); +CREATE INDEX book_bid_idx ON book(bid); +CREATE INDEX book_uid_idx ON book(uid); + + +-- +-- Table structure for book_pages +-- + +CREATE TABLE book_pages ( vid integer NOT NULL default '0', nid integer NOT NULL default '0', + bid integer NOT NULL default '0', parent integer NOT NULL default '0', weight smallint NOT NULL default '0', PRIMARY KEY (vid) ); -CREATE INDEX book_nid_idx ON book(nid); -CREATE INDEX book_parent_idx ON book(parent); +CREATE INDEX book_pages_nid_idx ON book_pages(nid); +CREATE INDEX book_pages_bid_idx ON book_pages(bid); +CREATE INDEX book_pages_parent_idx ON book_pages(parent); -- -- Table structure for boxes Index: database/updates.inc =================================================================== RCS file: /cvs/drupal/drupal/database/updates.inc,v retrieving revision 1.238 diff -u -p -r1.238 updates.inc --- database/updates.inc 20 Jun 2006 09:44:52 -0000 1.238 +++ database/updates.inc 25 Jun 2006 12:45:50 -0000 @@ -2087,3 +2087,83 @@ function system_update_186() { } + +/** + * Update book table definitions. + */ +function system_update_187() { + $ret = array(); + switch ($GLOBALS['db_type']) { + case 'mysql': + case 'mysqli': + $ret[] = update_sql("ALTER TABLE `{book}` RENAME `{book_pages}`;"); + $ret[] = update_sql("CREATE TABLE `{book}` ( + `bid` INT( 10 ) UNSIGNED NOT NULL default '0' PRIMARY KEY , + `nid` INT( 10 ) UNSIGNED NOT NULL default '0' , + `book_author` VARCHAR(255) NOT NULL default '' , + `book_license` LONGTEXT NOT NULL default '' , + `weight` TINYINT( 3 ) NOT NULL default '0', + KEY uid (uid) + ) TYPE = MYISAM"); + $ret[] = update_sql("ALTER TABLE `{book_pages}` ADD `bid` INT( 10 ) UNSIGNED NOT NULL AFTER `nid` ;"); + $ret[] = update_sql("ALTER TABLE `{book_pages}` ADD INDEX ( `bid` );"); + break; + case 'pgsql': + $ret[] = update_sql("ALTER TABLE {book} RENAME {book_pages};"); + $ret[] = update_sql("CREATE TABLE {book} ( + bid integer NOT NULL default '0' , + nid integer NOT NULL default '0' , + book_author varchar(255) NOT NULL default '' , + book_license text NOT NULL default '' , + weight smallint NOT NULL default '0' + "); + $ret[] = update_sql("CREATE INDEX {book}_bid_idx ON {book}(bid);"); + $ret[] = update_sql("CREATE INDEX {book}_uid_idx ON {book}(uid);"); + db_add_column($ret, 'book_pages', 'bid', 'int', array('not null' => TRUE, 'default' => 0)); + $ret[] = update_sql("CREATE INDEX {book_pages}_bid_idx ON {book_pages}(bid);"); + break; + } + return $ret; +} + +/** + * Create books definition and update book pages with their respective $bid. + */ +function system_update_188() { + $ret = array(); + + // Function to recursively update $bid for each book page. + function update_bid ($parent, $bid, $i) { + $sql = "SELECT DISTINCT(nid) FROM {book_pages} WHERE parent = %d"; + $result[$i] = db_query($sql,$parent); + if (db_num_rows($result[$i]) > 0) { + while ($page = db_fetch_object($result[$i])) { + $sql = "UPDATE {book_pages} SET bid = %d WHERE nid = %d"; + $result[$i+1] = db_query($sql, $bid, $page->nid); + update_bid($page->nid, $bid, $i+2); + } + } + } + + switch ($GLOBALS['db_type']) { + case 'mysql': + case 'mysqli': + case 'pgsql': + // Create the book 'covers' + $sql_books = "SELECT n.title, n.uid, n.vid, n.nid + FROM {book_pages} AS bp + JOIN {node} AS n ON bp.nid = n.nid AND bp.vid = n.vid + WHERE parent =0"; + $books = db_query($sql_books); + while ($row = db_fetch_object($books)) { + $bid = db_next_id('book_bid'); + $sql = 'INSERT INTO {book} (bid, uid, title) VALUES (%d, %d, "%s")'; + $result_a = db_query($sql, $bid, $row->uid, $row->title); + $sql = 'UPDATE {book_pages} SET bid = %d WHERE nid = %d'; + $result_b = db_query($sql, $bid, $row->nid); + update_bid ($row->nid, $bid, 1); + } + break; + } + return $ret; +} Index: modules/book.module =================================================================== RCS file: /cvs/drupal/drupal/modules/book.module,v retrieving revision 1.368 diff -u -p -r1.368 book.module --- modules/book.module 5 Jun 2006 09:00:22 -0000 1.368 +++ modules/book.module 25 Jun 2006 12:45:51 -0000 @@ -10,7 +10,10 @@ * Implementation of hook_node_info(). */ function book_node_info() { - return array('book' => array('name' => t('book page'), 'base' => 'book')); + return array( + 'book' => array('name' => t('book page'), 'base' => 'book'), + 'book_cover' => array('name' => t('book cover'), 'base' => 'book_cover') + ); } /** @@ -20,8 +23,38 @@ function book_perm() { return array('outline posts in books', 'create book pages', 'create new books', 'edit book pages', 'edit own book pages', 'see printer-friendly version'); } + /** - * Implementation of hook_access(). + * Implementation of hook_access() for a book cover. + */ +function book_cover_access($op, $node) { + global $user; + + if ($op == 'create') { + // Only registered users can create books. Given the nature + // of the book module this is considered to be a good/safe idea. + return user_access('create new books'); + } + + if ($op == 'update') { + // Only registered users can update book pages. Given the nature + // of the book module this is considered to be a good/safe idea. + // One can only update a book page if there are no suggested updates + // of that page waiting for approval. That is, only updates that + // don't overwrite the current or pending information are allowed. + + if ($node->uid == $user->uid && user_access('edit own book pages')) { + return TRUE; + } + else { + // do nothing. node-access() will determine further access + } + } +} + + +/** + * Implementation of hook_access() for a book page. */ function book_access($op, $node) { global $user; @@ -54,6 +87,15 @@ function book_access($op, $node) { function book_link($type, $node = 0, $main = 0) { $links = array(); + + if ($type == 'node' && $node->type = 'book_cover') { + if (user_access('create new books', $node)) { + $links['book_add_child'] = array( + '#title' => t('add child page'), + '#href' => "node/add/book/bid/$node->bid" + ); + } + } if ($type == 'node' && isset($node->parent)) { if (!$main) { @@ -88,6 +130,10 @@ function book_menu($may_cache) { 'title' => t('book page'), 'access' => user_access('create book pages')); $items[] = array( + 'path' => 'node/add/book_cover', + 'title' => t('book cover'), + 'access' => user_access('create book pages')); + $items[] = array( 'path' => 'admin/node/book', 'title' => t('books'), 'callback' => 'book_admin', @@ -106,10 +152,10 @@ function book_menu($may_cache) { 'weight' => 8); $items[] = array( 'path' => 'book', - 'title' => t('books'), - 'callback' => 'book_render', - 'access' => user_access('access content'), - 'type' => MENU_SUGGESTED_ITEM); + 'title' => t('book shelf'), + 'callback' => 'book_shelf', + 'type' => MENU_NORMAL_ITEM, + 'access' => user_access('access content')); $items[] = array( 'path' => 'book/export', 'callback' => 'book_export', @@ -117,11 +163,18 @@ function book_menu($may_cache) { 'type' => MENU_CALLBACK); } else { + $items[] = array( + 'path' => 'book/select', + 'title' => t('New page'), + 'callback' => '_add_page_select_book', + 'access' => user_access('create book pages'), + 'type' => MENU_LOCAL_TASK, + 'weight' => 2); // To avoid SQL overhead, check whether we are on a node page and whether the // user is allowed to outline posts in books. if (arg(0) == 'node' && is_numeric(arg(1)) && user_access('outline posts in books')) { // Only add the outline-tab for non-book pages: - $result = db_query(db_rewrite_sql("SELECT n.nid FROM {node} n WHERE n.nid = %d AND n.type != 'book'"), arg(1)); + $result = db_query(db_rewrite_sql("SELECT n.nid FROM {node} n WHERE n.nid = %d AND n.type != 'book' AND n.type != 'book_cover'"), arg(1)); if (db_num_rows($result) > 0) { $items[] = array( 'path' => 'node/'. arg(1) .'/outline', @@ -153,7 +206,7 @@ function book_block($op = 'list', $delta else if ($op == 'view') { // Only display this block when the user is browsing a book: if (arg(0) == 'node' && is_numeric(arg(1))) { - $result = db_query(db_rewrite_sql('SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.vid = b.vid WHERE n.nid = %d'), arg(1)); + $result = db_query(db_rewrite_sql('SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book_pages} b ON n.vid = b.vid WHERE n.nid = %d'), arg(1)); if (db_num_rows($result) > 0) { $node = db_fetch_object($result); @@ -175,17 +228,40 @@ function book_block($op = 'list', $delta } /** + * Implementation of hook_load() for a book cover. + */ +function book_cover_load($node) { + return db_fetch_object(db_query('SELECT * FROM {book} WHERE nid = %d', $node->nid)); +} + + +/** * Implementation of hook_load(). */ function book_load($node) { - return db_fetch_object(db_query('SELECT * FROM {book} WHERE vid = %d', $node->vid)); + return db_fetch_object(db_query('SELECT * FROM {book_pages} WHERE vid = %d', $node->vid)); +} + +/** + * Implementation of hook_insert() for book pages. + */ +function book_cover_insert($node) { + $bid = db_next_id('book_bid'); + db_query('INSERT INTO {book} (bid, nid, author, license, weight) VALUES (%d, %d, "%s", "%s", %d)', $bid, $node->nid, $node->book_author, $node->book_license, $node->weight); } /** - * Implementation of hook_insert(). + * Implementation of hook_insert() for book pages. */ function book_insert($node) { - db_query("INSERT INTO {book} (nid, vid, parent, weight) VALUES (%d, %d, %d, %d)", $node->nid, $node->vid, $node->parent, $node->weight); + db_query("INSERT INTO {book_pages} (nid, bid, vid, parent, weight) VALUES (%d, %d, %d, %d, %d)", $node->nid, $node->bid, $node->vid, $node->parent, $node->weight); +} + +/** + * Implementation of hook_update() for book covers. + */ +function book_cover_update($node) { + db_query('UPDATE {book} SET book_author = "%s", weight = %d, book_license = "%s" WHERE bid = %d', $node->book_author, $node->weight, $node->book_license, $node->bid); } /** @@ -193,22 +269,36 @@ function book_insert($node) { */ function book_update($node) { if ($node->revision) { - db_query("INSERT INTO {book} (nid, vid, parent, weight) VALUES (%d, %d, %d, %d)", $node->nid, $node->vid, $node->parent, $node->weight); + db_query("INSERT INTO {book_pages} (nid, vid, parent, weight) VALUES (%d, %d, %d, %d)", $node->nid, $node->vid, $node->parent, $node->weight); } else { - db_query("UPDATE {book} SET parent = %d, weight = %d WHERE vid = %d", $node->parent, $node->weight, $node->vid); + db_query("UPDATE {book_pages} SET parent = %d, weight = %d WHERE vid = %d", $node->parent, $node->weight, $node->vid); } } /** + * Implementation of hook_delete() for book covers. + */ +function book_cover_delete(&$node) { + db_query('DELETE FROM {book} WHERE nid = %d', $node->nid); +} + +/** * Implementation of hook_delete(). */ function book_delete(&$node) { - db_query('DELETE FROM {book} WHERE nid = %d', $node->nid); + db_query('DELETE FROM {book_pages} WHERE nid = %d', $node->nid); } /** - * Implementation of hook_submit(). + * Implementation of hook_submit() for book covers. + */ +function book_cover_submit(&$node) { + global $form; + +} +/** + * Implementation of hook_submit() for book pages. */ function book_submit(&$node) { global $user; @@ -222,22 +312,88 @@ function book_submit(&$node) { } /** - * Implementation of hook_form(). + * Implementation of hook_form() for a book. + */ +function book_cover_form(&$node) { + + $form['title'] = array('#type' => 'textfield', + '#title' => t('Title'), + '#required' => TRUE, + '#default_value' => $node->title, + '#weight' => -5, + ); + $form['body_filter']['body'] = array('#type' => 'textarea', + '#title' => t('Body'), + '#default_value' => $node->body, + '#rows' => 20, + '#required' => TRUE, + ); + $form['body_filter']['format'] = filter_form($node->format); + $form['book_author'] = array('#type' => 'textfield', + '#title' => t('Author'), + '#required' => FALSE, + '#default_value' => $node->book_author, + ); + $form['book_license'] = array('#type' => 'textarea', + '#title' => t('License'), + '#default_value' => $node->book_license, + '#rows' => 8, + '#required' => FALSE, + ); + + return $form; +} + + +/** + * Implementation of hook_form() for a book page. */ function book_form(&$node) { - if ($node->nid && !$node->parent && !user_access('create new books')) { - $form['parent'] = array('#type' => 'value', '#value' => $node->parent); + + // looking for url like node/add/book/bid/$bid + if (arg(3) == 'bid') { + if (is_numeric(arg(4))) { + $node->bid = arg(4); + $node->parent = 0; + } } - else { - $form['parent'] = array('#type' => 'select', - '#title' => t('Parent'), - '#default_value' => ($node->parent ? $node->parent : arg(4)), - '#options' => book_toc($node->nid), - '#weight' => -4, - '#description' => user_access('create new books') ? t('The parent section in which to place this page. Note that each page whose parent is <top-level> is an independent, top-level book.') : t('The parent that this page belongs in.'), + + // url like node/add/book/parent/$nid + if (arg(3) == 'parent') { + $node->parent = arg(4); + $sql = "SELECT bid FROM {book_pages} where nid = %d"; + $result = db_query($sql, $node->parent); + $node->bid = db_result($result); + } + + // check that the book exists. + if (!$result = db_result(db_query('SELECT bid FROM {book} WHERE bid = %d', $node->bid))) { + drupal_goto('book/select'); + } + //else { + $form['bid'] = array ('#type' => 'hidden', + '#value' => $node->bid, ); + + if ($node->nid && !$node->parent && !user_access('create new books')) { + $form['parent'] = array('#type' => 'value', '#value' => $node->parent); + } + else { + $form['parent'] = array('#type' => 'select', + '#title' => t('Parent'), + '#default_value' => ($node->parent ? $node->parent : arg(4)), + '#options' => book_toc($node->nid, $node->bid), + '#weight' => -4, + '#description' => t('The parent that this page belongs in. "Top level" means the highest level within this book.'), + ); + } + //} + + if (!isset($node->parent)) { + $node->parent = 0; } + $form['title'] = array('#type' => 'textfield', '#title' => t('Title'), '#required' => TRUE, @@ -289,7 +445,7 @@ function book_outline($nid) { $form['parent'] = array('#type' => 'select', '#title' => t('Parent'), '#default_value' => $page->parent, - '#options' => book_toc($node->nid), + '#options' => book_toc($node->nid, $node->bid), '#description' => t('The parent page in the book.'), ); $form['weight'] = array('#type' => 'weight', @@ -330,17 +486,17 @@ function book_outline_submit($form_id, $ switch ($op) { case t('Add to book outline'): - db_query('INSERT INTO {book} (nid, vid, parent, weight) VALUES (%d, %d, %d, %d)', $node->nid, $node->vid, $form_values['parent'], $form_values['weight']); + db_query('INSERT INTO {book_pages} (nid, vid, parent, weight) VALUES (%d, %d, %d, %d)', $node->nid, $node->vid, $form_values['parent'], $form_values['weight']); db_query("UPDATE {node_revisions} SET log = '%s' WHERE vid = %d", $form_values['log'], $node->vid); drupal_set_message(t('The post has been added to the book.')); break; case t('Update book outline'): - db_query('UPDATE {book} SET parent = %d, weight = %d WHERE vid = %d', $form_values['parent'], $form_values['weight'], $node->vid); + db_query('UPDATE {book_pages} SET parent = %d, weight = %d WHERE vid = %d', $form_values['parent'], $form_values['weight'], $node->vid); db_query("UPDATE {node_revisions} SET log = '%s' WHERE vid = %d", $form_values['log'], $node->vid); drupal_set_message(t('The book outline has been updated.')); break; case t('Remove from book outline'): - db_query('DELETE FROM {book} WHERE nid = %d', $node->nid); + db_query('DELETE FROM {book_pages} WHERE nid = %d', $node->nid); drupal_set_message(t('The post has been removed from the book.')); break; } @@ -360,7 +516,7 @@ function book_outline_submit($form_id, $ * */ function book_location($node, $nodes = array()) { - $parent = db_fetch_object(db_query(db_rewrite_sql('SELECT n.nid, n.title, b.parent, b.weight FROM {node} n INNER JOIN {book} b ON n.vid = b.vid WHERE n.nid = %d'), $node->parent)); + $parent = db_fetch_object(db_query(db_rewrite_sql('SELECT n.nid, n.title, b.parent, b.weight FROM {node} n INNER JOIN {book_pages} b ON n.vid = b.vid WHERE n.nid = %d'), $node->parent)); if ($parent->title) { $nodes = book_location($parent, $nodes); $nodes[] = $parent; @@ -372,7 +528,7 @@ function book_location($node, $nodes = a * Accumulates the nodes up to the root of the book from the given node in the $nodes array. */ function book_location_down($node, $nodes = array()) { - $last_direct_child = db_fetch_object(db_query(db_rewrite_sql('SELECT n.nid, n.title, b.parent, b.weight FROM {node} n INNER JOIN {book} b ON n.vid = b.vid WHERE n.status = 1 AND b.parent = %d ORDER BY b.weight DESC, n.title DESC'), $node->nid)); + $last_direct_child = db_fetch_object(db_query(db_rewrite_sql('SELECT n.nid, n.title, b.parent, b.weight FROM {node} n INNER JOIN {book_pages} b ON n.vid = b.vid WHERE n.status = 1 AND b.parent = %d ORDER BY b.weight DESC, n.title DESC'), $node->nid)); if ($last_direct_child) { $nodes[] = $last_direct_child; $nodes = book_location_down($last_direct_child, $nodes); @@ -390,7 +546,7 @@ function book_prev($node) { } // Previous on the same level: - $direct_above = db_fetch_object(db_query(db_rewrite_sql("SELECT n.nid, n.title, b.weight FROM {node} n INNER JOIN {book} b ON n.vid = b.vid WHERE b.parent = %d AND n.status = 1 AND n.moderate = 0 AND (b.weight < %d OR (b.weight = %d AND n.title < '%s')) ORDER BY b.weight DESC, n.title DESC"), $node->parent, $node->weight, $node->weight, $node->title)); + $direct_above = db_fetch_object(db_query(db_rewrite_sql("SELECT n.nid, n.title, b.weight FROM {node} n INNER JOIN {book_pages} b ON n.vid = b.vid WHERE b.parent = %d AND n.status = 1 AND n.moderate = 0 AND (b.weight < %d OR (b.weight = %d AND n.title < '%s')) ORDER BY b.weight DESC, n.title DESC"), $node->parent, $node->weight, $node->weight, $node->title)); if ($direct_above) { // Get last leaf of $above. $path = book_location_down($direct_above); @@ -399,7 +555,7 @@ function book_prev($node) { } else { // Direct parent: - $prev = db_fetch_object(db_query(db_rewrite_sql('SELECT n.nid, n.title FROM {node} n INNER JOIN {book} b ON n.vid = b.vid WHERE n.nid = %d AND n.status = 1 AND n.moderate = 0'), $node->parent)); + $prev = db_fetch_object(db_query(db_rewrite_sql('SELECT n.nid, n.title FROM {node} n INNER JOIN {book_pages} b ON n.vid = b.vid WHERE n.nid = %d AND n.status = 1 AND n.moderate = 0'), $node->parent)); return $prev; } } @@ -409,7 +565,7 @@ function book_prev($node) { */ function book_next($node) { // get first direct child - $child = db_fetch_object(db_query(db_rewrite_sql('SELECT n.nid, n.title, b.weight FROM {node} n INNER JOIN {book} b ON n.vid = b.vid WHERE b.parent = %d AND n.status = 1 AND n.moderate = 0 ORDER BY b.weight ASC, n.title ASC'), $node->nid)); + $child = db_fetch_object(db_query(db_rewrite_sql('SELECT n.nid, n.title, b.weight FROM {node} n INNER JOIN {book_pages} b ON n.vid = b.vid WHERE b.parent = %d AND n.status = 1 AND n.moderate = 0 ORDER BY b.weight ASC, n.title ASC'), $node->nid)); if ($child) { return $child; } @@ -419,7 +575,7 @@ function book_next($node) { $path[] = $node; while (($leaf = array_pop($path)) && count($path)) { - $next = db_fetch_object(db_query(db_rewrite_sql("SELECT n.nid, n.title, b.weight FROM {node} n INNER JOIN {book} b ON n.vid = b.vid WHERE b.parent = %d AND n.status = 1 AND n.moderate = 0 AND (b.weight > %d OR (b.weight = %d AND n.title > '%s')) ORDER BY b.weight ASC, n.title ASC"), $leaf->parent, $leaf->weight, $leaf->weight, $leaf->title)); + $next = db_fetch_object(db_query(db_rewrite_sql("SELECT n.nid, n.title, b.weight FROM {node} n INNER JOIN {book_pages} b ON n.vid = b.vid WHERE b.parent = %d AND n.status = 1 AND n.moderate = 0 AND (b.weight > %d OR (b.weight = %d AND n.title > '%s')) ORDER BY b.weight ASC, n.title ASC"), $leaf->parent, $leaf->weight, $leaf->weight, $leaf->title)); if ($next) { return $next; } @@ -440,6 +596,58 @@ function book_content($node, $teaser = F /** * Implementation of hook_view(). * + */ +function book_cover_view(&$node, $teaser = FALSE, $page = FALSE) { + $node = node_prepare($node, $teaser); + $node->book_license = check_markup($node->book_license, $node->format, FALSE); + //$book_author = theme('book_cover_book_author', $node); + $node->body .= '
'; + $node->teaser .= ''; + //$book_license = theme('book_cover_book_license', $node); + $node->body .= ''.$node->book_license.'
'; + $node->body .= _book_cover_toc($node->bid); +} + +/** + * Creates the Table of Content printed on book cover $bid. + * Returns formatted html. + */ +function _book_cover_toc($bid) { + $toc = 'Pages in a book are like a tree. As pages are edited, reorganized and removed, child pages might be left with no link to the rest of the book. Such pages are referred to as "orphan pages". On this page, administrators can review their books for orphans and reattach those pages as desired.
'); case 'node/add#book': return 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."); + case 'node/add#book_cover': + return t("Add a new book."); } if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'outline') { @@ -1029,3 +1247,20 @@ function book_help($section) { } + +/** + * Prints a list of books in which the user can add pages. + */ +function _add_page_select_book() { + $breadcrumb = array (l( t('Home'),'')); + drupal_set_breadcrumb($breadcrumb); + + $result = db_query('SELECT b.bid, b.nid , n.title FROM {book} b JOIN {node} n ON n.nid = b.nid ORDER BY weight, title'); + while($book = db_fetch_object($result)) { + $books[] = l($book->title, 'node/add/book/bid/'.$book->bid); + } + $output = t('Select the book you wish to add a page to.
'); + $output .= theme('item_list', $books); + return $output; +} +