Drupal Theming: JavaScript einhängen in Abhängigkeit von Page-Variablen
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:
view source
print?
01 /**
02 * @brief
03 * Implementation von template_preprocess_page.
04 *
05 * @see http://api.drupal.org/api/function/template_preprocess_page/6
06 */
07 function meintheme_preprocess_page(&$variables) {
08 // JavaScript nur einhängen, wenn die Variable TRUE ist.
09 if ($variables['irgendwas']) {
10 drupal_add_js(drupal_get_path('theme', 'meintheme') . '/js/mein.js', 'theme');
11 }
12 }
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:
view source
print?
1 $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:
view source
print?
01 /**
02 * @brief
03 * Implementation von template_preprocess_page.
04 *
05 * @see http://api.drupal.org/api/function/template_preprocess_page/6
06 */
07 function meintheme_preprocess_page(&$variables) {
08 ....
09 // JavaScript nur einhängen, wenn die Variable TRUE ist.
10 if ($variables['irgendwas']) {
11 drupal_add_js(drupal_get_path('theme', 'meintheme') . '/js/mein.js', 'theme');
12 $variables['scripts'] = drupal_get_js();
13 }
14 ....
15 }
Happy Theming, kids!
Neue Kommentare
vor 5 Tagen 13 Stunden
vor 1 Woche 10 Stunden
vor 1 Woche 13 Stunden
vor 1 Woche 13 Stunden
vor 1 Woche 14 Stunden
vor 1 Woche 14 Stunden
vor 1 Woche 14 Stunden
vor 1 Woche 1 Tag
vor 1 Woche 2 Tagen
vor 1 Woche 3 Tagen