我hook_node_access()
用来拒绝用户基于自定义条件访问某些节点。但是,如果用户未通过标准,我不希望此内容显示在列出该内容的视图中。有什么方法可以让观点尊重hook_node_access()
实现?
hook_node_access()
不尊重实现的原因。由于这是“设计使然”的,因此报告解决方法很好。
我hook_node_access()
用来拒绝用户基于自定义条件访问某些节点。但是,如果用户未通过标准,我不希望此内容显示在列出该内容的视图中。有什么方法可以让观点尊重hook_node_access()
实现?
hook_node_access()
不尊重实现的原因。由于这是“设计使然”的,因此报告解决方法很好。
Answers:
仅在尝试查看完整节点时才调用hook_node_access()。您需要做的是实现hook_node_access_records()和hook_node_grants()。
视图使用SQL确定要显示的节点。遗憾的是,出于性能方面的考虑,Drupal对所有可能的候选对象执行node_load,然后对所有候选对象都调用hook_node_access完全是不可行的。想象一下一个视图,其中显示了数千个节点(尤其是在使用寻呼机时)。如果逻辑未在SQL中完成,则传呼机将具有非常不寻常的功能,因此Drupal会像rik所提到的那样使用数据库中的访问记录来强制您执行此操作。
进行access_records的工作量还很多,但可以使其与SQL一起使用。因此,我建议尽可能使用现有的node_access模块来解决您的功能,因为它可能会使用访问记录来实现,因此可以与视图一起使用。
通过以下方式将访问记录存储在表node_access表中: 通过每列的注释,您可以了解它们的用途。将领域视为用于节点访问的系统,将gid视为领域内的组。该组可以具有查看,更新和删除权限。通常,每个node_access模块都定义一个或多个领域(有时,多个node_access模块也可以并行工作)。用户在每个领域中都有一个或多个gid。
在Drupal中,所有带有“ node_access”标签的查询将自动添加一些特殊的逻辑。请参阅文档以了解有关标记的更多信息。此特殊逻辑将每个领域的“ node_access”表联接在一起,并添加以下条件:“ gid”等于应用于用户的一个gid时,该用户具有适当的权限。
整个系统允许所有查询正确处理node_access,甚至还可以对查询进行计数等。它非常强大,但是具有比简单的hook_node_access更高的学习曲线。只要有可能,使用现有的node_access模块都可以为您省去很多麻烦。
hook_node_access()
,则应该做的一件事情:更改Views模块代码。