Modificando o tema do menu do drupal 5

As vezes seu tema exige algumas modificações no menu pois o padrão do Drupal 5 não te atende. Para isso você vai precisar escrever algumas funções temas no template.php do seu tema.

O drupal usa estas 3 funções para montar os menus:

http://api.drupal.org/api/function/theme_menu_tree/5
http://api.drupal.org/api/function/menu_tree/5
http://api.drupal.org/api/function/theme_menu_item/5

A theme_menu_tree chama a menu_tree que chama a theme_menu_item.

No teu caso, você vai precisar mesmo modificar a menu_tree mas como ela não é funções tema, você vai precisar criar uma para o theme_menu_tree... hehehehe

Na theme_menu_tree vc vai chamar a minha_menu_tree onde você vai fazer tudo o que a menu_tree faz e colocar no foreach dela a verificação se eh first ou last... de alguma forma vc vai precisar passar isso para a theme_menu_item...

Para não precisar alterar a quantidade de parâmetros da função, podemos aproveitar que o primeiro parametro ($mid) é um array e passar esta informação por ele...

Dae so falta alterar o theme_menu_item para colocar o first/last no li...

O resultado final ficaria mais ou menos assim:

  1. <?php
  2. function mythemename_menu_tree($pid = 1) {
  3. if ($tree = meusuper_menu_tree($pid)) {
  4. return "\n<ul class=\"menu\">\n". $tree ."\n</ul>\n";
  5. }
  6. }
  7.  
  8. function meusuper_menu_tree($pid) {
  9. $menu = menu_get_menu();
  10. $output = '';
  11.  
  12. if (isset($menu['visible'][$pid]) && $menu['visible'][$pid]['children']) {
  13. $total_children = count($menu['visible'][$pid]['children']);
  14. $i = 0;
  15. foreach ($menu['visible'][$pid]['children'] as $mid) {
  16. $i++;
  17. $type = isset($menu['visible'][$mid]['type']) ? $menu['visible'][$mid]['type'] : NULL;
  18. $children = isset($menu['visible'][$mid]['children']) ? $menu['visible'][$mid]['children'] : NULL;
  19. if ($i == 1) {
  20. $mid['mythemename_position'] = 'first';
  21. }
  22. elseif ($i == $total_children) {
  23. $mid['mythemename_position'] = 'last';
  24. }
  25. $output .= theme('menu_item', $mid, menu_in_active_trail($mid) || ($type & MENU_EXPANDED) ? theme('menu_tree', $mid) : '', count($children) == 0);
  26. }
  27. }
  28.  
  29. return $output;
  30. }
  31.  
  32. function mythemename_menu_item($mid, $children = '', $leaf = TRUE) {
  33. $position = isset($mid['mythemename_position']) && !empty($mid['mythemename_position']) ? $mid['mythemename_position'] : '';
  34. return '<li class="'.$position.' '. ($leaf ? 'leaf' : ($children ? 'expanded' : 'collapsed')) .'">'. menu_item_link($mid) . $children ."</li>\n";
  35. }
  36.  
  37. ?>

Como fiz isso tudo sem testar, pode ser que não funcione 100% mas a idéia é esta. Caso você encontre algum erro, me avise "ASAP".

Flw