我有以下情况:
问题是视图批量操作尊重节点权限。由于未获得该许可,编辑将无法删除该节点。在VBO中执行该操作时,编辑器是否可以成为更高级别的角色用户(作为sudo)?或者有没有办法告诉VBO忽略此操作的节点访问?
我确信这是主流要求,但我似乎无法找到解决方案。
不涉及编程的解决方案将是首选。
答案 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挂钩实现一个简单的模块,从而删除删除按钮节点在构建时编辑表单。
一般来说,这个角色或者有权删除节点或者没有删除节点,并且像这样一直在进行修改,你可能不那么健壮。