2010-02-23 3 views
15

Я создал собственное меню под названием «sub-top-nav», и теперь я хотел бы переопределить вывод html. В частности, я хотел бы добавить уникальный класс для каждого элемента.Drupal Override Custom Menu Template

Вот как это выглядит атм:

<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> 

Это дало бы мне больше стайлинг силы. Любая идея, как это работает?

Заранее благодарен!

ответ

12

я получил его на работу в настоящее время. Эта часть кода может помочь кому-то еще! Это входит в 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"; 
} 
1

Вы можете использовать theme_menu_item функцию в template.php вашей темы, чтобы сделать почти все, что вы хотите, чтобы эти пункты меню, включая добавление классов, идентификаторов и т.д.

+0

хорошо, но как это работает для пользовательского меню? не могли бы вы привести мне пример? – n00b

18

Drupal 7 использует theme_menu_link вместо theme_menu_item

<?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"; 
} 
?> 
+0

"theme_menu_link вместо theme_menu_link"? Какой смысл здесь? – demonkoryu

+0

Точно. «theme_menu_link вместо theme_menu_item». –

3

После просмотра через API я, наконец, нашел простое решение, чтобы пометить корневое меню с тем же классом (это полезно, чтобы стиль только меню верхнего уровня уникально, при сохранении их динамически дружественных). Просто используйте plid вместо mlid. Я заметил, что 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"; 
}