Kleiner Drupal 6.x Bug im Header?
Eingetragen von Stoik (101)
am 15.03.2008 - 10:13 Uhr in
am 15.03.2008 - 10:13 Uhr in
Hallo,
vieleicht hat der ein oder andere das auch schon bemerkt, im drupal 6.1 gibts nen kleines Problem im Header.
Ich habe die Tage ein Drupal 6.1 Installiert und im Quellcode ist mir folgendes Aufgefallen
<link type="text/css" rel="stylesheet" media="all" href="/modules/node/node.css?3" />
<link type="text/css" rel="stylesheet" media="all" href="/modules/poll/poll.css?3" />
<link type="text/css" rel="stylesheet" media="all" href="/modules/system/defaults.css?3" />
<link type="text/css" rel="stylesheet" media="all" href="/modules/system/system.css?3" />
<link type="text/css" rel="stylesheet" media="all" href="/modules/system/system-menus.css?3" />
<link type="text/css" rel="stylesheet" media="all" href="/modules/user/user.css?3" />
<link type="text/css" rel="stylesheet" media="all" href="/themes/chauffeurtheme/style.css?3" />
Und zwar gehört das "?3" nicht mit dazu.
Selbst auf der http://demo.opensourcecms.com/drupal ist das gleiche Problem nur das dort eben "?K" steht!
Habt Ihr das auch schon bemerkt?
Grüße
- Anmelden oder Registrieren um Kommentare zu schreiben
$query_string und IE5-Probleme bei CSS-Import per <link>
am 20.03.2008 - 12:00 Uhr
Hallo Andreas,
im YAML-Drupal-Forum ging es vor Kurzem um das IE-Problem bezüglich einer "Aufnahmefähigkeit" bezüglich der Anzahl an importierbarer CSS-Dateien: http://forum.yaml.de/index.php?topic=4746.0
Nun beschäftige ich mich seit dem vergangenen Wochenende damit, wie Drupal 6 die CSS-Dateien einbindet, da bei meinen Template-Kompatibilitäts-Tests im IE 5 und 5.5 Probleme aufgetreten sind. Die alten IE benötigen mit dem Link-Befehl bei mir zur Zeit einen Reload, bevor sie alle CSS-Befehle annehmen. Dummerweise gehen bei mir Header und Footer-Informationen verloren und damit wichtige Menü-Punkte.
Ich habe zwar schon zum Testen ein kleines Script für das Template geschrieben, bei dem ich Link-Einbindungen in Style-@Import-Einbindungen umwandle. Aber ich habe mich auch schon mit der dafür zuständigen Funktion beschäftigt: http://api.drupal.org/api/function/drupal_add_css
Zwischen Zeile 1717 und 1739 im File common.inc erzeugt Drupal 6.1 die entsprechenden Links.
if (!$preprocess && $type == 'module') {
$no_module_preprocess .= '<link type="text/css" rel="stylesheet" media="'. $media .'" href="'. base_path() . $file . $query_string .'" />'."\n";
}
// If a CSS file is not to be preprocessed and it's a theme CSS file, it needs to *always* appear at the *bottom*,
// regardless of whether preprocessing is on or off.
else if (!$preprocess && $type == 'theme') {
$no_theme_preprocess .= '<link type="text/css" rel="stylesheet" media="'. $media .'" href="'. base_path() . $file . $query_string .'" />'."\n";
}
else {
$output .= '<link type="text/css" rel="stylesheet" media="'. $media .'" href="'. base_path() . $file . $query_string .'" />'."\n";
}
}
}
}
if ($is_writable && $preprocess_css) {
$filename = md5(serialize($types) . $query_string) .'.css';
$preprocess_file = drupal_build_css_cache($types, $filename);
$output .= '<link type="text/css" rel="stylesheet" media="'. $media .'" href="'. base_path() . $preprocess_file .'" />'."\n";
}
Die Variable $query_string enthält (wie ich heraus gefunden habe) die von Dir beschriebenen Informationen, die an die Links angefügt werden und mir auch schon aufgefallen sind.
Ich weiß zwar noch nicht wofür die $query_string-Anbindung gut sein soll und ob man das als Bug bezeichnen kann. Aber man kann diesen String in der common.inc entfernen.
In meinem kaum getesteten und damit nur mit Vorsicht anzuwendenden Workaround habe ich auch auf diese Variable verzichten können.
Mit folgenden Änderungen an der common.inc werden die CSS-Dateien wieder wie bei Drupal 5 ausgegeben:
if (!$preprocess || !($is_writable && $preprocess_css)) {
// If a CSS file is not to be preprocessed and it's a module CSS file, it needs to *always* appear at the *top*,
// regardless of whether preprocessing is on or off.
if (!$preprocess && $type == 'module') {
$no_module_preprocess .= '<style type="text/css" media="'. $media .'">@import "'. base_path() . $file .'";</style>'."\n";
}
// If a CSS file is not to be preprocessed and it's a theme CSS file, it needs to *always* appear at the *bottom*,
// regardless of whether preprocessing is on or off.
else if (!$preprocess && $type == 'theme') {
$no_theme_preprocess .= '<style type="text/css" media="'. $media .'">@import "'. base_path() . $file .'";</style>'."\n";
}
else {
$output .= '<style type="text/css" media="'. $media .'">@import "'. base_path() . $file .'";</style>'."\n";
}
}
}
}
if ($is_writable && $preprocess_css) {
$filename = md5(serialize($types) . $query_string) .'.css';
$preprocess_file = drupal_build_css_cache($types, $filename);
$output .= '<style type="text/css" media="'. $media .'">@import "'. base_path() . $preprocess_file .'";</style>'."\n";
}
VORSICHT bei Copy-and-Paste, vor allem weil ich mein Code-Snippet mitten aus den Funktionen geschnitten habe, um meinen Beitrag nicht zu lang zu machen.
Wer die Änderung inhaltlich nicht nachvollziehen kann, sollte meiner Meinung nach auch die Finger davon lassen.
Für Rückmeldungen zu meiner Idee, Erklärungen zu dem Sinn von $query_string und einer eleganteren Lösung eines erfahreneren Programmierers wäre ich dankbar.
Wie ich schon im YAML/Drupal-Forum geschrieben habe, könnte ich mir "Schalter" im Backend vorstellen, für die allerdings meine Programmier-Fähigkeiten noch nicht ausreichen. Denkbar wäre ein Schalter für Entwickler-CSS-Kompression und einer für die Umschaltung von Link zu Style-@Import. Letzter Wunsch ist allerdings abhängig davon, ob das IE5-Problem grundsätzlich auf dem Link-Tag beruht.
Bis dann,
Carsten
# DrupalCenter-Moderator # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: CMS Security & Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
IE: 30+ link/style tag-Problem und IE5/D6-Problem
am 11.05.2008 - 19:36 Uhr
Für das erwähnte Problem, daß der IE Probleme hat, mehr als 30 CSS-Tags einzulesen, gibt es ein Diskussion auf drupal.org. Dort habe ich ein Workaround gepostet, bei der ich das IE5/D6-Problem bezüglich des link-import-tag gemeinsam löse:
http://drupal.org/node/228818#comment-839816
# DrupalCenter-Moderator # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: CMS Security & Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
Soll das Brower-Caching umgehen
am 11.05.2008 - 22:57 Uhr
Hallo,
dieses "Feature" (Fragezeichen + Anhängsel hinter css und js) wurde wohl absichtlich eingebaut, wenn ich die Dokumentation von drupal_get_css auf api.drupal.org richtig verstehe:
// A dummy query-string is added to filenames, to gain control over
// browser-caching. The string changes on every update or full cache
// flush, forcing browsers to load a new copy of the files, as the
// URL changed.
$query_string = '?'. substr(variable_get('css_js_query_string', '0'), 0, 1);
Ich halte diese Methode für etwas zweifelhaft, schließlich gibt es ja auch Javascripte mit Parametern, und die
funktionieren dann nicht mehr. Aber jedenfalls: it's a feature, not a bug.
Gruß,
Boris
Feature übernommen
am 13.05.2008 - 12:28 Uhr
Hallo Boris,
danke für den Hinweis. Ich bin mir zwar auch nicht sicher, ob die Methode nun wirklich gut ist, aber ich habe dieses Feature nun auch in meine überarbeitete Funktion zur Umwandlung des $styles-Inhaltes übernommen (leicht zu deaktivieren):
http://drupal.org/node/228818#comment-841195
Der IE5 in meiner Test-Umgebung scheint nichts gegen das "Anhängsel" zu haben. Nun interessieren mich aber Deine Bedenken bezüglich Javascript.
Bis dann,
Carsten
# DrupalCenter-Moderator # https://www.drupal.org/u/c-logemann
# CTO der Nodegard GmbH: CMS Security & Availability Operations / Wir unterstützen IT-Abteilungen, Agenturen, Freiberufler:innen
Sonderfall
am 13.05.2008 - 20:49 Uhr
Hallo Carsten,
o.k., es ist ein wenig exotisch, aber theoretisch kann man folgendes dreckiges Konstrukt basteln:
<script type="text/javascript" src="meinjs.php?index=3&name=klaus"></script>
Man kann also statt Javascript ein PHP-Script aufrufen, welches als Ausgabe Javascript erzeugt, und kann diesem Parameter übergeben. In diesem Moment kann das Anhängen eines "?X" dazu führen dass das Skript nicht richtig funktioniert. CSS-Dateien sind davon nicht betroffen.
Aber wer macht denn so was :-) ? Zum Beispiel der hier: http://drupal.org/node/242875
Was das Caching angeht, die Methode mit dem Anhängsel ist zweifellos ein Trick, aber mir fällt erst mal auch nichts Besseres ein. Fragt sich nur wie oft in Zukunft die Ausgangsfrage in den Foren auftaucht, denn besonders transparent ist das bestimmt nicht.
Gruß,
Boris