2010-06-02 54 views
2

我想覆盖只有一个(自定义)菜单的主题。我可以用phptemplate_menu_tree()来做到这一点,但是 - 当然 - 它会覆盖所有菜单的渲染。是否可以选择*覆盖Drupal 6中的主题?

我试着返回FALSE(一种明显的技术IMO),如果菜单不是特定的我想重写 - 但这不会导致重写的主题函数被调用。

我唯一的选择(当菜单不是特定的菜单时)是从phptemplate_menu_tree()中调用覆盖的函数 - 但这似乎打败了覆盖系统的整个点,因为默认的渲染函数将在其中被硬编码。

我希望解释清楚,任何帮助都非常感谢 - tks。

UPDATE

对于将来参考起见,我将解释我是如何解决这个。

首先,在菜单中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; 
    } 
} 

如果你只是想覆盖项(链接)个体如何被渲染,那么你可以使用主题系统(有如何完全控制整个菜单树的呈现方式(例如,将输出封装在嵌套的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

您可以使用sections模块,或查看它如何切换某些菜单项的主题。

+0

不错的提示,我会研究它。试图给你投票 - 但我仍然太穷... – 2010-06-02 13:03:52

+0

没有骰子。它只是切换整个主题ID取决于您所在的网站的哪一部分。无论如何感谢... – 2010-06-02 13:11:19

+0

是不是你想要的,然后呢? – berkes 2010-06-03 09:10:21

1

我已经混合成功做template.php菜单覆盖强制CSS类和ID或HTML到输出。

当启用菜单作为块时,您可以使用块主题,但我从来没有尝试过。 http://drupal.org/project/blocktheme

如果你想解决的模板路,这里是禅宗菜单覆盖funcitons ...

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; 
} 
+0

谢谢doublejosh,这很有帮助。 – 2010-07-02 09:31:18

0

我所做的是注册在我的template.php称为primary_links一个新的主题功能(因为我想只以某种方式定制这个菜单)在我的template.php中创建函数mytheme_primary_links()刷新缓存,以便Drupal将我的主题功能添加到系统中,然后在primary_links上更改主题函数从链接到我的自定义主题函数primary_links - 这使我只能自定义这1个菜单 - 你可以做到这一点,并挂钩到哪里去改变被称为fo的主题功能你的链接?

Chris