Rss Feed
Tweeter button
Facebook button
Linkedin button
Webonews button
Delicious button
Flickr button
Apr 22

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!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Jan 25

Zig Content Management Systeme, aber die folgende Online-Präsentation zeigt auf, warum ein Umstieg auf Drupal sinnvoll ist:

http://www.slideshare.net/chrisshattuck/drupal-kick-butt

Von den genannten Gründen profitieren nicht nur wir als Entwickler und Dienstleister für Drupal, sondern auch unsere Kunden, da wir flexibler und schneller arbeiten – ohne Qualität einzubüßen.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter