我想覆盖只有一个(自定义)菜单的主题。我可以用phptemplate_menu_tree()做到这一点,但是 - 当然 - 它会覆盖所有菜单的渲染。
如果菜单不是我要覆盖的特定菜单,我尝试返回FALSE(一种显而易见的技术IMO) - 但这不会导致被覆盖的主题函数被调用。
我唯一的选择(当菜单不是特定的菜单时)是从phptemplate_menu_tree()中调用被覆盖的函数 - 但这似乎打败了覆盖系统的整个点,因为默认的渲染函数将是其中有硬编码。
我希望解释清楚,并且非常感谢任何帮助 - tks。
为了将来参考,我将解释我是如何解决这个问题的。
首先,菜单渲染从menu.module中的此函数开始:
function menu_block($op = 'list', $delta = 0) {
$menus = menu_get_menus();
// The Navigation menu is handled by the user module.
unset($menus['navigation']);
if ($op == 'list') {
$blocks = array();
foreach ($menus as $name => $title) {
// Default "Navigation" block is handled by user.module.
$blocks[$name]['info'] = check_plain($title);
// Menu blocks can't be cached because each menu item can have
// a custom access callback. menu.inc manages its own caching.
$blocks[$name]['cache'] = BLOCK_NO_CACHE;
}
return $blocks;
}
else if ($op == 'view') {
$data['subject'] = check_plain($menus[$delta]);
$data['content'] = menu_tree($delta);
return $data;
}
}
如果你只想覆盖单个项目(链接)的呈现方式,那么你可以使用主题系统(有很多关于如何做的参考) - 但是如果你想完全控制整个<的方式/ em>呈现菜单树(例如,将输出包装在嵌套的DIV中,使其可以在页面上居中),然后无法覆盖menu_block()。
因此,我从管理块页面(网站建设 - >块)中删除了我想要渲染的菜单,并使用以下代码直接在我的page.tpl.php中呈现菜单:(删除了尖括号)
$m = menu_tree_page_data('my-menu-id');
$o = "DIV";
foreach($m as $k => $v){
$o .= "SPAN {$v['link']['title']} /SPAN";
}
$o .= "/DIV";
echo $o;
我希望这会有所帮助。
答案 0 :(得分:1)
我在使用template.php菜单覆盖以强制CSS类和id或HTML进入输出方面取得了不同的成功。
当您将菜单作为块启用时,您可以使用块主题,但我从未尝试过。 http://drupal.org/project/blocktheme
如果你想解决模板方式,这里是zen菜单覆盖功能......
function zen_menu_item_link($link) {
if (empty($link['localized_options'])) {
$link['localized_options'] = array();
}
// If an item is a LOCAL TASK, render it as a tab
if ($link['type'] & MENU_IS_LOCAL_TASK) {
$link['title'] = '<span class="tab">' . check_plain($link['title']) . '</span>';
$link['localized_options']['html'] = TRUE;
}
return l($link['title'], $link['href'], $link['localized_options']);
}
function zen_menu_local_tasks() {
$output = '';
if ($primary = menu_primary_local_tasks()) {
$output .= '<ul class="tabs primary clear-block">' . $primary . '</ul>';
}
if ($secondary = menu_secondary_local_tasks()) {
$output .= '<ul class="tabs secondary clear-block">' . $secondary . '</ul>';
}
return $output;
}
答案 1 :(得分:0)
您可以使用sections模块,或查看它如何切换某些菜单项的主题。
答案 2 :(得分:0)
我所做的是在我的template.php中注册一个名为primary_links的新主题函数(因为我只想以某种方式自定义此菜单)在我的template.php中创建函数mytheme_primary_links()刷新缓存,以便Drupal添加我的主题函数系统然后将primary_links上的主题功能从链接更改为我的自定义主题函数primary_links - 这允许我只自定义这1个菜单 - 你可以这样做并挂钩到哪里更改为你的链接调用的主题函数?
克里斯