如何在节点下隐藏注释,而不关闭它们?


8

Аctually我想自己列出节点的评论(例如,通过Views),所以我需要从核心评论模块中隐藏标准评论列表。我可以这样:

  unset($node['comments']['comments']);

但这不会阻止数据库查询注释。
因此,我发现了一些疯狂的方法来欺骗注释模块。例如,设置假$node->preview属性,或创建新的视图模式并覆盖标准node/%node回调。

将评论隐藏在节点下,但仍然允许添加新评论真的难吗,还是我错过了什么?

更新有关“隐藏”选项的信息

内容类型的“隐藏”值如何:
我需要评论的关闭/打开行为。但是,如果我为我的内容类型设置了“隐藏”,我的新内容将设置为“已关闭评论”,而不是隐藏的(这里是代码)。另一个问题是,如果注释是隐藏的,则具有“发布注释”权限的用户无法添加注释(这是代码)。
所以我不知道这个主意。

回答

找到的解决方案hook_module_implements_alter()。非常感谢!


它很容易...编辑内容类型,在评论设置下选择“隐藏”。这将隐藏您的评论
subhojit777 '04

@ subhojit777 OP我想防止数据库查询。
niksmac 2012年

Answers:


9

在modules / comment / comment.module中,我们可以看到hook_node_view()(comment_node_view())在614行上运行。这是函数触发加载所有注释并将它们附加到节点的地方。前两组if(){...}似乎正在处理添加注释表单和操作链接。然后,最后的代码块最终添加了注释,我认为这实际上是您最关心的隐藏问题,并且我想出于性能原因,您希望跳过此注释:

// Only append comments when we are building a node on its own node detail
// page. We compare $node and $page_node to ensure that comments are not
// appended to other nodes shown on the page, for example a node_reference
// displayed in 'full' view mode within another node.
if ($node->comment && $view_mode == 'full' && node_is_page($node) && empty($node->in_preview)) {
  $node->content['comments'] = comment_node_page_additions($node);
}

我认为这段代码很愚蠢,因为注释模块不应依赖于任何特定的硬编码视图模式。希望这会改变并成为用户界面中的设置。

无论如何,我发现了一个类似的帖子,您可能会感兴趣:有没有办法阻止comment_node_view触发?

基本上,您想使用hook_module_implements_alter()来阻止注释模块能够触发hook_node_view()。这是您需要添加到自定义模块中的内容:

function hook_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'node_view') {
    unset($implementations['comment']);
  }
}

1
非常感谢你!特别适合hook_module_implements_alter
kalabro 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.