我正在开发一个网站,我碰巧需要将节点模板的整个输出(针对几种内容类型)嵌入到其他各种模板中。大多数情况是将节点 - 在节点参考CCK字段中选择 - 嵌入到视图模板中,因此我目前的方法是:
这很好,但是:节点模板中使用了一些重要的变量。我已经知道设置这些的唯一方法是通过预处理函数,它确实有效...这个方法的烦恼是在预处理函数中我必须检测(通过那里可访问的任何东西)模板输出将在哪里嵌入,所以我可以适当地设置变量。
我想做的是:
直观地说,能够在我的各种视图模板中调用函数会更有意义:a)允许我打印整个节点模板,以及b)传入预处理变量的值。有没有人知道可以做到这一点的函数,还是另一种方法?
[迄今为止的想法并没有让我任何地方:
我知道在类似的情况下,你可以根据将被调用的特定主题函数的签名将选项作为参数传递给theme()。但是node_view()没有提供这种能力 - 而node_view()似乎是调用节点模板而不是主题('node',...)的正确函数。
我看到node_view()使用'alter'作为$ op调用hook_nodeapi(),但这在游戏中发生得太晚了;到那时节点内容已经是HTML格式(即$ node-> body)。]
答案 0 :(得分:0)
好吧,有hook_nodeapi($ op ='view'),如果你想改变现有的元素,你给你的模块一个很高的权重,以便最后调用它。要知道何时要自定义某些内容,您可以在节点对象上设置自定义标志,例如$node->yourmodule_inside_view_noderef = TRUE
,然后再将其传递给node_view()。
在Drupal 7中,有一个所谓的$ view_mode概念,而不仅仅是一个布尔标志来显示预告片。
您可以通过hook_entity_info()定义自己的view_modes,以下是来自userpoints_nodeaccess:userpoints_nodeaccess_entity_info的示例。这允许您基于hook_node_view / hook_node_view_alter中的view_mode做出反应,但也允许您自定义应显示哪些字段以及在显示节点时应使用哪个view_mode而无需自定义代码。