Commit 59925ef9 authored by Dries's avatar Dries

- Usability improvement: added a book navigation block.
parent bb3b1e4c
...@@ -26,6 +26,7 @@ Drupal x.x.x, xxxx-xx-xx ...@@ -26,6 +26,7 @@ Drupal x.x.x, xxxx-xx-xx
* made it possible to add context-sensitive help to all pages. * made it possible to add context-sensitive help to all pages.
* replaced drop-down menus by radio buttons where appropriate. * replaced drop-down menus by radio buttons where appropriate.
* removed the 'magic_quotes_gpc = 0' requirement. * removed the 'magic_quotes_gpc = 0' requirement.
* added a 'book navigation' block.
- accessibility: - accessibility:
* made themes degrade gracefully in absence of CSS. * made themes degrade gracefully in absence of CSS.
* grouped form elements using '<fieldset>' and '<legend>' tags. * grouped form elements using '<fieldset>' and '<legend>' tags.
......
...@@ -78,10 +78,9 @@ li a.active { ...@@ -78,10 +78,9 @@ li a.active {
} }
.book .nav { .book .nav {
border-top: 1px solid #888; border-top: 1px solid #888;
padding-top:0.5em;
padding-bottom: 2em; padding-bottom: 2em;
border-bottom: 1px solid #888; border-bottom: 1px solid #888;
clear:both; clear: both;
} }
.book .nav .links { .book .nav .links {
clear: both; clear: both;
...@@ -90,7 +89,7 @@ li a.active { ...@@ -90,7 +89,7 @@ li a.active {
clear: both; clear: both;
} }
.book .nav .prev { .book .nav .prev {
float: left; float: left;
text-align: left; text-align: left;
width: 45%; width: 45%;
padding-bottom: 0.5em; padding-bottom: 0.5em;
...@@ -104,7 +103,7 @@ li a.active { ...@@ -104,7 +103,7 @@ li a.active {
.book .nav .up { .book .nav .up {
text-align: center; text-align: center;
} }
.block-book ul { .block ul {
margin: 0; margin: 0;
padding: 0 0 0.25em 1em; padding: 0 0 0.25em 1em;
} }
...@@ -296,8 +295,6 @@ pre, code { ...@@ -296,8 +295,6 @@ pre, code {
} }
.menu ul { .menu ul {
list-style: none; list-style: none;
margin: 0;
padding: 0 0 0.25em 1em;
border: none; border: none;
text-align:left; text-align:left;
} }
......
...@@ -91,6 +91,34 @@ function book_link($type, $node = 0, $main = 0) { ...@@ -91,6 +91,34 @@ function book_link($type, $node = 0, $main = 0) {
return $links; return $links;
} }
function book_block($op = 'list', $delta = 0) {
// Only display this block when the user is browsing a book:
if (arg(0) == 'book' && arg(1) == 'view' && $nid = arg(2)) {
$page = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid"));
$path = book_location($page);
$path[] = $page;
foreach ($path as $key => $node) {
$expand[] = $node->nid;
}
$title = $path[0]->title;
$table = book_tree($expand[0], 5, $expand);
}
if ($op == 'list') {
$block[0]['info'] = t('Book navigation');
}
else {
$block['subject'] = $title;
$block['content'] = $table;
}
return $block;
}
function book_load($node) { function book_load($node) {
global $user; global $user;
...@@ -286,6 +314,8 @@ function book_revision_load($page, $conditions = array()) { ...@@ -286,6 +314,8 @@ function book_revision_load($page, $conditions = array()) {
** Return the path (call stack) to a certain book page. ** Return the path (call stack) to a certain book page.
*/ */
function book_location($node, $nodes = array()) { function book_location($node, $nodes = array()) {
// TODO: eliminate the recursion
$parent = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.nid = %d", $node->parent)); $parent = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.nid = %d", $node->parent));
if ($parent->title) { if ($parent->title) {
$nodes = book_location($parent, $nodes); $nodes = book_location($parent, $nodes);
...@@ -295,6 +325,8 @@ function book_location($node, $nodes = array()) { ...@@ -295,6 +325,8 @@ function book_location($node, $nodes = array()) {
} }
function book_location_down($node, $nodes = array()) { function book_location_down($node, $nodes = array()) {
// TODO: eliminate the recursion
$last_direct_child = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE b.parent = %d ORDER BY b.weight DESC, n.title DESC", $node->nid)); $last_direct_child = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE b.parent = %d ORDER BY b.weight DESC, n.title DESC", $node->nid));
if ($last_direct_child) { if ($last_direct_child) {
array_push($nodes, $last_direct_child); array_push($nodes, $last_direct_child);
...@@ -484,32 +516,29 @@ function book_navigation($node) { ...@@ -484,32 +516,29 @@ function book_navigation($node) {
$node->breadcrumb = ""; // Overwrite the trail with a book trail. $node->breadcrumb = ""; // Overwrite the trail with a book trail.
$node->breadcrumb[] = l(t("Home"), ""); $node->breadcrumb[] = l(t("Home"), "");
$node->breadcrumb[] = l(t("books"), "book");
foreach ($path as $level) { foreach ($path as $level) {
$node->breadcrumb[] = l($level->title, "book/view/$level->nid"); $node->breadcrumb[] = l($level->title, "book/view/$level->nid");
} }
/*
** Construct the "next" and "previous" links:
*/
if ($node->nid) {
$prev = book_prev($node);
$next = book_next($node);
}
if ($node->nid) { if ($node->nid) {
$output .= "<div class=\"book\">"; $output .= "<div class=\"book\">";
$output .= "<div class=\"tree\">". book_tree($node->nid) ."</div>";
if ($prev) { if ($tree = book_tree($node->nid)) {
$output .= "<div class=\"tree\">". book_tree($node->nid) ."</div>";
}
if ($prev = book_prev($node)) {
$links .= "<div class=\"prev\">"; $links .= "<div class=\"prev\">";
$links .= l(t("previous"), "book/view/$prev->nid", array("title" => t("View the previous page in this book."))); $links .= l(t("previous"), "book/view/$prev->nid", array("title" => t("View the previous page.")));
$links .= "</div>"; $links .= "</div>";
$titles .= "<div class=\"prev\">$prev->title</div>"; $titles .= "<div class=\"prev\">$prev->title</div>";
} }
if ($next) { else {
$links .= "<div class=\"prev\">&nbsp;</div>"; // make an empty div to fill the space
}
if ($next = book_next($node)) {
$links .= "<div class=\"next\">"; $links .= "<div class=\"next\">";
$links .= l(t("next"), "book/view/$next->nid", array("title" => t("View the next page in this book."))); $links .= l(t("next"), "book/view/$next->nid", array("title" => t("View the next page.")));
$links .= "</div>"; $links .= "</div>";
$titles .= "<div class=\"next\">$next->title</div>"; $titles .= "<div class=\"next\">$next->title</div>";
} }
...@@ -519,15 +548,12 @@ function book_navigation($node) { ...@@ -519,15 +548,12 @@ function book_navigation($node) {
if ($node->parent) { if ($node->parent) {
$links .= "<div class=\"up\">"; $links .= "<div class=\"up\">";
$links .= l(t("up"), "book/view/$node->parent", array("title" => t("View this page's parent section."))); $links .= l(t("up"), "book/view/$node->parent", array("title" => t("View this page's parent section.")));
//if ($node->parent != $path[0]->nid) {
// $links .= " | ";
// $links .= l(t("index"), "node/view/".$path[0]->nid."", array("title" => t("View this book's table of contents.")));
//}
$links .= "</div>"; $links .= "</div>";
} }
$output .= "<div class=\"nav\">"; $output .= "<div class=\"nav\">";
$output .= "<div class=\"links\">$links</div>"; $output .= " <div class=\"links\">$links</div>";
$output .= "<div class=\"titles\">$titles</div>"; $output .= " <div class=\"titles\">$titles</div>";
$output .= "</div>"; $output .= "</div>";
$output .= "</div>"; $output .= "</div>";
} }
...@@ -577,17 +603,29 @@ function book_toc($parent = 0, $indent = "", $toc = array()) { ...@@ -577,17 +603,29 @@ function book_toc($parent = 0, $indent = "", $toc = array()) {
} }
function book_tree_recurse($nid, $depth, $children) { function book_tree_recurse($nid, $depth, $children, $unfold = array()) {
if ($depth > 0) { if ($depth > 0) {
if ($children[$nid]) { if ($children[$nid]) {
foreach ($children[$nid] as $foo => $node) { foreach ($children[$nid] as $foo => $node) {
$output .= "<li>"; if (in_array($node->nid, $unfold)) {
$output .= l($node->title, "book/view/$node->nid"); if ($tree = book_tree_recurse($node->nid, $depth - 1, $children, $unfold)) {
if ($tree = book_tree_recurse($node->nid, $depth - 1, $children)) { $output .= '<li class="expanded">';
$output .= "<ul>$tree</ul>"; $output .= l($node->title, "book/view/$node->nid");
$output .= "<ul>$tree</ul>";
$output .= '</li>';
}
else {
$output .= '<li class="leaf">'. l($node->title, "book/view/$node->nid") .'</li>';
}
}
else {
if ($tree = book_tree_recurse($node->nid, 1, $children)) {
$output .= '<li class="collapsed">'. l($node->title, "book/view/$node->nid") .'</li>';
}
else {
$output .= '<li class="leaf">'. l($node->title, "book/view/$node->nid") .'</li>';
}
} }
$output .= "</li>";
} }
} }
} }
...@@ -596,7 +634,7 @@ function book_tree_recurse($nid, $depth, $children) { ...@@ -596,7 +634,7 @@ function book_tree_recurse($nid, $depth, $children) {
} }
function book_tree($parent = 0, $depth = 3) { function book_tree($parent = 0, $depth = 3, $unfold = array()) {
$result = db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.status = '1' AND n.moderate = '0' ORDER BY b.weight, n.title"); $result = db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.status = '1' AND n.moderate = '0' ORDER BY b.weight, n.title");
...@@ -606,10 +644,9 @@ function book_tree($parent = 0, $depth = 3) { ...@@ -606,10 +644,9 @@ function book_tree($parent = 0, $depth = 3) {
$children[$node->parent] = $list; $children[$node->parent] = $list;
} }
$output = book_tree_recurse($parent, $depth, $children); if ($tree = book_tree_recurse($parent, $depth, $children, $unfold)) {
$output = "<ul>$output</ul>"; return "<ul>$tree</ul>";
}
return $output;
} }
...@@ -789,7 +826,7 @@ function book_admin_save($nid, $edit = array()) { ...@@ -789,7 +826,7 @@ function book_admin_save($nid, $edit = array()) {
function book_admin_orphan() { function book_admin_orphan() {
$result = db_query("SELECT n.nid, n.title, n.status, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.type = 'book'"); $result = db_query("SELECT n.nid, n.title, n.status, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid");
while ($page = db_fetch_object($result)) { while ($page = db_fetch_object($result)) {
$pages[$page->nid] = $page; $pages[$page->nid] = $page;
...@@ -881,4 +918,5 @@ function book_help($section = "admin/help#book") { ...@@ -881,4 +918,5 @@ function book_help($section = "admin/help#book") {
function book_help_page() { function book_help_page() {
print theme("page", book_help()); print theme("page", book_help());
} }
?> ?>
...@@ -91,6 +91,34 @@ function book_link($type, $node = 0, $main = 0) { ...@@ -91,6 +91,34 @@ function book_link($type, $node = 0, $main = 0) {
return $links; return $links;
} }
function book_block($op = 'list', $delta = 0) {
// Only display this block when the user is browsing a book:
if (arg(0) == 'book' && arg(1) == 'view' && $nid = arg(2)) {
$page = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid"));
$path = book_location($page);
$path[] = $page;
foreach ($path as $key => $node) {
$expand[] = $node->nid;
}
$title = $path[0]->title;
$table = book_tree($expand[0], 5, $expand);
}
if ($op == 'list') {
$block[0]['info'] = t('Book navigation');
}
else {
$block['subject'] = $title;
$block['content'] = $table;
}
return $block;
}
function book_load($node) { function book_load($node) {
global $user; global $user;
...@@ -286,6 +314,8 @@ function book_revision_load($page, $conditions = array()) { ...@@ -286,6 +314,8 @@ function book_revision_load($page, $conditions = array()) {
** Return the path (call stack) to a certain book page. ** Return the path (call stack) to a certain book page.
*/ */
function book_location($node, $nodes = array()) { function book_location($node, $nodes = array()) {
// TODO: eliminate the recursion
$parent = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.nid = %d", $node->parent)); $parent = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.nid = %d", $node->parent));
if ($parent->title) { if ($parent->title) {
$nodes = book_location($parent, $nodes); $nodes = book_location($parent, $nodes);
...@@ -295,6 +325,8 @@ function book_location($node, $nodes = array()) { ...@@ -295,6 +325,8 @@ function book_location($node, $nodes = array()) {
} }
function book_location_down($node, $nodes = array()) { function book_location_down($node, $nodes = array()) {
// TODO: eliminate the recursion
$last_direct_child = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE b.parent = %d ORDER BY b.weight DESC, n.title DESC", $node->nid)); $last_direct_child = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE b.parent = %d ORDER BY b.weight DESC, n.title DESC", $node->nid));
if ($last_direct_child) { if ($last_direct_child) {
array_push($nodes, $last_direct_child); array_push($nodes, $last_direct_child);
...@@ -484,32 +516,29 @@ function book_navigation($node) { ...@@ -484,32 +516,29 @@ function book_navigation($node) {
$node->breadcrumb = ""; // Overwrite the trail with a book trail. $node->breadcrumb = ""; // Overwrite the trail with a book trail.
$node->breadcrumb[] = l(t("Home"), ""); $node->breadcrumb[] = l(t("Home"), "");
$node->breadcrumb[] = l(t("books"), "book");
foreach ($path as $level) { foreach ($path as $level) {
$node->breadcrumb[] = l($level->title, "book/view/$level->nid"); $node->breadcrumb[] = l($level->title, "book/view/$level->nid");
} }
/*
** Construct the "next" and "previous" links:
*/
if ($node->nid) {
$prev = book_prev($node);
$next = book_next($node);
}
if ($node->nid) { if ($node->nid) {
$output .= "<div class=\"book\">"; $output .= "<div class=\"book\">";
$output .= "<div class=\"tree\">". book_tree($node->nid) ."</div>";
if ($prev) { if ($tree = book_tree($node->nid)) {
$output .= "<div class=\"tree\">". book_tree($node->nid) ."</div>";
}
if ($prev = book_prev($node)) {
$links .= "<div class=\"prev\">"; $links .= "<div class=\"prev\">";
$links .= l(t("previous"), "book/view/$prev->nid", array("title" => t("View the previous page in this book."))); $links .= l(t("previous"), "book/view/$prev->nid", array("title" => t("View the previous page.")));
$links .= "</div>"; $links .= "</div>";
$titles .= "<div class=\"prev\">$prev->title</div>"; $titles .= "<div class=\"prev\">$prev->title</div>";
} }
if ($next) { else {
$links .= "<div class=\"prev\">&nbsp;</div>"; // make an empty div to fill the space
}
if ($next = book_next($node)) {
$links .= "<div class=\"next\">"; $links .= "<div class=\"next\">";
$links .= l(t("next"), "book/view/$next->nid", array("title" => t("View the next page in this book."))); $links .= l(t("next"), "book/view/$next->nid", array("title" => t("View the next page.")));
$links .= "</div>"; $links .= "</div>";
$titles .= "<div class=\"next\">$next->title</div>"; $titles .= "<div class=\"next\">$next->title</div>";
} }
...@@ -519,15 +548,12 @@ function book_navigation($node) { ...@@ -519,15 +548,12 @@ function book_navigation($node) {
if ($node->parent) { if ($node->parent) {
$links .= "<div class=\"up\">"; $links .= "<div class=\"up\">";
$links .= l(t("up"), "book/view/$node->parent", array("title" => t("View this page's parent section."))); $links .= l(t("up"), "book/view/$node->parent", array("title" => t("View this page's parent section.")));
//if ($node->parent != $path[0]->nid) {
// $links .= " | ";
// $links .= l(t("index"), "node/view/".$path[0]->nid."", array("title" => t("View this book's table of contents.")));
//}
$links .= "</div>"; $links .= "</div>";
} }
$output .= "<div class=\"nav\">"; $output .= "<div class=\"nav\">";
$output .= "<div class=\"links\">$links</div>"; $output .= " <div class=\"links\">$links</div>";
$output .= "<div class=\"titles\">$titles</div>"; $output .= " <div class=\"titles\">$titles</div>";
$output .= "</div>"; $output .= "</div>";
$output .= "</div>"; $output .= "</div>";
} }
...@@ -577,17 +603,29 @@ function book_toc($parent = 0, $indent = "", $toc = array()) { ...@@ -577,17 +603,29 @@ function book_toc($parent = 0, $indent = "", $toc = array()) {
} }
function book_tree_recurse($nid, $depth, $children) { function book_tree_recurse($nid, $depth, $children, $unfold = array()) {
if ($depth > 0) { if ($depth > 0) {
if ($children[$nid]) { if ($children[$nid]) {
foreach ($children[$nid] as $foo => $node) { foreach ($children[$nid] as $foo => $node) {
$output .= "<li>"; if (in_array($node->nid, $unfold)) {
$output .= l($node->title, "book/view/$node->nid"); if ($tree = book_tree_recurse($node->nid, $depth - 1, $children, $unfold)) {
if ($tree = book_tree_recurse($node->nid, $depth - 1, $children)) { $output .= '<li class="expanded">';
$output .= "<ul>$tree</ul>"; $output .= l($node->title, "book/view/$node->nid");
$output .= "<ul>$tree</ul>";
$output .= '</li>';
}
else {
$output .= '<li class="leaf">'. l($node->title, "book/view/$node->nid") .'</li>';
}
}
else {
if ($tree = book_tree_recurse($node->nid, 1, $children)) {
$output .= '<li class="collapsed">'. l($node->title, "book/view/$node->nid") .'</li>';
}
else {
$output .= '<li class="leaf">'. l($node->title, "book/view/$node->nid") .'</li>';
}
} }
$output .= "</li>";
} }
} }
} }
...@@ -596,7 +634,7 @@ function book_tree_recurse($nid, $depth, $children) { ...@@ -596,7 +634,7 @@ function book_tree_recurse($nid, $depth, $children) {
} }
function book_tree($parent = 0, $depth = 3) { function book_tree($parent = 0, $depth = 3, $unfold = array()) {
$result = db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.status = '1' AND n.moderate = '0' ORDER BY b.weight, n.title"); $result = db_query("SELECT n.nid, n.title, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.status = '1' AND n.moderate = '0' ORDER BY b.weight, n.title");
...@@ -606,10 +644,9 @@ function book_tree($parent = 0, $depth = 3) { ...@@ -606,10 +644,9 @@ function book_tree($parent = 0, $depth = 3) {
$children[$node->parent] = $list; $children[$node->parent] = $list;
} }
$output = book_tree_recurse($parent, $depth, $children); if ($tree = book_tree_recurse($parent, $depth, $children, $unfold)) {
$output = "<ul>$output</ul>"; return "<ul>$tree</ul>";
}
return $output;
} }
...@@ -789,7 +826,7 @@ function book_admin_save($nid, $edit = array()) { ...@@ -789,7 +826,7 @@ function book_admin_save($nid, $edit = array()) {
function book_admin_orphan() { function book_admin_orphan() {
$result = db_query("SELECT n.nid, n.title, n.status, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.type = 'book'"); $result = db_query("SELECT n.nid, n.title, n.status, b.parent FROM {node} n INNER JOIN {book} b ON n.nid = b.nid");
while ($page = db_fetch_object($result)) { while ($page = db_fetch_object($result)) {
$pages[$page->nid] = $page; $pages[$page->nid] = $page;
...@@ -881,4 +918,5 @@ function book_help($section = "admin/help#book") { ...@@ -881,4 +918,5 @@ function book_help($section = "admin/help#book") {
function book_help_page() { function book_help_page() {
print theme("page", book_help()); print theme("page", book_help());
} }
?> ?>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment