Posted by big_smile on March 20, 2010 at 3:47pm
By default, Drupal outputs menus as this:<ul class="menu">
How can you add an ID (or class) to the menu e.g.:<ul id="menu_name">
I've spent ages searching for an answer, but there only seems to be techniques for modifying the <li> of the ULs (and not the ULs of themselves).
Being able to assign IDs/Classes is essential to target specific menus, so I'm surprised a solution isn't more readily available.
Comments
Check this there are lot of
Check this there are lot of options available.
http://drupal.org/project/modules?text=menu%20class
Drupal Guy Always looking for work
Reach Me
Share your Posts, Url, Sites
www.sociopost.com
Thanks! But I would like to
Thanks! But I would like to do without a module.
I have found this code:
function phptemplate_menu_tree($tree) {return '<ul class="menu"'. 'id="' . $PUT-VARIABLE-HERE . '">' . $tree .'</ul>';
}
The code can be used in template.php to override the output of the
<ul>. However, the only variable it seems to accept is$tree, which prints out all the contents of a<ul>and so is not very helpful.Any ideas?
Check this out
Check this out http://drupal.org/node/748018#comment-3950826
Drupal in the Amazon Jungle
There are two ways to output
There are two ways to output menus. The first is as a block, since blocks have unique ids you can use those to target css to a given menu. The other way is to call the appropriate functions, in this case you can provide a wrapper div with a unique id.
It's bad practice to wrap an
It's bad practice to wrap an element in a DIV to target when you can just as easily add a class or ID to the element directly.
Surely there must be away to assign a Class/ID to a UL.
I can't believe
phptemplate_menu_treeonly allows$tree. There must be a variable to get at least the name of the UL.The same issue here
I am facing exactly the same problem right now.The only way i think it can be fixed is by rewriting theme_item_list() function.Although, this doesn't seem to be the drupal way of doing it,because content is being duplicated for the sake of such a minor change.
In the end, I used this code
In the end, I used this code in template.php:
function phptemplate_menu_tree($tree) {
foreach (count_chars($tree, 1) as $i => $val) {
return '<ul class="menu"'. ' id="menu_' . $val . '">' . $tree .'</ul>';
}
}
The code works by counting how many characters there are in the menu and places it as an
<UL>ID.This is obviously a terrible thing to do, because each time you change your menus, the IDs will also change.
However, it is the only method I found for creating IDs for ULs without installing any modules.
Another Solution for D6
In your template.php
//Set a global variable containing the current region name
function phptemplate_blocks($region) {
global $_current_region;
$_current_region = $region;
$output = theme_blocks($region);
return $output;
}
function YOURTHEME_menu_tree($tree) {
//get the global variable containg the current region name we've just set
global $_current_region;
switch($_current_region){
case 'my_region_1':
$output = '<ul class="whatEverYouLike">'. $tree .'</ul>';
break;
case 'my_region_2':
$output = '<ul class="somethingElse">'. $tree .'</ul>';
break;
default:
$output = '<ul class="menu">'. $tree .'</ul>';
}
return $output;
}
Drupal in the Amazon Jungle
is there something like this
is there something like this for D7?
I haven't tried but believe
I haven't tried but believe it is pretty much the same thing. The only difference is that $tree is no longer present but $variables.
You can find more here:
http://api.drupal.org/api/drupal/includes--menu.inc/function/theme_menu_...
Drupal in the Amazon Jungle
Yet another solution :)
To substitute
<ul class="menu">with your own class or id for a specific menu tree, you can do this inside your template.php:<?phpfunction phptemplate_preprocess_page(&$vars) {
$vars['nav_menu'] = str_replace('class="menu"', 'class="myclass"', menu_tree('navigation'));
$vars['prim_menu'] = str_replace('class="menu"', 'id="myid"', menu_tree('primary-links'));
}
?>
Afterwards you can place these newly generated variables inside your page.tpl.php:
<!-- HTML stuff --><?php print $pri_menu; ?>
<!-- HTML stuff -->
<?php print $nav_menu; ?>
<!-- HTML stuff -->
Cheers.
Thanks for the solutions
Thanks for the solutions FranciscoLuz & tumblingmug! Much appreciated!
It's a shame that you have to specify the name of the menus. It would be nice if you created a menu and Drupal automatically generated a menu ID based on the menu name.
Are there any solutions to UL ID's in Drupal 7?
It shouldn't be too hard to
It shouldn't be too hard to create a module that would implement the menu core module or submit a patch to menu module maintainer.
A patch should create an extra database field in the menu_custom table called say class then add a form field in menu.admin.inc at line 410 which could also be called class and adjust that into the SQL queries at line 529 (menu_edit_menu_submit).
Drupal in the Amazon Jungle
You could also generate a
You could also generate a name based class by slightly changing my solution to:
$output = '<ul class="menu-"'.$tree["menu-name"].'">'. $tree .'</ul>';Drupal in the Amazon Jungle
KISS approach using theme_links()
<?phpprint theme('links', menu_navigation_links('menu-nav-main'),array('id' => 'nav_main'));
?>
I used this code in my page.tpl.php: You might want to use variables and put it in your template.php file instead - so it will be automaticly available for every menu.
Alexandre
http://w3w.fr