2010-02-23 17 views
15

Ho creato un menu personalizzato chiamato "sub-top-nav" e ora vorrei sovrascrivere l'output html. In particolare vorrei aggiungere una classe unica per ogni oggetto come.Ignora drupale Modello menu personalizzato

Questo è come appare 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> 

E mi piacerebbe trasformarla in:

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

Questo mi darebbe più potere styling. Qualche idea su come funziona?

Grazie in anticipo!

risposta

12

ho preso a lavorare adesso. Questo pezzo di codice potrebbe aiutare qualcun altro! Va in 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

È possibile utilizzare la funzione theme_menu_item in template.php del vostro tema a fare praticamente tutto quello che si desidera quelle voci di menu, tra cui l'aggiunta di classi, ID, ecc

+0

OK ma come funziona per un menu personalizzato? Puoi farmi un esempio? – n00b

18

Drupal 7 utilizza theme_menu_link invece di 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 invece di theme_menu_link"? Qual è il punto qui? – demonkoryu

+0

Esattamente. "theme_menu_link invece di theme_menu_item". –

3

Dopo guardando attraverso l'API ho finalmente trovato una soluzione facile per contrassegnare il menu principale con la stessa classe (questo è utile per personalizzare solo i menu di primo livello in modo univoco, mantenendoli dinamicamente amichevoli). Basta usare il plid invece del mlid. Ho notato che il plid è sempre 0 per i menu di livello superiore.

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"; 
} 
Problemi correlati