Drupal:将菜单子项的链接更改为锚点


Drupal: Changing the link of menu children to anchors

我的目标是修改菜单的输出,使子菜单链接成为父项的锚点:

<ul class="menu">
  <li>
    <a href="page1">Page 1</a>
    <ul class="submenu">
      <li>
        <a href="page1#section">Section</a>
      </li>
    </ul>
  </li>
</ul>

因为Drupal GUI不允许菜单项中的锚点,我需要修改theme_link()函数来更改所有子项:

function MYTHEME_menu_link__menu_block__main_menu(array $variables) {
  $element = $variables['element'];
  $sub_menu = '';
  if ($element['#below']) {
    foreach($element['#below'] as $child) {
      $child['#href'] = str_replace(' ', '-', strtolower(render($child['#title'])));
    }
    $sub_menu = drupal_render($element['#below']);
  }
  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>'n";
}

但是有两个问题,这是我缺乏Drupal函数经验的结果:

  1. 更改后的href不会传递到呈现的 HTMl。
  2. 我在第 8 行收到此错误:Warning: Cannot use a scalar value as an array .

我需要什么来纠正此错误,如何将新href传递给菜单-儿童的输出链接?

编辑:我应该补充一点,我正在使用实体引用将节点拉入一个超级页面,并且网站上有三个超级页面。因此,使用单页解决方案对我不起作用。

也许您可以从单页站点模块中获得想法

httops://www.drupal.org/project/single_page_site它允许您从菜单自动创建单个页面。该模块将在一个页面上呈现菜单中配置的链接中的所有内容。然后,它将覆盖菜单链接,以便它们引用锚点而不是新页面。

经过多次试验和错误,我决定现在使用非PHP解决方案。我正在使用JavaScript在页面加载时更改子菜单儿童href,这不一定是最好的解决方案,但目前最可行。似乎Drupal的菜单功能更适合修改菜单项的标记和属性,而不是菜单的链接属性。如果我回到这个问题并提出一个 PHP 解决方案,我会在这里发布它。

尽管这并不能回答我最初的问题,但我将其标记为可接受的答案,因为它提供了我想要完成的最终结果。