如何在主题('node',$ node)和drupal_render($ node->内容)之间决定程序化$ node输出

时间:2010-10-08 00:29:29

标签: drupal drupal-6

鉴于$node,我试图在以下两种输出该$节点的方式之间做出决定。

或者

$output = theme('node', $node);

node_build_content($node);
$output = drupal_render($node->content);

他们似乎都给出了类似的结果,但在我选择一种方式而不是另一种方式之前,我应该考虑一些事情吗?

6 个答案:

答案 0 :(得分:7)

如果没有其他模块和主题通过主题图层改变输出,则输出类似。

但是!如果绕过主题层,则在安装模块或主题并更改使用主题层更改节点输出的配置设置时,您可能会开始遇到意外行为。

简而言之,通过绕过主题图层,您将在应用程序中构建错误。将应用程序交给某人(可能是客户端)开始更改admin /

中的设置后,可能会发生这些错误

如果您有兴趣,请参阅装饰器模式。 Drupal广泛使用它。

http://en.wikipedia.org/wiki/Decorator_pattern

答案 1 :(得分:6)

好吧,排序。

你真正想要的是

$output = node_view($node);

如果您只是调用node_build_content,然后调用theme('node',$ node),则永远不会调用hook_nodeapi('alter'),也不会调用hook_link()

因此,如果任何模块期望改变构建的节点,它将不会有机会,如果它上面应该有链接,它们也不会在那里。

此外,您可以致电$output = node_view($node, FALSE, FALSE, FALSE);,为您提供没有链接的节点。

请参阅node_view()的文档。

答案 2 :(得分:1)

如果您查看drupal_render()的来源,它实际上也会调用theme()本身(前提是提供了#theme覆盖)。

答案 3 :(得分:1)

在Drupal 7中,你应该这样做:

$elements = node_view($node, 'teaser');
$rendered_node = drupal_render($elements);

答案 4 :(得分:0)

首先推荐,因为它是通过主题图层传递的。

答案 5 :(得分:0)

这里有效的解决方案是这两种技术的结合。如果没有theme('node', $node);的帮助,仅使用node_build_content($node);似乎无效。

以下是仅使用theme('node', $node);的示例的结果。

alt text

但是如果我们在处理主题函数的$节点之前先做node_build_content($node);,你就可以看到表单按钮也被渲染了。

alt text

因此,真正的解决方案是:

node_build_content($node);
$output = theme('node', $node);