我需要创建一个菜单项,如果用户有特定条件,它会更改其标题和链接。Drupal 缓存了所有的菜单,所以我真的想不出办法来做到这一点。
例如,用户有一个节点附加到他的配置文件,菜单项是“创建 blabla”(链接节点/添加/blabla)用户没有节点,菜单项是“创建 notblablabla”(链接节点/添加/notblabla)
最好和最简单的方法是hook_menu
与 param一起使用title_callback
。
Drupal 不允许动态菜单项,但如果不允许用户去那里,它可以隐藏某些菜单项。参考您的示例,如果您创建两个链接并使用权限系统将这些节点类型的创建限制为某些角色,则 Drupal 将仅在用户具有所需角色时显示菜单项。也许这对您的情况有所帮助。
其他选项包括:
我可能会创建两个菜单项,并使用主题系统根据条件隐藏其中一个。
已经有一段时间了,但我会看看:
一个简单的方法是使用 JavaScript。您可以使用 jQuery 轻松更改 HTML。这将要求您的用户启用 JS,因此这不是一个完美的解决方案。
另一种选择是有一个菜单项,该菜单项链接到您在模块中创建的 url。他可以做条件检查,将用户重定向到他应该被重定向到的任何 url。此方法的唯一问题是更改菜单项的标题。但是您也许可以对这两种情况给出合适的描述。您也可以使用 JS 更改链接的名称。这样,您可以在没有 JS 的情况下保持功能完整,但启用它后可以改善用户的 UI。
您是否尝试过(当然也将您的其他条件插入到“if”语句中):
function hook_translated_menu_link_alter(&$item, $map) {
if ($item['href'] == 'node/add/blabla') {
$item['href'] = 'node/add/notblabla';
}
}
您可能还必须这样做才能将链接标记为可更改:
function hook_menu_link_alter(&$item, $menu) {
if ($item['link_path'] == 'node/add/blabla') {
$item['options']['alter'] = TRUE;
}
}
由于此菜单项似乎基于用户配置文件信息,我建议编写一个简单的模块来实现hook_menu_alter()
根据您的条件更改菜单。然后,您可以在用户配置文件更改时调用menu_cache_clear()
内部hook_user()
更新菜单缓存。