【问题标题】:Drupal 6: can I pass variables to a node template by function call, not just by preprocess functions?Drupal 6:我可以通过函数调用将变量传递给节点模板,而不仅仅是通过预处理函数吗?
【发布时间】:2011-03-31 05:02:31
【问题描述】:

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

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

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

我想做什么:

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

[到目前为止还没有让我想到任何地方:

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

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

【问题讨论】:

  • 听起来你同意这感觉不对。 . .我想详细了解页面是什么以及节点之间的关系,以便我们帮助您提出更简化的解决方案。
  • @mirzu 我们有一个内容类型,它充当多个可能的图像来源(作为不同的 CCK 字段)的包装器。这种类型的节点模板通过级联运行,检查填充了哪个源字段,并且还处理图像大小。图像大小和其他几个选项由预处理变量处理。因此,许多其他内容类型的 noderef 字段指向这些图像节点之一;因此需要嵌入图像节点的完整模板输出。
  • 也许将调整大小抽象为仅在模块中的函数会更容易,然后在此视图或其自身节点的预处理中调用这些函数。
  • @mirzu 是的,这种方法对我来说也会感觉更好,但不幸的是,调整大小的处理方式不同 - 有时甚至在外部 - 取决于图像来自哪个来源......(我总是想知道如何当我阅读论坛时,人们会遇到奇怪的用例场景……而我自己就在这里!)

标签: php drupal drupal-6


【解决方案1】:

嗯,有 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,而无需自定义代码。

【讨论】:

  • 实际上,在 $node 上附加一个自定义标志可能就是我所需要的。想到的过程:视图模板中的nid -> node_load() it -> 根据上下文存储标志 -> 预处理函数根据标志设置变量(并且可能取消设置标志以避免冲突)。然后我什至不需要 hook_nodeapi()。这在我的脑海中起作用 - 如果进展顺利,将很快尝试并接受答案。谢谢!
  • 最终解决方案:视图模板中的 nid -> node_load() 它 -> 将选项数组存储到 $node ,其键与预处理变量名称匹配 -> 在预处理函数中,array_merge() 此选项数组使用 $vars -> 取消设置选项数组以清理 $node。很棒的想法,谢谢@Berdir。 (顺便说一句,我仍然完全致力于开发 w/Drupal 6,所以还没有研究过 Drupal 7,但是 view_mode 的想法听起来不错。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多