How do I decide between theme('node', $node) and drupal_render($node->content) for programmatic $node output

别来无恙 提交于 2019-12-21 16:22:39

问题


Given a $node, I'm trying to decide between the following two ways of outputting that $node.

either

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

or

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

They both seem to give similar results, but is there something I should consider before I choose one way over the other?


回答1:


Your output is similar if there are no other modules and themes altering the output via the theme layer.

But! If you bypass the theme layer, you'll probably start experiencing unexpected behaviour when you install modules or themes and change config settings that use the theme layer to alter the node's output.

In short, by bypassing the theme layer, you're building error into your application. These error are likely to occur after you hand your application over to someone (a client perhaps) who starts changing settings in admin/

See the decorator pattern if you're interested. Drupal uses this extensively.

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




回答2:


Well, sortof.

What you really want is

$output = node_view($node);

if you just call node_build_content, and then call theme('node', $node), hook_nodeapi('alter') is never called, nor is hook_link().

So if any module is expecting to alter the built node, it wont get a chance to, and if there is supposed to be links on it they wont be there either.

Additionally you can call $output = node_view($node, FALSE, FALSE, FALSE); which gives you the node without the links.

See the documentation for node_view().




回答3:


If you look into the source of drupal_render(), it actually calls theme() itself as well (provided a #theme override is provided).




回答4:


In Drupal 7, you should do :

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



回答5:


The solution that worked here was a combination of both of these techniques. Just using theme('node', $node); doesn't seem to work without the help of node_build_content($node);.

Here is the result of an example only using theme('node', $node);.

But if we first do node_build_content($node); prior to handling the $node to the theme function, you can see that the form button is also rendered.

Therefore, the real solution is:

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



回答6:


First is recommended, as it is passed via the theme layer.



来源:https://stackoverflow.com/questions/3886898/how-do-i-decide-between-themenode-node-and-drupal-rendernode-content-f

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!