【发布时间】:2010-10-08 00:29:28
【问题描述】:
给定$node,我正在尝试在以下两种输出该 $node 的方式之间做出决定。
任一
$output = theme('node', $node);
或
node_build_content($node);
$output = drupal_render($node->content);
它们似乎都给出了相似的结果,但是在我选择一种方法而不是另一种方法之前我应该考虑什么?
【问题讨论】:
给定$node,我正在尝试在以下两种输出该 $node 的方式之间做出决定。
任一
$output = theme('node', $node);
或
node_build_content($node);
$output = drupal_render($node->content);
它们似乎都给出了相似的结果,但是在我选择一种方法而不是另一种方法之前我应该考虑什么?
【问题讨论】:
如果没有其他模块和主题通过主题层更改输出,则您的输出是相似的。
但是!如果您绕过主题层,当您安装模块或主题并更改使用主题层来更改节点输出的配置设置时,您可能会开始遇到意外行为。
简而言之,通过绕过主题层,您将错误构建到应用程序中。在您将应用程序移交给开始在管理员中更改设置的人(可能是客户)之后,这些错误可能会发生/
如果您有兴趣,请查看装饰器模式。 Drupal 广泛使用它。
【讨论】:
嗯,有点。
你真正想要的是
$output = node_view($node);
如果您只是调用 node_build_content,然后调用 theme('node', $node),则永远不会调用 hook_nodeapi('alter'),也不会调用 hook_link()。
因此,如果任何模块期望更改已构建的节点,它就没有机会这样做,并且如果应该有链接,它们也不会在那里。
此外,您可以调用$output = node_view($node, FALSE, FALSE, FALSE);,它会为您提供没有链接的节点。
请参阅node_view() 的文档。
【讨论】:
如果您查看drupal_render() 的源代码,它实际上也会调用theme() 本身(前提是提供了#theme 覆盖)。
【讨论】:
在 Drupal 7 中,您应该这样做:
$elements = node_view($node, 'teaser');
$rendered_node = drupal_render($elements);
【讨论】:
这里有效的解决方案是这两种技术的结合。没有node_build_content($node); 的帮助,仅仅使用theme('node', $node); 似乎是行不通的。
这是仅使用theme('node', $node); 的示例的结果。
但是如果我们在处理 $node 到主题函数之前先做node_build_content($node);,你可以看到表单按钮也被渲染了。
因此,真正的解决方案是:
node_build_content($node);
$output = theme('node', $node);
【讨论】:
推荐首先,因为它是通过主题层传递的。
【讨论】: