Skip to main content

非定型の条件でプライマリリンクの項目をアクティブにする方法

ブックページの階層関係など、定型的な条件に従うのではなく、任意の条件でプライマリリンクの項目をアクティブにしたい場合がある。たとえば、ブログ記事を表示しているときは常にプライマリリンクの「ブログ」メニュー項目を強調表示させたい、といったような場合。

標準の theme_menu_links 関数では、各項目のキー値に 「active」 という文字列が含まれているかどうかで class="active' 属性を付加するかどうかを判断している。

・・・
foreach ($links as $index => $link) {
  $output .= '<li';
  if (stristr($index, 'active')) {
    $output .= ' class="active"';
  }
  $output .= ">". l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment']) ."</li>\n";
}
・・・

この関数をオーバーライドすれば、これとは異なる条件でメニュー項目をアクティブにできる。
たとえば、ブログ記事 (コンテンツタイプが "blog" であるノード) の表示中は、"/blog" にリンクしたメニュー項目をアクティブにしたい、ということであれば、オーバーライドした関数の中で該当個所を次のように書き換えればよい。

・・・
foreach ($links as $index => $link) {
  $output .= '<li';
  if (stristr($index, 'active') <span style="color:red;">|| $link['href'] == 'blog' && $node->type == 'blog'</span>) {
    $output .= ' class="active"';
  }
  $output .= ">". l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment']) ."&lt;/li>\n";
}

プライマリリンクのアクティブ表示は、この方法でカスタマイズできそう。
(例によってベストな方法かどうかはわかりませんが)

$node

.tpl.php ファイルとは異なり、template.php の中では $node 変数が使えないようなので、テンプレート側から関数の引数を通じて渡してやる必要があります。PHP は簡単に引数を追加できるので、こういうときにとても便利。

arg(1) あたりで取得したノード ID を node_load 関数に渡して読み込む方法も考えましたが、メニューのレンダリングのたびに node_load すると、ものすごくパフォーマンスが悪くなりそうなので却下。