Schon lange sind die Tage vorbei, bei denen man mit bloßem CSS und ein bißchen Markup einen bombigen Drupal-Theme gebaut hat. Der Themer von heute stützt sich auch gerne mal auf JavaScript für Effekte, die den Kunden dann hoffentlich vom Hocker pusten.
Eine JavaScript-Datei in einem Drupal-Theme einzubinden ist angeblich nicht schwer – sagt zumindest die Seite in der Dokumentation. Ist ja spitze, denkt man sich und das war auch mein Gedanke.
Jetzt hatte ich den Fall, das ich eine gewisse JavaScript-Datei nur dann mit in die Seitenausgabe aufnehmen wollte, wenn bestimmte Page-Variablen gesetzt sind. Also fix die Funktion template_preprocess_page in der entsprechenden template.php meines Themes überladen und brav meinen Aufruf von drupal_add_js eingebaut. Alles auch ganz erwartungsvoll dem oben genannten Artikel folgend umgesetzt. Somit sah das ganze ungefähr so aus:
/**
* @brief
* Implementation von template_preprocess_page.
*
* @see http://api.drupal.org/api/function/template_preprocess_page/6
*/
function meintheme_preprocess_page(&$variables) {
// JavaScript nur einhängen, wenn die Variable TRUE ist.
if ($variables['irgendwas']) {
drupal_add_js(drupal_get_path('theme', 'meintheme') . '/js/mein.js', 'theme');
}
}
Alles klar, speichern, hochladen, Drupal Caches leeren, Seite neuladen. Nichts passiert.
Gut, OK kann passieren. Code überprüft, alles schlüssig. Dann Firebug geöffnet und nachgesehen, ob auch ein entsprechender Eintrag im
-Bereich der Seitenausgabe steht. Natürlich nicht. Es schien von Anfang an schon zu einfach zu sein -.-Um das ganze jetzt kurz zu machen, hier die Erklärung warum die Referenz auf die JavaScript-Datei nicht da war, obwohl offensichtlich alles richtig zu sein schien.
Das Problem liegt darin, dass die Page-Variablen in Drupal u.a. auch die Referenzen auf alle registrierten JavaScript-Dateien umfassen. Lässt man sich in der obigen Funktion nämlich einfach mal $variables['scripts'] ausgeben (bspw. mit Hilfe des Devel-Moduls, so sieht man alle entsprechenden Einträge. Der Aufruf von drupal_add_js() findet also zu spät statt, da die Page-Variable $scripts (wie sie in page.tpl.php heißt) bereits gefüllt wurde.
Sieht man sich hierzu die Core-Implementation in Drupal 6 von template_preprocess_page einmal genauer an, stößt man auf diese Zeile:
$variables['scripts'] = drupal_get_js();
Genau darin liegt der Trick. Dupliziert man diese Zeile einfach nach dem Aufruf von drupal_add_js in der template.php, so wird auch unsere JavaScript-Datei ausgeben.
Das Endergebnis sieht dann ungefähr so aus:
/**
* @brief
* Implementation von template_preprocess_page.
*
* @see http://api.drupal.org/api/function/template_preprocess_page/6
*/
function meintheme_preprocess_page(&$variables) {
....
// JavaScript nur einhängen, wenn die Variable TRUE ist.
if ($variables['irgendwas']) {
drupal_add_js(drupal_get_path('theme', 'meintheme') . '/js/mein.js', 'theme');
$variables['scripts'] = drupal_get_js();
}
....
}
Happy Theming, kids!












letzte Kommentare