Browserweiche mit PHP (mit WordPress-Beispiel)
Warum sollte ich eine Browserweiche einsetzen? Bei fast jedem Webdesign-Projekt kann man sich nicht nur auf aktuelle Browser und deren Features verlassen. Bereits in den ersten Kundengesprächen sollte man sich bewusst machen, welche Zielgruppe(n) es so gibt. Soll die neue Website für Skateboard Equipment erstellt werden, kann davon ausgegangen werden, dass die möglichen User wohl zum Großteil “Multimedia Junkies” sein werden
Hat man es jedoch beispielsweise mit landwirtschaftlichen Unternehmen auf ländlichen Gegenden zu tun, muss man durchaus mal damit rechnen, dass immer noch 10% — 15% der Besucher mit den Internet (H)Explorer 6 durch das WWW stolpern.
In diesem Fall sollte man sich mal mit der Browserweiche auseinandersetzen. Den Löwenanteil kann man über typische CSS Conditional Comments abfangen. Was aber, wenn das nicht mehr damit zu realisieren ist? Wie kann man noch ansetzen?
Problemstellung
In einem aktuellen Projekt erstelle ich einen News Blog. In dem Header sind (transparente) Social Icons im PNG-Format hinterlegt. Nun wissen wir ja, dass der IE 6 da echt zicken kann, weil der Alpha-Kanal fehlt. In der header.php sieht der Bereich folgendermaßen aus:
<div id="header_social">
<p id="social_icons">
<a href="<?php bloginfo( 'rss2_url' ); ?>" title="RSS Feed"><img src="<?php bloginfo( 'template_url' ); ?>/images/social_rss.png" alt="RSS Feed" /></a>
<a href="http://www.twitter.com/benno_m_" title="... on Twitter"><img src="<?php bloginfo( 'template_url' ); ?>/images/social_twitter.png" alt="... on Twitter" /></a>
<!-- ein paar Icons mehr //-->
</p>
</div>
Die Grafiken haben wie gesagt einen transparent Hintergrund — der IE 6 stinkt hier etwas ab und stellt der Hintergrund einfach weiß dar.
Lösungsansatz
Da ich hier nur schwer mit CSS anetzen konnte, bin ich auf PHP umgeschwungen. Es wird der verwendete Browser vom User abgefragt und auf die Version getestet. Weiterhin habe ich im Bilderordner des Templates einen Unterordner angelegt, der die Grafiken enthält, welche statt transparentem Hintergrund eine farblich angepasste Hintergrundfarbe enthalten. Wir also der IE 6 verwendet, soll die Bilder aus diesem Ordner verwendet werden, sonst nicht.
Folgender Ansatz zur Implementierung einer Browserweiche:
<div id="header_social">
<p id="social_icons">
<?php
$browser = $_SERVER['HTTP_USER_AGENT'];
if( preg_match( '=MSIE 6.0=i', $browser ) ) { /* Binde IE 6 Grafiken ein */
?>
<a href="<?php bloginfo( 'rss2_url' ); ?>" title="RSS Feed"><img src="<?php bloginfo( 'template_url' ); ?>/images/ie6/social_rss.gif" alt="RSS Feed" /></a>
<a href="http://www.twitter.com/benno_m_" title="... on Twitter"><img src="<?php bloginfo( 'template_url' ); ?>/images/ie6/social_twitter.gif" alt="... on Twitter" /></a>
<?php
}
else { /* Binde normale transparent Grafiken ein */
?>
<a href="<?php bloginfo( 'rss2_url' ); ?>" title="RSS Feed"><img src="<?php bloginfo( 'template_url' ); ?>/images/social_rss.png" alt="RSS Feed" /></a>
<a href="http://www.twitter.com/benno_m" title="... on Twitter"><img src="<?php bloginfo( 'template_url' ); ?>/images/social_twitter.png" alt="... on Twitter" /></a>
<?php
}
?>
Die if–Abfrage prüft hier die Rückgabe der Browserinformationen und schaut ob irgendwo der Teilstring MSIE 6.0 vorhanden ist. Somit lässt sich relativ einfach eine Browserweiche über PHP basteln.
Alternativen / Probleme bei dieser Art von Browserweiche
Sicherlich ist die hier vorgestellte Lösung nicht die eleganteste. Das sollte sie auch nicht, sie sollte funktionieren
Es gibt sicherlich 3.982, 53 andere Möglichkeiten das Problem zu lösen. Jedoch kam mir diese zuerst in den Sinn.
Weniger Schreibarbeit hätte man auch, wenn man die Abfrage jeweils in die a-Tags mit einbaut — z.B. über den ternären Operator von PHP. Ich habe darauf allerdings zum Verständnis hier darauf verzichtet. Meine entgültige Implementierung sieht dann noch etwas anders aus
*** Update ***
Mir ist durchaus klar, dass es diverse Hacks gibt, die dem IE Transparenzen beibringen können. Davon möchte ich hier allerdings Abstand nehmen, da mir die Einbindung einer weiteren JS Library für ein paar kleine Icons nicht sinnvoll erscheint. Darüber hinaus soll dieser Beitrag zum Nachdenken anregen — dazu, dass nicht bei jedem kleinen Problem eine extra JavaScript Bibo zum Einsatz kommt. Diese Bibos haben oftmals Nachteile, die den Designer einschränken — und Einschränkungen haben wir ja schon genug