鉴于$node
,我试图在以下两种输出该$节点的方式之间做出决定。
或者
$output = theme('node', $node);
或
node_build_content($node);
$output = drupal_render($node->content);
他们似乎都给出了类似的结果,但在我选择一种方式而不是另一种方式之前,我应该考虑一些事情吗?
答案 0 :(得分:7)
如果没有其他模块和主题通过主题图层改变输出,则输出类似。
但是!如果绕过主题层,则在安装模块或主题并更改使用主题层更改节点输出的配置设置时,您可能会开始遇到意外行为。
简而言之,通过绕过主题图层,您将在应用程序中构建错误。将应用程序交给某人(可能是客户端)开始更改admin /
中的设置后,可能会发生这些错误如果您有兴趣,请参阅装饰器模式。 Drupal广泛使用它。
答案 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);
的示例的结果。
但是如果我们在处理主题函数的$节点之前先做node_build_content($node);
,你就可以看到表单按钮也被渲染了。
因此,真正的解决方案是:
node_build_content($node);
$output = theme('node', $node);