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

Php Drupal6:我可以通过函数调用而不仅仅是预处理函数将变量传递给节点模板吗?,php,drupal,drupal-6,Php,Drupal,Drupal 6,我正在一个网站上工作,我碰巧需要将节点模板的整个输出(对于一些内容类型)嵌入到其他各种模板中。大多数情况下都是将节点(在nodereference CCK字段中选择)嵌入到视图模板中,因此我目前的方法是: 在视图设置中:直接添加noderef字段作为要输出的字段之一(而不是使用关系使引用节点的字段可访问) 将字段输出的格式设置为“full node”——我发现它打印整个节点模板 这很好,但是:节点模板中使用了一些重要的变量。我所知道的唯一设置这些的方法是通过一个预处理函数,它可以工作。。。这

我正在一个网站上工作,我碰巧需要将节点模板的整个输出(对于一些内容类型)嵌入到其他各种模板中。大多数情况下都是将节点(在nodereference CCK字段中选择)嵌入到视图模板中,因此我目前的方法是:

  • 在视图设置中:直接添加noderef字段作为要输出的字段之一(而不是使用关系使引用节点的字段可访问)
  • 将字段输出的格式设置为“full node”——我发现它打印整个节点模板
这很好,但是:节点模板中使用了一些重要的变量。我所知道的唯一设置这些的方法是通过一个预处理函数,它可以工作。。。这种方法的麻烦之处在于,在预处理函数中,我必须(通过任何可以访问的方法)检测模板输出将嵌入的位置,以便可以适当地设置变量

我想做什么:

直观地说,在我的各种视图模板中调用一个函数更有意义:a)允许我打印整个节点模板,b)传入预处理变量的值。有人知道可以实现这一点的函数吗,或者知道替代方法吗

[到目前为止,我还没有想到:

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


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

好吧,还有hook_nodeapi('op='view'),如果你想更改现有元素,你给你的模块一个很高的权重以便最后调用它。要知道何时要自定义某些内容,可以在节点对象上设置自定义标志,如
$node->yourmodule\u inside\u view\u noderef=TRUE
,然后将其传递给node\u view()

在Drupal7中,有所谓的$view_模式概念,而不仅仅是一个布尔标志来显示摘要或不显示摘要


您可以通过定义自己的视图模式,下面是userpoints\u nodeaccess中的一个示例:。这允许您根据hook\u node\u view/hook\u node\u view\u alter中的view\u模式做出反应,还允许您自定义显示节点时应如何显示哪些字段以及应使用哪些view\u模式,而无需自定义代码。

听起来您同意这感觉不对。我想了解更多关于页面的内容以及节点之间的关系,以便我们能够帮助您提出一个更精简的解决方案。@mirzu我们有一种内容类型,它可以作为多个可能的图像源(作为不同的CCK字段)的包装器。此类型的节点模板通过级联运行,检查填充的源字段,并处理图像大小调整。图像大小和其他几个选项由预处理变量处理。因此,许多其他内容类型具有指向这些图像节点之一的noderef字段;因此需要嵌入图像节点的完整模板输出。也许更容易将大小调整抽象为模块中的函数,然后在预处理中为此视图或节点本身调用这些函数。@mirzu是的,这种方法对我来说也会更好,但不幸的是,根据图像来自哪个来源,调整大小的处理方式有所不同——有时甚至是外部处理。。。(我总是想知道,当我阅读论坛时,人们是如何进入奇怪的用例场景的……我自己也在这里!)事实上,在$node上附加一个自定义标志可能就是我所需要的。想到的过程:视图模板中的nid->node_load()it->根据上下文存储标志->预处理函数根据标志设置变量(可能会取消设置标志以避免冲突)。那么我甚至不需要hook_nodeapi()。这在我的头脑中起作用——如果进展顺利,我会很快尝试并接受答案。非常感谢。最终解决方案:视图中的nid模板->节点\加载()它->使用与预处理变量名称匹配的键将选项数组存储到$node->在预处理函数中,数组\合并()此选项数组与$vars->取消设置选项数组以清理$node。“真是太棒了,谢谢你了,@Berdir。(顺便说一句,我仍然在开发w/Drupal6,所以还没有研究Drupal7,但是视图模式的想法听起来不错。)