You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal中基于$menu_tree实现Bootstrap 5下拉菜单渲染问题

导航菜单渲染问题修正方案

核心错误点

现有代码存在4个关键问题导致下拉菜单无法正常工作:

  • 包含子菜单的顶级<li>未添加dropdown类,父级链接缺少Bootstrap 5下拉触发必需的dropdown-toggle类、data-bs-toggle等属性
  • 子菜单容器错误使用<li>标签,应该用<div class="dropdown-menu">包裹下拉项
  • 子菜单链接错误使用nav-link类,且存在重复渲染a标签的语法错误
  • 两个渲染函数逻辑重复、递归调用层级混乱

修正后代码

template.php 代码

function render_menu_tree($menu_tree, $is_submenu = false) {
    // 区分顶级菜单和子菜单的外层容器
    if (!$is_submenu) {
        print '<ul class="mb-2 mb-lg-0 me-lg-auto navbar-nav">';
    } else {
        print '<div class="dropdown-menu">';
    }

    foreach ($menu_tree as $link) {
        $link_path = '#';
        $link_title = $link['link']['link_title'];
        $target = "";
        $has_children = count($link['below']) > 0;

        // 处理链接路径
        if($link['link']['link_path']) {
            $link_path = base_path() . drupal_get_path_alias($link['link']['link_path']);
            if($link['link']['link_path'] == '<front>'){
                $link_path = "/";
            }
            // 处理外部链接跳转逻辑
            if( (strpos($link['link']['link_path'], "http://") !== false) ||
                (strpos($link['link']['link_path'], "https://") !== false) ) {
                $link_path = $link['link']['link_path'];
                $target = " target='_blank'";
            }
        }

        if (!$is_submenu) {
            // 渲染顶级菜单项
            $li_class = $has_children ? 'nav-item dropdown' : 'nav-item';
            print "<li class=\"{$li_class}\">";
            // 给有子菜单的父链接加下拉属性
            if ($has_children) {
                $a_class = 'dropdown-toggle nav-link px-lg-3 py-lg-4 text-light';
                $extra_attr = ' role="button" data-bs-toggle="dropdown" aria-expanded="false"';
            } else {
                $a_class = 'nav-link px-lg-3 py-lg-4 text-light';
                $extra_attr = '';
            }
            print "<a class=\"{$a_class}\" href=\"{$link_path}\" {$target} {$extra_attr}>" . mb_strtoupper($link_title) . "</a>";
            // 递归渲染子菜单
            if ($has_children) {
                render_menu_tree($link['below'], true);
            }
            print '</li>';
        } else {
            // 渲染下拉菜单项
            print "<a class=\"dropdown-item\" href=\"{$link_path}\" {$target}>" . mb_strtoupper($link_title) . "</a>";
            // 支持多级下拉
            if ($has_children) {
                render_menu_tree($link['below'], true);
            }
        }
    }

    if (!$is_submenu) {
        print '</ul>';
        // 输出登录注册按钮,对齐目标HTML结构
        print '<div class="ms-lg-3">
            <a class="btn btn-outline-primary pe-3 ps-3" href="#">Log in</a>
            <a class="btn btn-primary pe-3 ps-3" href="#" style="background-color: #ee545d;">Register</a>
        </div>';
    } else {
        print '</div>';
    }
}

page.tpl.php 代码

无需修改,保持原有调用逻辑即可:

<div class="collapse navbar-collapse" id="navbarNavDropdown-4"> 
     <?php
           $main_menu_tree = menu_tree_all_data('main-menu', null, 3);
           render_menu_tree($main_menu_tree);
      ?>                            
</div>

可选优化:当前页面高亮

可在顶级链接的class判断逻辑中加入当前路径匹配规则,给当前访问的页面链接加上active类和aria-current="page"属性,实现导航高亮效果。


内容的提问来源于stack exchange,提问作者Douglas Teles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:48:05