web-dev-qa-db-fra.com

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

Je construis un module Drupal 7 pour créer un type de champ sur mesure. J'ai implémenté tous les hooks requis. Ma fonction hook_field_formatter_view() 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 fonction theme() 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.

8
Camsoft

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

La section tilisation de la couche de thème du manuel de développement a une discussion approfondie à ce sujet.

12
Damien Tournoud

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',
     ),
   );
 }
10
googletorp

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 conduit à une collision qui provoque un comportement inattendu et une substitution de hook.

2
bpile