不允许用户删除节点但允许通过Views Bulk Operations删除

时间:2010-09-11 09:50:09

标签: drupal views bulk operations drupal-rules

我有以下情况:

  • 编辑器角色应该 删除节点。因此相应 在...中取消选择权限 权限页面。
  • 然而编辑 应该能够删除节点 来自Views Bulk operations。运用 创建一个名为动作的规则 检查事情的“安全删除” 如果节点未发布等 在删除节点之前。

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

我确信这是主流要求,但我似乎无法找到解决方案。

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

4 个答案:

答案 0 :(得分:2)

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

  • 有一个函数my_module_can_delete($user),如果允许用户删除,则返回TRUE,如果用户不允许,则返回FALSE
  • 实现hook_form_alter()以修改和删除node_edit表单上的按钮,如果my_module_can_delete($user)
  • 实现hook_form_alter()以修改在/ node /%nid / delete上调用的确认表单,并在那里添加一条消息,告诉用户他或她my_module_can_delete($user)。这应该足够了,因为禁用此表单将导致用户无法通过此表单。 FORM-API会处理这个问题。

但是,您可以使其更加坚固,以捕获其他删除模块:

  • 实现hook_nodeapi()$op == 'delete'以捕获删除操作并暂停(通过调用drupal_goto(),或调用drupal_access_denied()来强制执行用户错误。仅捕获删除操作如上所述,referer是delete-confirm-form。或者,更安全,将您的VBO操作列入白名单并在所有其他引用者上返回false。通常可以通过读出传递给{{1}的$节点来找到引用者}。

A,恕我直言,更清洁,但可能更强烈替代,只需确保在每次删除操作时调用您的批次/操作。

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

答案 1 :(得分:1)

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

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

2)我没有调查过,但我确定可能有一个规则或触发器/动作组合,当为其分配'待删除'标志时,它将取消发布节点。这将删除节点从偶然的角度来看。

3)然后设置一些cron运行活动(触发器/操作或规则)来删除在其上设置“待删除”标志的节点,或者让其他具有更高权限的用户偶尔进入并删除标记的项目

通过这种方式,您实际上并没有绕过权限系统,但仍然会从您的网站中删除。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我没有一个好的无编码解决方案,我不确定我会称这个解决方案“很棒” - 但是一种方法可能是使用form_alter挂钩实现一个简单的模块,从而删除删除按钮节点在构建时编辑表单。

一般来说,这个角色或者有权删除节点或者没有删除节点,并且像这样一直在进行修改,你可能不那么健壮。