我对 Drupal 6 及其主题还很陌生。我的主题需要主菜单为我合理涉及的样式提供相当广泛的 html/css。为了实现这一点,我将这段代码“function phptemplate_menu_item”(见底部)拼凑在一起,它位于我的 template.php 中,并根据菜单项是否有子项生成不同的 html,并使用链接的内容生成 css 类.
我的问题是这个代码也被应用到我的其他菜单。我想让 menu_item 生成不同的 html,具体取决于它是否在主菜单中。我本以为最简单的方法是在函数 phptemplate_menu_item 中使用 if 语句,例如:
function phptemplate_menu_item (...){
if ($menu_name == 'primary-links')
{DO ABC}
else
{DO XYZ}
}
但是我相信我需要知道如何将菜单名称传递给 phptemplate_menu_item 函数。任何有关这方面的帮助将非常感激,因为我已经用头撞墙试图解决这个问题有一段时间了。
谢谢!
function phptemplate_menu_item($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) {
$class = ($menu ? 'no_wrap' : ($has_children ? 'collapsed' : 'li_wrap'));
if (!empty($extra_class)) {
$class .= ' '. $extra_class;
}
if ($in_active_trail) {
$class .= ' active-trail';
}
if (!empty($link)) {
/* The following section gives the list items unique classes based on their link text - note how spaces and sepcial chars are removed */
// remove all HTML tags and make everything lowercase
$css_id = strtolower(strip_tags($link));
// remove colons and anything past colons
if (strpos($css_id, ':')) $css_id = substr ($css_id, 0, strpos($css_id, ':'));
// Preserve alphanumerics, everything else goes away
$pattern = '/[^a-z]+/ ';
$css_id = preg_replace($pattern, '', $css_id);
$class .= ' '. $css_id;
}
// the following code returns the menu item formatted in a different fashion depending on the class of the item. The first one is for items with a class of none - ie the space li at end of menu
if (strstr($class, 'none')) {
return '<li class="'. $class . ' main"></span></span></li>';
}
if (strstr($class, 'li_wrap')) {
return '<li class="'. $class .' main"><span class="wrapped">'. $link . $menu ."<span class='indicator'></span></li>\n";
}
if (strstr($class, 'no_wrap')) {
return '<li class="'. $class . ' main">'. $link ."<span class='indicator'></span><span class='menu_box'><span class='menu_box_inner'>". $menu ."</span></span></li>\n";
}
}
嗯,我认为在here找到的解决方案是最好的,所以我不会因此而获得荣誉。您应该从
theme_menu_item
开始定义自定义函数 theme_primary_links
,而不是覆盖 theme_links
。您可以选择您认为最适合自定义主题的任何名称(但确保它尚未使用)。
底线:有时定义自定义主题比覆盖默认主题更容易。这样您就知道可以根据您的需要严格应用自定义主题(例如仅应用于主菜单链接)。当您希望更改是全局的(例如应用于所有菜单链接)时,最好使用覆盖。