Grundlagen zu 'overriding'
[Übersetzung der Seite About overriging themable output auf drupal.org. Die Bilder fehlen allerdings (noch).]
Dieser Abschnitt behandelt Änderungen der HTML Ausgabe (z.B. mit neuen CSS-Klassen). Soll nur das Design der Seite mittels Stylesheets angepasst werden, kann der Abschnitt übersprungen werden.
Es gibt drei Punkte, die für Änderungen der HTML-Ausgabe beachtet werden müssen. Zunächst muss man herausfinden, welche Datei oder Funktion für die zu ändernde Ausgabe verantwortlich ist. Als nächstes muss die Ausgabe durch eine eigene ersetzt werden, dabei muss als drittes der Typ (Funktion oder Template, siehe unten) verstanden werden.
Bei Änderungen an Themes ist es wichtig, dass Drupal die Theme-Registry neu aufbaut (sonst werden die Änderungen nicht übernommen). Dazu muss der Cache geleert werden.
- Quelle der HTML-Ausgabe finden:
Da bei Drupal die 'fertige' HTML-Seite aus verschiedenen .tpl.php-Dateien und Funktionen zusammengebaut wird, ist es nicht immer leicht die richtige Quelle zu bestimmen. Die einzelnen Dateien sind oft über das gesamte System 'verstreut' (Kern, Module, Theme).
Die meisten Elemente einer Seite werden üblicherweise durch theme('page') bereitgestellt. Das heißt, aus den Daten in der Datenbank werden Variablen mit zum Teil vorformatierten HTML-Ausgaben erzeugt. Auf diese Variablen hat man dann in der page.tpl.php Zugriff und kann dort die Seite aus den einzelnen Teilen (Navigation, Blockregionen, Blöcke in den Blockregionen,...) 'zusammenbauen'. (Für einen Überblick über die zur Verfügung stehenden Variablen lohnt ein Blick in modules/system/page.tpl.php)
Es gibt also zwei Ansatzpunkte bei der Themeerstellung: die Änderung von Funktionen die die Variablen bereitstellen, auf die in der entsprechenden .tpl.php zugegriffen wird, und die Änderung der .tpl.php selbst.
Siehe hierzu auch Das Drupal Theme System.Das Theming durch Funktionen und Templates wird mit theming 'hooks' bezeichnet. Es gibt viele 'hooks' in Drupal die mit Theming nichts zu tun haben. Hier geht es lediglich um hooks in Bezug auf Theming.
Um nun die Quelle für eine spezielle Ausgabe zu finden kann das Devel Modul installiert werden. Es gibt dazu auch einen Screencast.
- Das 'overrides'-System:
Das Überschreiben von Funktionen oder Templates folgt bis auf wenige Ausnahmen einer festen Hierarchie. Zunächst stellen der Drupalkern und die Module einfache Funktionen und Templates bereit. Sollten diese nicht den eigenen Vorstellungen entsprechen und angepasst werden, kann die Ausführung der entsprechenden Funktionen durch eigene verhindert werden. Die Änderungen finden dabei ausschließlich in dem verwendeten Theme statt. Der Code von Modulen oder dem Kern muss (und sollte) nicht verändert werden. (Hier sind Gründe angegeben, warum der Kern nicht 'gehackt' werden sollte.)
Wird noch mehr Kontrolle über die Erstellung der Seite(n) benötigt, kann auch die Theme-Registry angepasst werden.
- Funktionen vs. Templates:
Wie bereits erwähnt gibt es zwei Möglichkeiten die Seitenerstellung zu ändern: über Funktionen oder über Templates. Welche Möglichkeit man wählt hängt von dem gewünschten Ergebnis ab. Der Drupalkern und die Module nutzen meist beides für die Seitenerstellung, Themes können dann den selben Typ nutzen oder ihn ändern.
Funktionen sind etwa fünfmal schneller als Templates, sind dafür aber eventuell für jemanden, der sich nur in XHTML auskennt, schwieriger zu programmieren. Die Geschwindigkeit hängt von der Art des hook multipliziert mit der Anzahl der Aufrufe pro Seite ab. Zum Beispiel verursacht ein Theming hook 'links' über Templates eine spürbar schlechtere Performance auf komplexen Seiten, da er sehr oft aufgerufen wird. Eine Änderung für den 'footer' würde dagegen weniger Auswirkungen zeigen, da er nur einmal pro Seite aufgerufen wird.
Hier nun zwei Beispiele, wie mit Hilfe des devel themer Ausgaben überschrieben werden.
Funktionen überschreiben:
Die Funktion theme_menu_local_tasks ist eine einfache Funktion die Primär- und Sekundärtabs ausgibt. In diesem Fall ist das Theming-hook 'menu_local_tasks'. Um diese Funktion durch eine eigene zu ersetzen kann das 'theme'-Prefix der Funktion durch den Namen des genutzten Themes oder den Namen der eingesetzten Theme-Engine ersetzt werden. Um Namenskonflikte (mit Subthemes) zu vermeiden sollte der Name des Themes gewählt werden.
Durch einsetzen des folgenden Codes in die template.php-Datei des genutzten Themes und Löschen der Theme-Registry wird die Funktion nun ersetzt. 'meintheme' steht hier für den Namen des genutzten Themes.
<?php
function meintheme_menu_local_tasks() {
$output = '';
if ($primary = menu_primary_local_tasks()) {
$output .= "<ol class=\"tabs primary\">\n". $primary ."</ol>\n";
}
if ($secondary = menu_secondary_local_tasks()) {
$output .= "<ol class=\"tabs secondary\">\n". $secondary ."</ol>\n";
}
return $output;
}
?>Hier wird lediglich die ursprüngliche Ausgabe als ungeordnete Liste durch eine geordnete Liste ersetzt.
Eine Liste aller Theme-Funktionen gibt es hier.
Templates überschreiben:
Wird die Ausgabe durch ein Template erzeugt (xxx.tpl.php), kann die entsprechende Datei einfach in das Verzeichnis des Themes kopiert werden. Nach Löschen der Registry wird dann dieses Template genutzt. Um zum Beispiel das Suchfeld anzupassen, wird die Datei search-theme-form.tpl.php in das Verzeichnis des genutzten Themes kopiert. (Bei Templates werden zur Bezeichnung Bindestriche benutzt, die entsprechende Funktion wäre 'search_theme_form' mit Unterstrichen.) Fertig. Mit einem Editor können nun Änderungen an der Datei vorgenommen werden.
Hinweis: Templates können in einem beliebigen Verzeichnis innerhalb des Verzeichnisses des verwendeten Themes gespeichert werden.
Funktionen in Templates konvertieren
Für die Konvertierung einer Funktion in ein Template ist etwas Arbeit nötig. Anschließend kann aber leichter mit Templates gearbeitet werden. Ziel dabei ist es, das Design vom Code zu trennen, so dass ein Designer der die Seite anpassen möchte keine Funktionen mehr bearbeiten muss. Es gibt für den Kern bereits zu vielen Funktionen passende Templates (sie z.B. Oben für search_theme_form). Weitere werden in zukünftigen Versionen dazukommen. Module die den 'best practises' folgen sollten ebenfalls entsprechende Templates bereitstellen. Daher ist diese Anleitung für Theming hooks gedacht, die noch kein Template bereitstellen.
Drupal erkennt automatisch, ob ein Theming hook als Template existiert. Nötig für eine entsprechende Änderung ist lediglich folgendes:
- der Name des Templates muss zum Namen des Theming hook passen
- die Unterstriche im hook müssen durch Bindestriche ersetzt werden
- der Name des Template muss die Erweiterung 'tpl.php' haben (dies hängt allerdings von der genutzten Theme-Engine ab)
Betrachtet man die Funktion theme_user_signature lautet der Theme hook 'user_signature'. Erstellt man nun eine Datei namens 'user-signature.tpl.php' erkennt Drupal nach dem löschen der Registry, dass der hook jetzt ein Template ist. Jede Änderung in dieser Datei wirkt sich jetzt auf die Ausgabe der Funktion aus. Der Teil der etwas mehr Arbeit erfordert ist das Anlegen der Variablen die in dieser Datei zur Verfügung stehen. Dies geschieht durch Preprocess-Funktionen.
Hinweise:
- Obwohl es möglich ist den Code direkt in das Template zu schreiben sollte man es vermeiden. Die Logik sollte von der .tpl.php-Datei getrennt in Preprocess-Funktionen geschrieben werden. Das erleichtert die Übersicht und damit spätere Änderungen.
- Die Trennung ist auch wichtig im Hinblick auf Sicherheit. So kann die Möglichkeiten von Cross-Site-Scripting Attacken durch Entfernen potentiell schädlicher Nutzereingaben minimiert werden. In Template-Dateien sollte der Fokus dagegen nur auf Designfragen, nicht auf Sicherheitsaspekten liegen.
Die Theme-Registry:
Die Theme Registry von Drupal enthält Informationen über vorhandene Theming hooks und wie mit ihnen 'gearbeitet' werden soll.
Eine direkte Bearbeitung der Registry ist in den meisten Fällen für die Entwicklung eigener Themes nicht erforderlich. Sie muss lediglich gelöscht und neu aufgebaut werden, wenn Funktionen oder Templates neu erstellt oder gelöscht werden. Eine Änderung bestehender Funktionen benötigt dagegen keinen neuen Aufbau der Registry.
Um die Theme Registry zu löschen gibt es verschiedene Möglichkeiten:
- Unter 'Verwaltung->Einstellung->Leistung' auf 'Cache löschen' klicken
- bei eingeschaltetem devel-Block (im devel-Modul enthalten) den 'Empty cache' Link klicken
- die API-Funktion drupal_rebuild_theme_registry.
Die Theme Registry ist ein Zwischenspeicher für die verfügbaren Theming hooks und wie mit ihnen umzugehen ist. Dadurch wird die Seitenerstellung beschleunigt, da nich bei jedem Aufruf einer Seite die entsprechenden Informationen zusammengestellt werden müssen. Die Theme-Engine auf der die Seite läuft registriert automatisch alle Theming hooks.
Es ist nur in wenigen Fällen nötig mit der Registry direkt zu arbeiten. Etwa wenn das Theme einen neuen hook registrieren möchte, der bisher noch nicht durch andere Module, die Engine oder den Kern implementiert ist.
- weitere Informationen gibt es hier (englisch)
- die Theme Registry ist nicht die theme.info-Datei die ebenfalls gecached wird. Die Punkte 1 und 2 zum löschen des Cache (oben) löschen beides
- Das Theme muss die phptemplate-Engine nutzen damit die Templates und Funktionen erkannt werden. Andere Engines sollten sich ebenso verhalten. Für Themes ohne Engine muss die Registrierung manuell erfolgen, siehe hier
- Anmelden oder Registrieren um Kommentare zu schreiben
Neue Kommentare
vor 3 Tagen 13 Stunden
vor 6 Tagen 12 Stunden
vor 6 Tagen 13 Stunden
vor 6 Tagen 14 Stunden
vor 6 Tagen 14 Stunden
vor 6 Tagen 15 Stunden
vor 1 Woche 20 Stunden
vor 1 Woche 23 Stunden
vor 1 Woche 1 Tag
vor 1 Woche 1 Tag