Beitrag vom

Das Problem

Du nutzt mehrere Taxonomie Vokabulare, um Listen von Inhalten in verschiedenen Kategorien zu erstellen. Jedes Vokabular (oder nur ein spezielles) soll dabei ein anderes Page-Markup bekommen. Es gibt jedoch von Haus aus kein Vokabular-Template auf Page-Ebene.

Die Lösung

Wir können in der template_preprocess_page Funktion weitere Theme-Namen Vorschläge auf Page-Ebene erstellen und in das Array „theme_hook_suggestions“ einfügen. 

Die template_preprocess_page Funktion wird von Drupal aufgerufen, um Variablen für die Seitendarstellung zu verarbeiten. Eine Variable davon beinhaltet Vorschläge für die zu verwendenden Templates – „theme_hook_suggestions“. 

Jedes Theme oder Modul kann eine eigene template_preprocess_page Funktion erstellen und dort Variablen definieren oder verändern. Dazu schreibt man einfach eine Funktion in ein eigenes Modul oder in die template.php des Themes:


function <meinthemeoderModul>_preprocess_page(&$variables){
   //Meine Variablen passe ich hier an
}

Der Pfad-Alias in der URL wird von Drupal in einen internen Pfad übersetzt. Bei Taxonomy-Term Seiten ist der Pfad /taxonomy/term/meine-Term-Id.

Über die arg() Funktion können wir die einzelnen Parameter des Pfades nutzen, um festzustellen, ob wir uns gerade auf einer Taxonomie-Seite befinden.  Die Term-ID nehmen wir anschließend, um das Vokabular des aktuellen Terms zu identifizieren. Dazu schreiben wir eine Datenbankabfrage, in der wir den Maschinenlesbaren Namen des Vokabulars auslesen:


function <meinThemeOderModul>_preprocess_page(&$variables){
   if (arg(0) == 'taxonomy' && arg(1) == 'term' && is_numeric(arg(2))) {
      $tid = arg(2);
      $vid = db_query("SELECT machine_name FROM {taxonomy_term_data} 
                  left join taxonomy_vocabulary on taxonomy_term_data.vid = 
                  taxonomy_vocabulary.vid
                  WHERE tid = :tid", array(':tid' => $tid))->fetchField();

      $variables['theme_hook_suggestions'][] = 'page__vocabulary__'.$vid;
  }
}

Anhand des maschinenlesbaren Namen können wir jetzt eine neue theme_hook_suggestion hinzufügen – hier „page__vocabluary__<meinVokabularName>„. Wenn wir jetzt ein Page-Template namens page–vocabulary–tags.tpl.php anlegen, wird dieses für das Vokabular „Tags“ verwendet. Beachte, dass die Unterstriche in der theme_hook_suggestions Variable im Template-Namen zu Bindestrichen werden.

Denkbar wäre auch, einfach die VID des Terms zu nutzen. Jedoch kann die ID schnell mal variieren, wenn man ein Vokabular von einer Installation in eine Andere umzieht. Dann müsste man entsprechend die ID des Templates nachziehen. Das Nervt und ist eine potentielle Fehlerquelle. Deshalb nimm lieber gleich den maschinenlesbaren Namen. 

Damit das Template und die Funktion greifen, solltest du noch den Cache leeren.

Zusatz

Es gibt noch weitere Preprocess Funktionen, in denen du Einfluss auf die Template-Suggestions nehmen kannst. Diese Funktionen gibt es für fast alles: Nodes, Blöcke, Regionen, Felder… die entsprechenden Funktionen heißen dann entsprechend <meinThemeOderModul>_preprocess_node/block/field/etc.

In Drupal 8 gibt es weiterhin die Preprocess Funktionen. Allerdings sind die Theme Suggestions in eigene Funktionen ausgelagert.

Weiterführende Links

Standard Drupal 7 Theme Suggesions

Mit Theme Suggestions von Drupal 7 Arbeiten

Beispiel zu Theme Suggestions in Drupal 8

 

Tags: , , , ,

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.