web-dev-qa-db-ja.com

menu_blockを使用してクラスを最上位のulに追加する

メニューブロックモジュールを使用して、メインおよびサブナビゲーションを生成しています。 メインのナビゲーションの最上位レベルのulにクラスを追加したいと思います。

私はそれを理解しているので、私はこのようなことをすることができます:

function theme_menu_tree__menu_block($variables) {
  return '<ul class="my classes">' . $variables['tree'] . '</ul>';
}

またはこれ:

function theme_menu_tree__menu_block__main_menu($variables) {
  return '<ul class="my classes">' . $variables['tree'] . '</ul>';
}

ただし、ナビゲーションのすべてのレベルを上記のhtmlでラップしているようです。変更を最初のレベルに制限するにはどうすればよいですか?

$variablesに多くのデータが与えられているようではありません。何か不足していますか?

6
John Bubriski

ここにトリックがあります:theme_menu_tree__MENU_NAME()とtheme_menu_link()。

<?php
/**
 * Implements theme_menu_tree().
 */
function THEMENAME_menu_tree__MENU_NAME(&$variables) {
  return '<ul class="FIRST-LEVEL-CLASS">' . $variables['tree'] . '</ul>';
}

/**
 * Implements theme_menu_link().
 */
function THEMENAME_menu_link__MENU_NAME(array $variables) {
  $element = $variables['element'];
  $sub_menu = '';

  if ($element['#below']) {
    // Wrap in dropdown-menu.
    unset($element['#below']['#theme_wrappers']);
    $sub_menu = '<ul class="OTHER-LEVEL-CLASS">' . drupal_render($element['#below']) . '</ul>';
  }
  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}
?>
8
arshadcn

$variablesは私にくれます:

array(3) {
  ["tree"]=> string(n) "HTML for the sub-tree"
  ["theme_hook_suggestion"]=> string(n) "menu_tree__menu_block__main_menu"
  ["theme_hook_suggestions"]=> array(0) { }
}

かなり悪いようですが、文字列検索を実行して、メニューに最上位要素の1つのテキストが含まれているかどうかを確認できます。

<?php

function theme_menu_tree__menu_block__main_menu($variables) {
  if (!stripos($variables['tree'], 'home')) {
    return '<ul>' . $variables['tree'] . '</ul>';
  } else {
    return '<ul class="my classes">' . $variables['tree'] . '</ul>';
  }
}

?>
1
John Bubriski

テーマメニューのdrupal by Webbykatのネイティブメニュー (menu_blocksではなく)に関するこの最近のブログ投稿に興味があるかもしれません。彼はあなたが呼び出そうとしないクラスを_theme_links_に追加しています。彼はtplファイルを変更していますが、YOURTHEME_links__system_main_menu()でこれを実行できます。私もこの関数を使用しましたが、これを達成するために手抜きしました。

_<?php print theme('links__system_main_menu', array('links' => $main_menu, 'attributes' => array('id' => 'main-menu', 'class' => array('links', 'inline', 'clearfix', 'main-menu')), 'heading' => array('text' => t('Main menu'),'level' => 'h2','class' => array('element-invisible')))); ?>
_

事実4:(おそらくテーマに応じて)メニュー領域tplの各メニューulに適用されるクラスを制御できます。

メインメニューのulにクラスを追加するには、array( 'links'、 'inline'、 'clearfix'、 'main-menu'))をarray( 'links'、 'inline'、 'clearfix'に変更します。 、「メインメニュー」、「新しいクラス」))。

実際には、参照コードのサンプルのように見えます Koumbitからのこのブログ投稿

テーマのtemplate.phpに次のコードを追加して、標準ユーザーメニューと匿名ユーザー用のカスタムメニューの両方に、Drupalの組み込みリンクのインラインリンク用テーマを使用させます。

_/**
 * Make the user menu inline
 */
function customtheme_menu_tree__user_menu($variables) {
  return '<ul class="links inline clearfix">' . $variables['tree'] . '</ul>';
}
_

しかし、あなたが本当にしなければならないことは、テーマの_region-menu.tpl.php_を調べて、_page.tpl.php_がどのようにメインメニューをレンダリングしているかを確認することだと思います。すべてのテーマは異なります。

リンクの_theme_links_および_theme_menu_tree_レンダリングSets(コレクション)の両方。同じ目的のために、異なるテマーは異なる機能を使用します。

これを理解するのに役立つ別のモジュールは Devel および Devel_Themer です。 devel_themerをオンに切り替えてメインメニューを選択すると、使用されているtheme_functionと使用中の.tplファイル(および可能なオーバーライド)が表示されます。

0
tenken