La fonction de thème personnalisé n'est pas appelée?

8

Je construis un module Drupal 7 pour créer un type de champ sur mesure. J'ai implémenté tous les crochets requis. Ma hook_field_formatter_view()fonction ressemble à ceci:

function MYMODULE_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();

  switch ($display['type']) {
    case 'default':
      foreach ($items as $delta => $item) {
                $element[$delta] = array(
                  '#theme' => 'test',
                  '#item' => $item,
                );
      }
      break;
  }

  return $element;  
}

J'ai ensuite défini la theme()fonction ci-dessous:

function theme_test($variables) {
    return '<h1>Hello World</h1>';
}

Mais quand je regarde la page, rien n'est sorti. Si je regarde les entrées récentes du journal, je vois ce message:

Theme key 'test' not found.

Si je change ma valeur '#theme' du tableau de rendu MYMODULE_field_formatter_view en une fonction de thème intégrée comme 'item_list' cela fonctionne. Mais pour une raison quelconque, ma fonction de thème personnalisé n'est pas récupérée.

J'ai reconstruit le registre de thèmes des centaines de fois et effacé les caches.

Camsoft
la source

Réponses:

12

Vous n'avez probablement pas défini votre hook de thème hook_theme().

La section Utilisation de la couche thématique du manuel Développement a une discussion approfondie à ce sujet.

Damien Tournoud
la source
Sur place, je continue de me faire prendre par ces petits changements de Drupal 6 à Drupal 7!
Camsoft
4
Les fonctions de thème doivent également être enregistrées dans Drupal 6.
Berdir
10

Vous devez définir la fonction de thème dans hook_theme, puis vider le cache.

 function MYMODULE_theme() {
   return array(
     'test' => array (
       'render element' => 'element',
     ),
   );
 }
googletorp
la source
2

J'étais confronté au même problème où ma fonction de thème personnalisé n'était jamais appelée dans mon modèle, même si elle était enregistrée. Lorsque je suis passé à un autre thème, cela a fonctionné.

Ma solution consistait à renommer le thème en «quelque chose_de_thème», car j'ai fait une erreur stupide et j'avais déjà un module nommé «quelque chose».

Le module et le thème ne doivent jamais avoir le même nom , car cela entraîne une collision qui provoque un comportement inattendu et une substitution de hook.

bpile
la source