2010-10-08 8 views
5

Étant donné un $node, j'essaie de choisir entre les deux façons suivantes de générer ce $ nœud.

soit

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

ou

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

Ils semblent tous deux pour donner des résultats similaires, mais est-il quelque chose que je devrais considérer avant de choisir un chemin sur l'autre?

Répondre

7

Votre sortie est similaire s'il n'y a pas d'autres modules et thèmes modifiant la sortie via la couche de thème.

Mais! Si vous ignorez le calque de thème, vous commencerez probablement à rencontrer un comportement inattendu lorsque vous installez des modules ou des thèmes et modifiez les paramètres de configuration qui utilisent le calque de thème pour modifier la sortie du noeud.

En bref, en contournant la couche de thème, vous générez une erreur dans votre application. Ces erreurs sont susceptibles de se produire après la transmission de votre application à quelqu'un (un client peut-être) qui commence à modifier les paramètres dans admin/

Voir le motif décorateur si vous êtes intéressé. Drupal l'utilise largement.

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

+0

Lequel de ces contournements la couche de thème? Je le comprends comme utilisant le thème() qui crée le problème de contourner beaucoup. – JeroenEijkhof

+0

Je suis assez sûr que $ output = drupal_render ($ node-> content); ça tourne autour. – Rimian

0

D'abord est recommandé, car il est passé par le calque de thème.

0

La solution qui a fonctionné ici était une combinaison de ces deux techniques. Juste en utilisant theme('node', $node); ne semble pas fonctionner sans l'aide de node_build_content($node);.

Voici le résultat d'un exemple utilisant uniquement theme('node', $node);.

alt text

Mais si nous faisons d'abord node_build_content($node); avant de manipuler le noeud $ à la fonction de thème, vous pouvez voir que le bouton de formulaire est également rendu.

alt text

Par conséquent, la vraie solution est:

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

node_view() fait cela dans la fonction elle-même + choses supplémentaires qui sont plutôt bonnes à avoir comme l'invocation de hook etc. – JeroenEijkhof

6

Eh bien, sortof.

Qu'est-ce que vous voulez vraiment est

$output = node_view($node); 

si vous appelez simplement node_build_content, puis appelez le thème ('nœud', noeud $), hook_nodeapi('alter') est jamais appelé, ni hook_link().

Donc, si un module s'attend à modifier le nœud construit, il n'aura aucune chance de le faire, et s'il y a des liens censés y être, ils ne seront pas là non plus.

En outre, vous pouvez appeler $output = node_view($node, FALSE, FALSE, FALSE); qui vous donne le noeud sans les liens. Voir la documentation pour node_view().

+0

C'est aussi ce que je viens de découvrir: 'node_view (objet node stdClass, bool teaser, page bool, bool links) . – JeroenEijkhof

1

Si vous regardez dans la source de drupal_render(), il appelle effectivement theme() lui-même (à condition qu'un remplacement #theme soit fourni).

1

Dans Drupal 7, vous devez faire:

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