Rendre un field sous Drupal 7

Auteur(s) de l'article

Drupal 7 amène un nouveau concept: les entités. Par exemple, les nodes, user et taxonomie, mais aussi les commentaires sont maintenant des entités. Cette couche d’abstraction permet de gérer des types d’entité de nature différente avec la même API.
La question aujourd’hui est comment afficher un field en dehors du rendu de l’entité? Par exemple le field d’un node en sidebar? On peut utiliser les modules display suite ou faire un bloc avec view mais vous allez voir qu’il est bien plus simple et performant de le faire en PHP en utilisant l’API de drupal.

Il y a une API pour ça: field_view_field

Dans une fonction preprocess, nous allons récupérer le field avec field_view_field. Cette fonction nous retourne un render array qui représente le field. Celui-ci serra finalement rendu avec la sidebar dans le template page.tpl.php .

// @file sites/all/theme/THEMENAME/template.php
/**

* hook_preprocess_page
*/
THEMENAME_preprocess_page(&$var) {
if (isset($var['node']) && $var['node']->type == 'page') {
// field_view_field($entity_type, $entity, $field_name, $display = array(), $langcode = NULL)
$var['sidebar']['field_name'] = field_view_field('node', $var['node'], 'field_name', 'default');
}
}

À éviter

J’ai trop souvent vu du code qui ressemblait à:

// Example à ne pas suivre
$output = $var['node']->field_name['und'][0]['safe_value'];
Ceci n’est pas conseillé pour plusieurs raisons:
•    Risque de ne plus fonctionner si la structure du field change lors d’une mise à jour.
•    Ceci pose des problèmes sur les sites multilingues (und représente « undefinied language »)
•    Le rendu ne passe pas par les fonctions de thème du field
•    Si vous souhaitez afficher un field à valeurs multiples, vous devrez gérer la boucle