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



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

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

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

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

Comments

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

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

Post new comment

The content of this field is kept private and will not be shown publicly.
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.