Drupal 6:我可以通过函数调用将变量传递给节点模板,而不仅仅是通过预处理函数吗?

时间:2011-03-30 19:54:57

标签: php drupal drupal-6

我正在开发一个网站,我碰巧需要将节点模板的整个输出(针对几种内容类型)嵌入到其他各种模板中。大多数情况是将节点 - 在节点参考CCK字段中选择 - 嵌入到视图模板中,因此我目前的方法是:

  • 在视图设置中:将noderef字段直接添加为要输出的字段之一(而不是使用关系使得引用的节点的字段可访问)
  • 将字段输出的格式设置为“完整节点” - 我发现它打印整个节点模板

这很好,但是:节点模板中使用了一些重要的变量。我已经知道设置这些的唯一方法是通过预处理函数,它确实有效...这个方法的烦恼是在预处理函数中我必须检测(通过那里可访问的任何东西)模板输出将在哪里嵌入,所以我可以适当地设置变量。

我想做的是:

直观地说,能够在我的各种视图模板中调用函数会更有意义:a)允许我打印整个节点模板,以及b)传入预处理变量的值。有没有人知道可以做到这一点的函数,还是另一种方法?

[迄今为止的想法并没有让我任何地方:

我知道在类似的情况下,你可以根据将被调用的特定主题函数的签名将选项作为参数传递给theme()。但是node_view()没有提供这种能力 - 而node_view()似乎是调用节点模板而不是主题('node',...)的正确函数。

我看到node_view()使用'alter'作为$ op调用hook_nodeapi(),但这在游戏中发生得太晚了;到那时节点内容已经是HTML格式(即$ node-> body)。]

1 个答案:

答案 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而无需自定义代码。