2010-02-23 14 views
15

Creé un menú personalizado llamado "sub-top-nav" y ahora me gustaría anular el resultado de html. En particular, me gustaría agregar una clase única para cada elemento como.Drupal Reemplazar plantilla de menú personalizado

Esto es cómo se ve 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> 

Y me gustaría cambiarlo a:

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

Esto me daría más poder de peinado. ¿Alguna idea de cómo funciona eso?

¡Gracias de antemano!

Respuesta

12

Yo tengo que trabajar ahora. ¡Este fragmento de código también podría ayudar a alguien más! Se entra en 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

Usted puede utilizar la función de theme_menu_item en template.php de su tema de hacer casi todo lo que quiere esos elementos de menú, incluyendo la adición de clases, de identidad, etc.

+0

bien, pero ¿cómo funciona para un menú personalizado? ¿Podrías darme un ejemplo? – n00b

18

Drupal 7 utiliza theme_menu_link en lugar de 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 en lugar de theme_menu_link"? ¿Cuál es el punto aquí? – demonkoryu

+0

Exactamente. "theme_menu_link en lugar de theme_menu_item". –

3

Después de mirar a través de la API que finalmente encontró una solución fácil para etiquetar el menú raíz con la misma clase (Esto es útil para personalizar únicamente los menús de nivel superior, a la vez que los mantiene dinámicamente amigables). Simplemente use el plid en lugar de mlid. Noté que el plid siempre es 0 para los menús de nivel superior.

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"; 
} 
Cuestiones relacionadas