Drupal:将菜单子项的 link 更改为锚点
Drupal: Changing the link of menu children to anchors
我的目标是修改菜单的输出,使子菜单 link 成为父项的锚点:
<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 功能缺乏经验的结果:
- 未将更改的
href
传递给呈现的 HTMl。
- 我收到第 8 行的错误:
Warning: Cannot use a scalar value
as an array
。
我需要什么来纠正这个错误,我怎样才能将新的 href
传递给子菜单的输出 link?
编辑:我应该补充一点,我正在使用实体引用将节点拉入一个超级页面,并且站点上有三个超级页面。所以使用单页解决方案对我来说行不通。
也许你可以从单页站点模块中得到灵感
https://www.drupal.org/project/single_page_site
它允许您从菜单自动创建单个页面。该模块将在一页上呈现菜单中配置的链接中的所有内容。然后它将覆盖菜单链接,以便它们引用锚点而不是新页面。
经过反复试验,我决定暂时使用非 PHP 解决方案。我正在使用 JavaScript 在页面加载时更改子菜单子项的 href
s,这不一定是最好的解决方案,但目前是最可行的。似乎 Drupal 的菜单函数更适合修改菜单项的标记和属性,而不是菜单的 link 属性。如果我 return 解决这个问题并提出 PHP 解决方案,我会 post 在这里。
尽管这没有回答我最初的问题,但我将其标记为已接受的答案,因为它提供了我试图完成的最终结果。
我的目标是修改菜单的输出,使子菜单 link 成为父项的锚点:
<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 功能缺乏经验的结果:
- 未将更改的
href
传递给呈现的 HTMl。 - 我收到第 8 行的错误:
Warning: Cannot use a scalar value as an array
。
我需要什么来纠正这个错误,我怎样才能将新的 href
传递给子菜单的输出 link?
编辑:我应该补充一点,我正在使用实体引用将节点拉入一个超级页面,并且站点上有三个超级页面。所以使用单页解决方案对我来说行不通。
也许你可以从单页站点模块中得到灵感
https://www.drupal.org/project/single_page_site 它允许您从菜单自动创建单个页面。该模块将在一页上呈现菜单中配置的链接中的所有内容。然后它将覆盖菜单链接,以便它们引用锚点而不是新页面。
经过反复试验,我决定暂时使用非 PHP 解决方案。我正在使用 JavaScript 在页面加载时更改子菜单子项的 href
s,这不一定是最好的解决方案,但目前是最可行的。似乎 Drupal 的菜单函数更适合修改菜单项的标记和属性,而不是菜单的 link 属性。如果我 return 解决这个问题并提出 PHP 解决方案,我会 post 在这里。
尽管这没有回答我最初的问题,但我将其标记为已接受的答案,因为它提供了我试图完成的最终结果。