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

加载菜单树时,如何通过编程设置MenuLinkTreeElement的expanded属性为1?

问题

加载MenuTree时,未展开的MenuLinkTreeElement实例的子树为空,如何通过编程将其expanded属性设置为1?

示例代码:

$parameters = $menu_link_tree->getCurrentRouteMenuTreeParameters('admin');
$tree = $menu_link_tree->load('admin', $parameters);
$admin_link = reset($tree);
dpm($admin_link);

// 输出结果
Drupal\Core\Menu\MenuLinkTreeElement {#242 ▼
  +link: Drupal\Core\Menu\MenuLinkDefault {#261 ▶}
  +subtree: []
  +depth: 1
  +hasChildren: true
  +inActiveTrail: false
  +access: null
  +options: []
}
解决方法

方法一:加载前通过参数指定展开目标菜单

在加载菜单树前,修改MenuTreeParameters对象,将目标菜单链接ID加入expanded数组,加载时会自动展开该菜单并加载子树:

// 获取当前路由的菜单参数
$parameters = $menu_link_tree->getCurrentRouteMenuTreeParameters('admin');
// 将目标菜单链接ID加入expanded列表(替换为实际的链接ID,比如system.admin)
$parameters->expanded[] = 'system.admin';
// 加载菜单树
$tree = $menu_link_tree->load('admin', $parameters);
$admin_link = reset($tree);
// 此时$admin_link的subtree已加载,expanded状态生效
dpm($admin_link);

方法二:加载后手动设置并补全子树

如果已经完成菜单树加载,可直接修改MenuLinkTreeElement的expanded属性,并手动加载子树:

$parameters = $menu_link_tree->getCurrentRouteMenuTreeParameters('admin');
$tree = $menu_link_tree->load('admin', $parameters);
$admin_link = reset($tree);

// 设置expanded属性为1
$admin_link->expanded = 1;
// 手动加载子树并赋值
$admin_link->subtree = $menu_link_tree->loadSubtree($admin_link->link->getPluginId());

dpm($admin_link);

方法三:永久保存菜单展开状态

如果需要让菜单链接默认展开(状态保存到数据库),可通过菜单链接管理器修改并保存配置:

// 获取菜单链接管理器服务
$menu_link_manager = \Drupal::service('plugin.manager.menu.link');
// 创建目标菜单链接的插件实例(替换为实际链接ID)
$menu_link = $menu_link_manager->createInstance('system.admin');
// 更新expanded状态并保存
$menu_link->updateLink(['expanded' => 1], true);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:25:19