2010-06-02 82 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