4

我有以下情况:

  • 不应允许编辑角色删除节点。因此,在权限页面中取消选择相应的权限。
  • 但是,编辑器应该能够从 Views Bulk 操作中删除节点。使用规则创建一个称为“安全删除”的操作,该操作在删除节点之前检查节点是否未发布等。

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

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

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

4

4 回答 4

2

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

  • 有一个函数,如果允许用户删除,则my_module_can_delete($user)返回,如果不允许。 TRUEFALSE
  • 实现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。通常可以通过读取传递给的 $node 来找到引用者hook_nodeapi()

A,恕我直言,更清洁,但可能更密集的替代方案是简单地确保在每个删除操作上调用您的批处理/操作。

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

于 2010-09-27T15:11:22.967 回答
1

好吧,在我看来,您确实有一个设置,您不希望编辑角色用户删除内容,真的,除非在某些极端情况下。这是我的建议:

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

2)我还没有调查过,但我确定可能有一个规则或触发器/操作组合在分配了“待删除”标志时会取消发布该节点。这将从临时视图中删除该节点.

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

这样,您实际上并没有绕过权限系统,但仍然会从您的站点中删除内容。

于 2010-09-27T15:18:23.030 回答
1

我被困了一段时间,直到我注意到“actions_permissions”模块,启用它并在“权限”页面上,您可以按角色提供对特定操作的访问权限。

于 2011-11-07T11:19:29.967 回答
0

我没有一个好的无编码解决方案,我不确定我是否会称这个解决方案“很棒” - 但一种方法可能是使用 form_alter 钩子实现一个简单的模块,从节点编辑中删除删除按钮形成它们的形式。

一般来说,角色似乎要么有权删除节点,要么没有删除节点的权限,而且像这样到处乱跑会不像你喜欢的那样健壮。

于 2010-09-12T04:37:19.977 回答