Вывести оглавление всей книги/подшивки в Drupal 7

ВАЖНО: любым сниппетом (и этим тоже), при не правильном использовании или ошибке в коде, можно уронить сайт! Который будет трудно поднять, если с этим не сталкивались. По-этому, используйте на свой страх и риск!

Как-то понадобилось в Drupal 7 вывести полное оглавление всей книги в блоке, не прибегая к помощи views и прочих модулей.
Т.е. был нужен просто сниппет.

Хорошенько поискав, нашел модуль booktree.

Чуть-чуть изменив код и убрав ненужные для меня вещи, получился сниппет, который можно вставлять в блок или на страницу:

<?php
function book_toc_recursive ($mlid, $nid, $mlid_start, $tit) {
        $c = ''; 
        $content = '';
        $sql= 'SELECT DISTINCT status, n.nid as nid, m.plid as plid, m.mlid as mlid,  n.title as title  
                FROM {book} as b
                inner join {menu_links} as m ON b.mlid = m.mlid
                inner join {node} as n ON n.nid = b.nid
                WHERE m.plid = :mlid AND status = 1
                ORDER by m.weight, n.title
                ';
        $children = db_query ($sql, array(':mlid'=>$mlid) );
 
        if ($mlid != $mlid_start) {//не выводить самый первый уровень
                $content .= '<li>' . l($tit, 'node/' . $nid, $attributes = array(), $query = NULL, $fragment = NULL, $absolute = FALSE, $html = FALSE ) .'</li>';
        }
 
        foreach ($children as $child ) {
                $c .= book_toc_recursive($child->mlid, $child->nid, $mlid_start, $child->title);
        }
 
        if (strlen($c) > 2) {
                $content .= '<ul>'. $c. '</ul>';
        }
    return $content;
}
 
$node = node_load(XXX);
print book_toc_recursive($node->book['mlid'], $node->nid, $node->book['mlid'], $node->title);
?>

Здесь, вместо XXX - нужно поставить номер книги.

В коде есть масса возможностей для оптимизации, пусть будет домашним заданием! ;)