Вы здесь

Информация. Содержание книги — 2

Этот код выведет на страницу содержание книги, начиная с указанного ID. Сниппет можно использовать как в содержании документа, так и в содержании блока.

Друпал 4.7 и 5

(код для 4.6 закомментирован)

<?php
$book_top_page
= 100//  Верхняя страница
$levels_deep = 5//  Глубина ссылок
$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 class="expanded">';
         
$struct .= l($node->title, 'node/'. $node->nid);
         
$struct .= $tree;
         
$struct .= '</li>';
        }
        else {
          if (
$children[$node->nid]){
           
$struct .= '<li class="collapsed">'. l($node->title, 'node/'. $node->nid) .'</li>';
          }
          else {
           
$struct .= '<li class="leaf">'. l($node->title, 'node/'. $node->nid) .'</li>';
          }
        }
      }
     
$struct .= '</ul>';
      return
$struct;
    }
  }
}
$current_lineage = array();

// Версия для 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'));

// Версия для Drupal 4.7 и 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.nid = b.nid AND 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);
?>

Друпал 4.7 и 5 (другая версия)

(код для 4.6 закомментирован)

<?php
$book_top_page
= 63//  Верхняя страница
$levels_deep = 2//  Глубина ссылок
$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();

// Версия для 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'));

// Версия для Drupal 4.7 и 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.nid = b.nid AND 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);
?>

Друпал 6

<?php
$book_top_page
= 1//  Верхняя страница
$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);
?>

Комментарии

Изображение пользователя Skirr.

Можно добавить и содержание книги 3 для Д6 http://drupal.org/node/209336

Только вот минус в том, что первая страница книги - нода с текстом. А в меню она неотображается. Начинаеться сразу со второй. Неподскажите решение?