Benutzerdefinierte Themenfunktion wird nicht aufgerufen?

8

Ich baue ein Drupal 7-Modul, um einen maßgeschneiderten Feldtyp zu erstellen. Ich habe alle erforderlichen Hooks implementiert. Meine hook_field_formatter_view()Funktion sieht so aus:

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;  
}

Ich habe dann die folgende theme()Funktion definiert :

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

Aber wenn ich die Seite betrachte, wird nichts ausgegeben. Wenn ich mir die letzten Protokolleinträge ansehe, wird folgende Meldung angezeigt:

Theme key 'test' not found.

Wenn ich meinen Wert für das Rendering-Array '#theme' von MYMODULE_field_formatter_view in eine integrierte Designfunktion wie 'item_list' ändere, funktioniert dies. Aber aus irgendeinem Grund wird meine benutzerdefinierte Themenfunktion nicht übernommen.

Ich habe die Themenregistrierung hunderte Male neu erstellt und die Caches geleert.

Camsoft
quelle

Antworten:

12

Sie haben Ihren Themen-Hook wahrscheinlich nicht definiert hook_theme().

Im Abschnitt Verwenden der Themenebene des Entwicklungshandbuchs wird dies ausführlich erörtert.

Damien Tournoud
quelle
Genau richtig, ich werde immer wieder von diesen kleinen Änderungen von Drupal 6 zu Drupal 7 überrascht!
Camsoft
4
Themenfunktionen
10

Sie müssen die Themenfunktion in definieren hook_themeund dann den Cache leeren.

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

Ich hatte das gleiche Problem, bei dem meine benutzerdefinierte Designfunktion in meiner Vorlage nie aufgerufen wurde, obwohl sie registriert war. Als ich zu einem anderen Thema wechselte, funktionierte es.

Meine Lösung bestand darin, das Thema in "Something_theme" umzubenennen, weil ich einen dummen Fehler gemacht hatte und bereits ein Modul mit dem Namen "Something" hatte.

Modul und Thema sollten niemals denselben Namen haben , da dies zu einer Kollision führt, die zu unerwartetem Verhalten und Überschreiben von Hooks führt.

bpile
quelle