メニューブロックモジュールを使用して、メインおよびサブナビゲーションを生成しています。 メインのナビゲーションの最上位レベルの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
に多くのデータが与えられているようではありません。何か不足していますか?
ここにトリックがあります: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";
}
?>
$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>';
}
}
?>
テーマメニューの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ファイル(および可能なオーバーライド)が表示されます。