web-dev-qa-db-ja.com

Drupalカスタムメニューテンプレートを上書きする

「sub-top-nav」というカスタムメニューを作成しましたが、HTML出力を上書きしたいと思います。特に、のような各アイテムに独自のクラスを追加したいと思います。

これはそれがどのように見えるかです:

<div class="clear-block block block-menu" id="block-menu-menu-sub-top-nav">
    <div class="content">
    <ul class="menu">
      <li class="leaf first"><a title="Test 1" href="/test1">Test 1</a></li>
      <li class="leaf"><a title="Test 2" href="/test2">Test 2</a></li>
      <li class="leaf active-trail"><a class="active" title="Test 3" href="/test3">Test 3</a></li>
      <li class="leaf last"><a title="Test 4" href="/test4">Test 4</a></li>
    </ul>
  </div>
</div>

そして、私はそれを次のように変更したいと思います:

<div class="clear-block block block-menu" id="block-menu-menu-sub-top-nav">
  <div class="content">
    <ul class="menu">
      <li class="leaf test1 first"><a title="Test 1" href="/test1">Test 1</a></li>
      <li class="leaf test2"><a title="Test 2" href="/test2">Test 2</a></li>
      <li class="leaf test3 active-trail"><a class="active" title="Test 3" href="/test3">Test 3</a></li>
      <li class="leaf test4 last"><a title="Test 4" href="/test4">Test 4</a></li>
    </ul>
  </div>
</div>

これは私にもっとスタイリング力を与えるでしょう。それがどのように機能するか考えていますか?

前もって感謝します!

17
n00b

私は今それを動作させました。このコードは他の誰かにも役立つかもしれません! yourtheme /template.phpに入ります

function phptemplate_menu_item($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) {

  $class = ($menu ? 'expanded' : ($has_children ? 'collapsed' : 'leaf'));

  if (!empty($extra_class))
    $class .= ' '. $extra_class;

  if ($in_active_trail)
    $class .= ' active-trail';

  $class .= ' ' . preg_replace('/[^a-zA-Z0-9]/', '', strtolower(strip_tags($link)));

  return '<li class="'. $class .'">'. $link . $menu ."</li>\n";
}
12
n00b

Drupal7はtheme_menu_itemの代わりにtheme_menu_linkを使用します

<?php
function theme_menu_link(array $variables) {
  $element = $variables['element'];
  $sub_menu = '';

  if ($element['#below']) {
    $sub_menu = drupal_render($element['#below']);
  }
  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}
?>
19
Fedir RYKHTIK

APIを調べた後、ルートメニューに同じクラスのタグを付ける簡単な解決策をついに見つけました(これは、動的に使いやすい状態を維持しながら、トップレベルのメニューのみを一意にスタイル設定するのに役立ちます)。 mlidの代わりにplidを使用するだけです。トップレベルのメニューでは、plidが常に0であることに気付きました。

function theme_menu_link(array $variables) {
  $element = $variables['element'];
  $sub_menu = '';

  $element['#attributes']['class'][] = 'menu-' . $element['#original_link']['plid'];

  if ($element['#below']) {
    $sub_menu = drupal_render($element['#below']);
  }

  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
        $count = 1;
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}
3
Alan V.

テーマのtemplate.phpで theme_menu_item 関数を使用すると、クラスやIDの追加など、これらのメニュー項目に必要なことをほぼすべて実行できます。

2
Mike Crittenden