Please Sign In or Register

「ブックナビゲーション」 ブロックを全てのページに表示する

「ブックナビゲーション」 ブロックを全てのページに表示させるための方法です。

デフォルトの 「ブックナビゲーション」 ブロックは、そのブックでしか表示されませんので、すべてのページに表示したい場合などは、別にブックごとのナビゲーションブロックを作成した上で、デフォルトのブックナビゲーションを非表示にするという方法をとります。

ブロックの設定の 「ページ固有の表示設定」 で、「以下の PHP コードが TRUE を返したら表示する (PHP モード - PHP に精通した方専用)」 を選択し、「ページ」 に以下の PHP コードを記述します。

コードの記述例

強調部分を変更することでブロックに表示される内容をカスタマイズできるようです。

  • $book_top_page には、作成するブロックの最上位にあたるコンテンツのノード番号を設定します。
  • $levels_deep には、ナビゲーションブロックを表示した時に、最初に展開されるメニュー(下位コンテンツ)の階層を設定します。
  • $emulate_book_block には、下位コンテンツを表示するとブロック内のメニューが展開されるような、通常のブックナビゲーションと同じ動作をさせるかどうかを、true または false で指定します。true なら下位メニューが展開され、false なら指定した階層より下位のメニューは展開されません。

このブロックは単一のブックのためのナビゲーションブロックですので、ナビゲーションブロックを表示するページをコントロールしたいブックごとに作成する必要があります。

<?php
$book_top_page = 159;
$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 class="menu">';
      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();

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

[参考]
Book Module: How to make a book navigation block appear on all pages. | drupal.org

トラックバック

トラックバックは承認後に表示されます。

URLから "-nospam" を削除してトラックバックを送信してください。