2009-11-23 55 views
1

不活动的任务标签有什么办法,以显示本地任务的用户,如果他们不具备必要的权限?现在看来,Drupal只是将它们排除在页面代码之外。我想向他们展示,但使用不同的CSS类。如何显示在Drupal

的Drupal的版本是5.20

回答

4

即使有相关的Drupal 5和6之间的本地任务的建筑一定的差异,Mac是正确的逻辑忽略条目不被当前用户访问是相当深深嵌入menu.inc功能。如果你想寻找自己,从theme_menu_local_tasks()开始,并从那里进行功能调用。

如果我不得不实现你要找的功能,我宁愿避免乱搞直接菜单访问设置了Mac建议。相反,我会用定制版本覆盖theme_menu_local_tasks(),并在那里复制条目检索逻辑。第一次运行会像以前一样获取主要和次要链接,第二次将执行相同的操作,而impersonating another user(在这种情况下可能是用户1)。这样,我会得到两个版本的本地任务标记,然后我需要以某种方式进行区分以找到当前用户不允许的标记,因此需要额外的CSS类。

请注意,这样做仍然有点难看,因为menu_primary_local_tasks()menu_secondary_local_tasks()已经返回主题列表,所以比较需要在标记上工作,可能会以某种方式解析li标签。因此,花费一些时间尝试做同样的事情(获取两个不同用户的本地任务)可能是值得的,但在主题化之前使用较低级别的函数获取条目。

注意:如果你最终使用user impersonation logic,请务必使用模拟过程中禁用会话储蓄的安全,第二个版本。

+0

谢谢,就这么做。有效。用户模仿不是必需的,但是感谢链接。 – 2009-11-24 11:53:27

+1

我也喜欢这种方法。我看到的比我之前提出的最大的优点是,这个比例更好:因为标记是由某种“差异”函数生成的,而不是通过文本内容选择菜单项,所以应用此解决方案会更快如果你需要调整的菜单数量增加。它也不依赖于js/jQuery(虽然几乎每个浏览器都支持它),这对于您的页面能够正确显示更“依赖”。 – mac 2009-11-24 15:31:36

3

我知道D6版hook_menu比D5的要好得多。但是 - 您无法覆盖该行为,因为它在menu.inc中进行了硬编码。

如果我有什么上面,一个解决办法(相当不雅,我必须承认)右可能是:

  1. 取下菜单项的访问控制,让所有的菜单项都可见所有用户。在回调
  2. 认沽访问控制直接(你会做的标签不可点击的瞬间,但如果用户直接将URL,这将阻止访问,他们必须看不到页)。
  3. 在显示选项卡的页面中,根据用户具有的角色加载不同的js文件。具有有限访问权的用户的js文件将通过文本内容的方式选择标签(至少在D6标签中不会获得任何“个人”类:它们只会获得一个共同的“标签”),它将删除指向制表符用户没有访问权限,它会将自定义类添加到应以不同方式显示的那些制表符。
  4. 为您的自定义类添加CSS主题。

如前所述,我不太了解D5,所以它可能也会证明你可以用更简洁的方式实现你想要的东西!

+2

+1 - 我会用另一种方法(如在一个单独的答案提出的),只是为了防止需要添加访问检查所有受影响的菜单回调,这将是繁琐的维护。但是这个版本是一个有效的选择,并且可以更容易/更适合于具有较少通用调整需求的情况。 – 2009-11-24 15:36:43