我有以下情况:
- 编辑者角色不应被允许 删除节点。因此相应的 权限被取消选择 权限页面。
- 但是编辑 应该能够删除节点 来自 View 批量操作。使用 创建 Action 的规则称为 “安全删除”检查诸如 如果节点未发布等。 在删除节点之前。
问题是 View 批量操作尊重节点权限。编辑者将无法删除该节点,因为他没有获得该权限。有没有办法让编辑器在 VBO 中执行该操作时可以成为更高角色的用户(类似于 sudo)?或者有没有办法告诉 VBO 忽略此操作的节点访问?
我确信这是主流要求,但我似乎找不到解决方案。
不涉及编程的解决方案将是首选。
最佳答案
简单但不太干净的方法是您已经采取的路线,但有一个额外的小模块来帮助它。
- 有一个函数
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()
强制执行用户错误。仅当引用者是上述删除确认表单时才捕获删除操作。或者,更安全的是,将您的 VBO 操作列入白名单并返回 false所有其他引用者。通常可以通过读出传递给hook_nodeapi()
的 $node 来找到引用者。
A,恕我直言,更干净,但可能更密集替代方案,就是简单地确保在每个删除操作上调用您的批处理/操作。
在模块中,您可以通过避免所有 VBO 配置并保留所有额外删除操作来实现此目的。
然后编写一个实现 hook_nodeapi()
的模块,然后从那里调用所有清理操作。这样您就可以确保任何节点上的每个删除操作都会调用您的删除操作。显然,您可以在 hook_nodeapi() 中添加一些条件,以便仅在某些情况下调用您的模块(节点类型、用户角色、权限等)。
关于drupal - 不允许用户删除节点,但允许通过 View 批量操作删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3690519/