[support] book navigation - solved

John Callahan john.callahan at UDel.Edu
Thu Jul 2 02:20:26 UTC 2009


Figures.  You work on a problem for most of the afternoon with no 
success, send a request for help to thousands of people on the support 
list, then you solve your own problem 20 minutes later!

http://drupal.org/project/menu_block does the trick. 

- John



John Callahan wrote:
> I am using the core book module and have exactly one book.  I would 
> like to show a block containing the book navigation (or table of 
> contents) open to the current page/node I'm on.   The problem is that 
> the default Book navigation block behaves like I'd want but  shows the 
> book name as the first entry and first level chapters under that (and 
> collapsed if using DHTML Menu).  I would much rather have the first 
> level chapters as the primary entries and I'll use the book title as 
> the block title.
>
> I've used this piece of code as a block; it does the exact same thing 
> as the default book navigation block.
>
> <?php
> $book_top_page=168;
> $tree = menu_tree_all_data(book_menu_name($book_top_page));
> print menu_tree_output($tree);
> ?>
>
>
> The following code below shows exactly what I need but does NOT open 
> to the current page. (code snippet found on d.o)
>
> Are there any modules or code snippets that can do this?  Any 
> suggestions how I can modify the code below to open the item/page 
> based on the current node?  (such as adding active-trail class where 
> necessary)   Thanks.
>
> - John
>
>
>
>
> <?php
> $book_top_page = 168;
> $levels_deep = 3;
> $emulate_book_block = true;
>
> if (!function_exists('book_struct_recurse')){
> function book_struct_recurse($nid, $levels_deep, $children, 
> $current_lineage = array(), $emulate_book_block = true) {
> $struct = '';
> if ($children[$nid] && ($levels_deep > 0 || ($emulate_book_block && 
> in_array($nid, $current_lineage)))) {
> $struct = '<ul>';
>      foreach ($children[$nid] as $key => $node) {
>      if ($tree = book_struct_recurse($node->nid, $levels_deep - 1, 
> $children, $current_lineage, $emulate_book_block)) {
>      $struct .= '<li>';
>      $struct .= l($node->title, 'node/'. $node->nid);
>      $struct .= $tree;
>      $struct .= '</li>';
>      }
>      else {
>      if ($children[$node->nid]){
>      $struct .= '<li>'. l($node->title, 'node/'. $node->nid) .'</li>';
>      }
>      else {
>      $struct .= '<li>'. l($node->title, 'node/'. $node->nid) .'</li>';
>      }
>      }
>      }
>      $struct .= '</ul>';
> return $struct;
> }
> }
> }
>
> $current_lineage = array();
>
> $result = db_query(db_rewrite_sql('SELECT n.nid, n.title, n2.nid 
> parent, ml.weight
> FROM {node} n
> INNER JOIN {book} b ON n.nid = b.nid
> INNER JOIN {menu_links} ml ON b.mlid = ml.mlid
> INNER JOIN {book} b2 on b2.mlid = ml.plid
> INNER JOIN {node} n2 on b2.nid = n2.nid
> WHERE n.status =1
> ORDER BY ml.weight, n.title'));
>
> while ($node = db_fetch_object($result)) {
> if (!$children[$node->parent]) {
> $children[$node->parent] = array();
> }
> array_push($children[$node->parent], $node);
>
> /*  This function is broken, and for my purposes, not needed **********
> if (arg(0) == 'node' && is_numeric(arg(1)) && arg(1) == $node->nid) {
>  $_temp = book_location($node);
>  foreach ($_temp as $key => $val){
>    $current_lineage[] = $val->nid;
>  }
>  $current_lineage[] = arg(1);
> }
> */
> }
>
> echo book_struct_recurse($book_top_page, $levels_deep, $children, 
> $current_lineage, $emulate_book_block);
>
> ?>
> -- 
> [ Drupal support list | http://lists.drupal.org/ ]


More information about the support mailing list