2010-10-08 16 views
5

Dado un $node, estoy tratando de decidir entre las dos formas siguientes de generar ese $ nodo.

ya sea

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

o

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

Ambos parecen dar resultados similares, pero hay algo que debería considerar antes de elegir un modo sobre el otro?

Respuesta

7

Su salida es similar si no hay otros módulos y temas que alteran la salida a través de la capa de tema.

¡Pero! Si omite la capa de tema, es probable que comience a experimentar un comportamiento inesperado cuando instale módulos o temas y cambie la configuración de configuración que usa la capa de tema para alterar la salida del nodo.

En resumen, al pasar por alto la capa de tema, está creando errores en su aplicación. Es probable que se produzcan estos errores después de entregarle la aplicación a alguien (quizás un cliente) que comience a cambiar la configuración en admin/

Consulte el patrón del decorador si le interesa. Drupal usa esto extensivamente.

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

+0

¿Cuál de estos no pasa por la capa tema? Lo entiendo como usar theme() que crea el problema de pasar por alto mucho. – JeroenEijkhof

+0

Estoy bastante seguro $ output = drupal_render ($ node-> content); está dando vueltas. – Rimian

0

Primero se recomienda, ya que se pasa a través de la capa de tema.

0

La solución que funcionó aquí fue una combinación de ambas técnicas. Simplemente usando theme('node', $node); no parece funcionar sin la ayuda de node_build_content($node);.

Este es el resultado de un ejemplo que solo usa theme('node', $node);.

alt text

Pero si primero hacemos node_build_content($node); antes de manipular el nodo $ a la función tema, se puede ver que el botón de formulario también se hace.

alt text

Por lo tanto, la solución real es:

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

node_view() hace esto dentro de la función misma + cosas adicionales que son buenas para invocar hook, etc. – JeroenEijkhof

6

Bueno, sortof.

Lo que realmente quiere es

$output = node_view($node); 

si lo que llama node_build_content y, a continuación, llama el tema ('nodo', el nodo $), hook_nodeapi('alter') Nunca se llama, ni es hook_link().

Así que si algún módulo está esperando alterar el nodo construido, no tendrá la oportunidad de hacerlo, y si se supone que hay enlaces, tampoco estarán allí.

Además, puede llamar al $output = node_view($node, FALSE, FALSE, FALSE); que le proporciona el nodo sin los enlaces.

Consulte la documentación para node_view().

+0

Esto es lo que acabo de descubrir: 'node_view (stdClass node object, bool teaser, bool page, bool links) . – JeroenEijkhof

1

Si nos fijamos en el origen de drupal_render(), en realidad también llama a theme() (siempre que se proporcione una anulación #theme).

1

En Drupal 7, que debe hacer:

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