Opigno 3用户菜单模板位置查询:需删除不可配置菜单项
Opigno 3 删除硬编码用户菜单元素的解决方案
一、定位硬编码菜单的核心位置
Opigno基于Drupal框架,硬编码的用户菜单通常集中在以下区域:
- Opigno核心模块:优先排查
opigno_user、opigno_core这类核心模块的.module或.theme文件,搜索user_menu、page_attachments、menu_link这类关键词,多数硬编码菜单是在模块内直接构建的。 - 主题预处理函数:别只局限于模板文件,主题的
.theme文件中,hook_preprocess_page()这类函数常用来硬插入菜单元素,比如往页面头部的用户菜单数组中追加项目。 - 自定义/第三方模块:如果是后期扩展的功能,检查站点内的自定义模块或第三方扩展模块的相关文件。
二、精准定位的实用技巧
- 安装Devel模块,在页面预处理函数中用
kint($variables['page'])打印页面变量,找到用户菜单对应的数组,查看其来源标识,可直接定位到生成菜单的函数或模块。 - 全局搜索:在站点根目录执行命令
grep -r "你要删除的菜单文本" modules/opigno/,将引号内的内容替换为实际菜单文字,能直接定位到代码所在的文件及行号。 - Drush工具辅助:执行
drush hook-info --group=menu列出所有菜单相关钩子,再搜索这些钩子的实现代码,排查哪个模块在硬编码添加菜单项。
三、删除菜单元素的两种方法
- 临时修改源码(不推荐):找到硬编码的代码块后,直接注释或删除对应菜单项,但模块更新后修改内容会被覆盖,仅适合临时测试场景。
- 钩子重写(推荐):创建自定义模块,通过钩子移除菜单元素,不会受模块更新影响:
- 若为普通菜单链接,使用
hook_menu_links_discovered_alter():function my_custom_module_menu_links_discovered_alter(&$links) { // 替换为目标菜单链接的机器名,可通过Devel查看获取 unset($links['opigno_user.hardcoded_menu_item']); } - 若为用户页面的标签类本地任务,使用
hook_menu_local_tasks_alter():function my_custom_module_menu_local_tasks_alter(&$data, $route_name) { if ($route_name == 'user.page') { foreach ($data['tabs'][0]['output'] as $key => $tab) { if ($tab['#link']['title'] == '要删除的菜单文本') { unset($data['tabs'][0]['output'][$key]); } } } }
- 若为普通菜单链接,使用
内容的提问来源于stack exchange,提问作者mr.avatar
相关产品推荐
相关产品推荐

