加载菜单树时,如何通过编程设置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
相关产品推荐
相关产品推荐

