可替代Drupal自带BookTree的代码

<?php
$book_top_page = 0 ;
$levels_deep = 1 ;
$emulate_book_block = true ;

if (! function_exists ( 'book_struct_recurse' )){
// we wrap the function in this if() statment to avoid PHP errors
// when this is used in more than one block
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 = '

' ;
return $struct ;
}
}
}
?>

<?php
$current_lineage = array();

// use this version for Drupal 4.6
// $result = db_query(db_rewrite_sql('SELECT n.nid, n.title, b.parent, b.weight FROM {node} n INNER JOIN {book} b ON n.nid = b.nid WHERE n.status = 1 ORDER BY b.weight, n.title'));

// use this version for Drupal 4.7 and Drupal 5
$result = 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 ORDER BY b.weight, n.title' ));

while ( $node = db_fetch_object ( $result )) {
if (! $children [ $node -> parent ]) {
$children [ $node -> parent ] = array();
}
array_push ( $children [ $node -> parent ], $node );

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