2010-09-11 74 views
4

我有以下情形:不允许用户删除一个节点,但允许通过浏览批量操作删除

  • 编辑角色应该允许 删除节点。因此,在 权限页面中取消选择相应的 权限。
  • 但是编辑器 应该能够从视图批量操作中删除节点 。使用 规则创建一个动作,称为 “安全删除”,如果在删除节点之前未发布节点等 ,则会检查诸如 之类的内容。

问题是视图批量操作尊重节点权限。编辑器将无法删除该节点,因为他没有获得该权限。在VBO中执行该操作时,编辑器是否可以成为更高级角色的用户(如某种sudo)?或者有没有办法告诉VBO忽略此操作的节点访问?

我确定这是一个主流需求,但我似乎无法找到解决方案。

不涉及编程的解决方案将是首选。

回答

2

简单但并不那么干净的方式就是你已经采用的路线,但还有一个额外的小模块来帮助它。

  • 具有功能my_module_can_delete($user),如果用户被允许删除,FALSE如果用户不返回TRUE
  • 实现hook_form_alter()如果my_module_can_delete($user)
  • 实现hook_form_alter()修改那个叫/节点上的确认表格/%NID /删除,并添加一条消息出现,告诉用户修改和删除node_edit窗体上的按钮,他或她my_module_can_delete($user)。这应该足够了,因为禁用此表单将导致用户无法通过此表单。 FORM-API会照顾到这一点。

但是,您可以使其更坚固,赶上其他删除模块:

  • 实现hook_nodeapi()$op == 'delete'赶上删除操作和停止(通过调用drupal_goto(),或致电drupal_access_denied()强制执行用户错误。仅捕获删除-行动,如果引用者是删除,确认形式如上所述。或者,更安全,白名单您的VBO行动和所有其他参照网址返回false。引荐来源往往可以通过读出$找到节点传递到hook_nodeapi()

A,恕我直言,更清洁,但可能更密集替代,是简单地确保您的批次/行动呼吁每个删除操作。

在一个模块中,您可以通过避免所有VBO配置并将所有额外删除操作离开那里来完成此操作。 然后编写一个实现hook_nodeapi()的模块,然后从那里调用所有清理操作。这样,您可以确定您的删除操作是在任何节点上的每个删除操作上调用的。显然你可以在你的hook_nodeapi()中添加一些条件来在某些情况下调用你的模块(节点类型,用户角色,权限等)。

0

我没有一个良好的无编码解决方案,我不知道我会叫这个解决方案“伟大” - 只有一种解释可能是实现具有form_alter挂钩,消除删除按钮的简单模块从节点编辑表单开始。

一般来说,好像角色要么有权删除节点或没有,胡闹周围像这样将是不太可靠的,你可能会喜欢。

+0

我考虑过这个,但是使用URL/node/[nid]/delete也会删除节点。所以虽然按钮可能不在那里,删除仍然是可能的。谢谢你的时间,但! – 2010-09-12 06:44:39

1

好吧,在我看来,你已经有了一个设置,你不希望编辑角色的用户删除东西,除非在某些极端情况下。这是我的建议:

1)安装标志模块。创建一个只能由编辑角色人员分配的“待删除”标志。

2)我还没有看过它,但我确定有可能是一个规则或触发/动作组合,当将'删除'标志分配给它时,它将取消发布节点。节点从临时视图

然后或者设置某些cron运行活动(触发/操作或规则)以删除其上设置了“要删除”标记的节点,或者让其他具有较高权限的用户偶尔进入并删除标记的项目

这样你实际上并没有绕过权限系统,但仍然是从你的网站上删除东西

+1

唯一的问题可能是cron在大多数安装中以匿名用户身份运行,并且我不记得cron是否尊重权限。 – mirzu 2010-09-29 20:34:18

1

我被抓住了一段时间,直到我注意到“actions_permissions”模块,启用此功能并在Permissions页面上,您可以提供对角色的角色基础上的特定操作的访问权限。

+0

你使用过这个模块吗?那么是否有人能够通过VBO删除节点,而无法通过正常节点删除节点 - 编辑 - 删除方法? – 2011-11-12 14:45:58

相关问题