Advanced Theming in Drupal


Drupal ist ja bekanntlich sehr flexibel. Die Flexibilität hat jedoch auch ihren Preis. Will man fortgeschrittene Theme Arbeiten machen, wird man nicht um PHP kommen. Wenigstens die Fähigkeit PHP zu lesen ist ein Muss. Wie funktioniert das Drupal Theme System? Und wie geht man vor? In einem Drupal Modul werden Theme Funktionen meistens wie folgt aufgerufen:

theme('image','sites/default/files/myimage.jpg');

Diese Funktion hat als Rückgabewert <img src='sites/default/files/myimage.jpg' />. Was soll jetzt daran besser sein, als gerade direkt den img Tag zu schreiben, was unter Umständen einfacher und schneller wäre? Ganz einfach: Ich kann in meinem Template die Themefunktion theme_image überschreiben. Warum möchte ich das machen? Weil ich z.B. allen Bildern automatisch eine Klasse mitgeben möchte. Theme_image Funktion überschreiben Wenn ich nach http://api.drupal.org gehe und dort nach theme_image suche, dann bekomme ich die Funktion zurück. Die Funktion sieht wie folgt aus:

function theme_image($path, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
if (!$getsize || (is_file($path) && (list($width, $height, $type, $image_attributes) = @getimagesize($path)))) {
$attributes = drupal_attributes($attributes);
$url = (url($path) == $path) ? $path : (base_path() . $path);
return ''. check_plain($alt) .'';
}
}

Jedes Bild, das generiert wird, wird also über diese Funktion erstellt (sofern die Module richtig programmiert sind). Wenn ich jetzt also jedem img Tag eine spezielle Klasse hinzufügen möchte, dann könnte ich:

  1. Die Theme_image Funktion aufbohren und die Sachen gleich dort reinschreiben. HALT! Nein. Dann müsste ich das, wenn ich das nächste Mal Drupal aktualisiere wieder machen, also Finger weg.
  2. Ich überschreibe diese Theme Funktion in meinem template.php File im Theme.

Das Vorgehen für das Überschreiben ist eigentlich denkbar einfach: Einfach die Originalfunktion kopieren und in das eigene template.php einfügen und dazu die Funktion von theme_image in myTheme_image (wobei myTheme der Name des eigenen Themes ist) umbenennen und dann in dieser Funktion die entsprechenden Änderungen vornehmen:

<!–?php
function myTheme_image($path, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
if (!$getsize || (is_file($path) && (list($width, $height, $type, $image_attributes) = @getimagesize($path)))) {
$attributes['class'] .= ' myClass'; //hier wird die Klasse jedem Bild angefügt.
$attributes = drupal_attributes($attributes);
$url = (url($path) == $path) ? $path : (base_path() . $path);
return ''. check_plain($alt) .'';
}
}
?>

Es stellt sich dann halt einfach die Frage, welche Theme Funktionen aufgerufen werden. Dazu ist der Theme Developper extrem nützlich!! Folgende Theme Funktionen werden häufig verwendet:

  • theme_image – Bilder
  • theme_item_list – Listen
  • theme_table – Tabellen
  • theme_breadcrumb

Es gibt noch seeeeehr viel mehr solcher Funktionen.