是否有可能*可选*覆盖Drupal 6中的主题?

时间:2010-06-02 12:51:40

标签: drupal

我想覆盖只有一个(自定义)菜单的主题。我可以用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;

我希望这会有所帮助。

3 个答案:

答案 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个菜单 - 你可以这样做并挂钩到哪里更改为你的链接调用的主题函数?

克里斯