如何通过hook_menu找到哪个模块在Drupal中创建了特定的菜单项

时间:2014-03-23 15:31:24

标签: drupal-7

如果我知道菜单项的路径有一个快速的方法来找到定义特定菜单项的模块?

2 个答案:

答案 0 :(得分:0)

menu_link数组有一个名为“module”的键,您可以使用该键来了解哪个模块添加了一个链接。

如果您要搜索的路径没有动态部分,那么db_query('SELECT mlid FROM {menu_links} WHERE link_path = :link_path',array(':link_path' => 'some/drupal/path'))->fetchField();之类的内容将帮助您找到可以与menu_link_load()一起使用的mlid,以获取完整的菜单项数组并检查'模块'键。

不幸的是,当模块通过hook_menu()添加新路径时,'module'值被设置为'system',所以你不能通过这样做知道哪个模块真正添加了它。

我想到的唯一其他解决方案是使用module_implements()来发现哪些模块正在使用hook_menu()向菜单添加路径,然后手动调用它们的hook_menu()实现并将返回的值迭代到看看你是否能找到路径,就像menu_router_build()一样。但是,这并没有考虑到其他模块可能会改变菜单的事实,除非你也手动调用hook_menu_alter()。

如果您搜索的路径包含动态部分(例如node / 3 ,或者user / 1 ),则可以使用menu_get_item()获取路径字符串,在定义该路径的模块的hook_menu()中公开,并与第二个解决方案一起使用,以获取相关模块。

答案 1 :(得分:0)

恕我直言,我想到的最简单的方法是在源代码中搜索路径。不要忘记用%来替换你知道的动态路径段。