2010-02-23 41 views
15

Tôi đã tạo một menu tùy chỉnh có tên là "phụ-top-nav" và bây giờ tôi muốn ghi đè đầu ra html. Đặc biệt, tôi muốn thêm một lớp duy nhất cho mỗi mục như.Mẫu menu tùy chỉnh ghi đè Drupal

Đây là cách nó trông atm:

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

Và tôi muốn thay đổi nó thành:

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

này sẽ cho tôi sức mạnh phong cách hơn. Bất kỳ ý tưởng nào hoạt động?

Cảm ơn trước!

Trả lời

12

tôi đã nhận nó để làm việc bây giờ. Đoạn mã này cũng có thể giúp người khác! Nó đi vào 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

Bạn có thể sử dụng theme_menu_item chức năng trong template.php của chủ đề của bạn làm khá nhiều bất cứ điều gì bạn muốn cho những mục menu, bao gồm thêm các lớp học, ID vv

+0

được rồi nhưng cách hoạt động cho menu tùy chỉnh? Ông có thể cho tôi một ví dụ? – n00b

18

Drupal 7 sử dụng theme_menu_link thay vì 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 thay vì theme_menu_link"? Điểm ở đây là gì? – demonkoryu

+0

Chính xác. "theme_menu_link thay vì theme_menu_item". –

3

Sau khi xem qua API cuối cùng tôi đã tìm thấy một giải pháp dễ dàng để gắn thẻ menu gốc với cùng lớp (điều này rất hữu ích khi chỉ tạo kiểu cho các menu cấp cao nhất, đồng thời duy trì chúng thân thiện với động). Đơn giản chỉ cần sử dụng plid thay vì mlid. Tôi nhận thấy các plid luôn luôn là 0 cho các menu cấp cao nhất.

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"; 
} 
Các vấn đề liên quan