Advance CSS Server Side parsed mit PHP

Vorwort

Was soll Advance CSS Server Side parsed mit PHP bedeuten? Man parsed CSS Dateien Server seitig mit PHP.

Die Vorteile dabei liegen klar auf der Hand. Es ist nun zum Beispiel möglich Variablen einzuführen. Variablen für Farben oder geziehlt einzelne Browser anzusprechen.

Nachteile können eine erhöte Zahl von Requests oder Caching-Schwierigkeiten sein.

Im folgenden erklär ich die dafür notwendigen Schritte anhand der Technik die ich bei gedit.NET verwende.
Geeignet ist dieser Artikel für Sie:

Serverseitige Vorbereitung

In meinem Fall habe ich mich dafür entschieden die Dateiendung für Cascading Style Sheets beizubehalten. Natürlich ist es auch möglich Dateien mit der Dateiendung .php als Style Sheet einzubinden.

Das Apache CSS Dateien mit PHP parsed, ist es notwendig in der httpd.conf oder in einer .htaccess die folgende Direktive anzulegen:

.htaccess

...

AddType application/x-httpd-php .css

...

Die .htaccess sollte Sie am besten im Style Sheet Ordner anlegen, da .htaccess Direktive sich auf alle Dateien und Unterordner auswirken.

PHP geparste CSS Dateien

Das CSS Dateien fehlerfrei mit PHP geparsed werden ist es notwendig, dass Sie den Header am Anfang der Datei bestimmen. Desweiteren halte ich es für sinnvoll Funktionen, Schleifen und Konfigurations Variablen in eine externe PHP Datei auszulagern, welche problemlos in jeden Style Sheet included werden kann.

Die include Datei welche zwecks der Übersichtlichkeit, Funktionen, Schleifen oder Abfragen beinhaltet.

css.inc.php

<?php
/* 
 * gedit.net
 * CSS
 * /css/gedit.net/
 * 2005/2006/2007/2008 Simon Gattner
 * Kontakt: http://gedit.net/Kontakt
*/

// header data

if ($_GET['gzip'] == 'true' )
{
/* initialize ob_gzhandler to send and compress data */
ob_start ("ob_gzhandler");
/* initialize compress function for whitespace removal */
ob_start("compress");
/* required header info and character set */
header("Content-type: text/css;charset: UTF-8");
/* cache control to process */
header("Cache-Control: must-revalidate");
/* duration of cached content (1 hour) */
$offset = 60 * 60 ; 
/* expiration header format */
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s",time() + $offset) . " GMT";
/* send cache expiration header to broswer */
header($ExpStr);
}
else
{
// Header
header("Content-type: text/css;charset: UTF-8");

// Make the .css Header Comment

$str = $_SERVER['PHP_SELF'];
$parts = preg_split('[/]', $str);

// Browser IE

if ( $parts[4] == 'ie' )
{
	$browser = 'IE';
	if ( is_numeric( $parts[5] ) )
	{
		$browser .= ' ' . $parts[5];
	}
}
else
{
	$browser = 'ALL';
}
echo <<< EOF
/* css.
                      888 ,e,   d8       Y88b Y88 888'Y88 88P'888'Y88 
 e88 888  ,e e,   e88 888  "   d88        Y88b Y8 888 ,'Y P'  888  'Y 
d888 888 d88 88b d888 888 888 d88888     b Y88b Y 888C8       888     
Y888 888 888   , Y888 888 888  888   d8b 8b Y88b  888 ",d     888     
 "88 888  "YeeP"  "88 888 888  888   Y8P 88b Y88b 888,d88     888     
  ,  88P                                                              
 "8",P"                                                             */

EOF;
echo "n";
echo '/* <http://'. $_SERVER['HTTP_HOST'] .'/>' . "n";
echo ' * Copyright 2006/2007/2008 Simon Gattner' . "n";
echo ' * This work is licensed under a Creative Commons Attribution-' . "n";
echo ' * NonCommercial 3.0 License.' . "n";
echo ' * Licence: <http://gedit.net/CC>' . "n";
echo ' * Contact: <http://gedit.net/Kontakt>                          */' . "nn";
echo '/* <http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . '>' . "n";
echo ' * Page:         ' . $parts[1] . "n";
echo ' * Style:        ' . $parts[2] . "n";
echo ' * Media:        ' . $parts[3] . "n";
echo ' * Browser:      ' . $browser . "n";
echo ' * FileName:     ' . end($parts) . "n";
echo ' * FileSize:     ' . round( filesize(end( $parts ))/1024, 1 ) . " KBn";
echo ' * LastModified: ' . date( "d.m.Y, H:m T", filemtime(end( $parts )) ) . '                             */' . "nn";
}

// Compress function

/* Begin function compress */
	function compress($buffer) {
	/* remove comments */
		$buffer = preg_replace('!/*[^*]**+([^/][^*]**+)*/!', '', $buffer);
	/* remove tabs, spaces, new lines, etc. */        
		$buffer = str_replace(array("rn", "r", "n", "t", '  ', '    ', '    '), '', $buffer);
	/* remove unnecessary spaces */        
		$buffer = str_replace('{ ', '{', $buffer);
		$buffer = str_replace(' }', '}', $buffer);
		$buffer = str_replace('; ', ';', $buffer);
		$buffer = str_replace(', ', ',', $buffer);
		$buffer = str_replace(' {', '{', $buffer);
		$buffer = str_replace('} ', '}', $buffer);
		$buffer = str_replace(': ', ':', $buffer);
		$buffer = str_replace(' ,', ',', $buffer);
		$buffer = str_replace(' ;', ';', $buffer);
		
	return $buffer;
	}

// Get the Colors

// About
if ( $_GET['ctg'] == '1' )
{
	$color = 'rgb(75, 61, 62)';
}
// Impressum
elseif ( $_GET['ctg'] == '2' )
{
	$color = 'rgb(124, 125, 101)';
}

...

?>

In meinem Beispiel enthält die include Datei Header Informationen wie Content-Type, Cache-Controle oder den Expires Zeitraum, sowie Funktionen und if Abfragen um unnötige Zeichen zu entfernen oder die Farben für eine Kategorie der Webseite zu bestimmen. Browserweichen wären eine weitere Möglichkeit.

Die CSS Datei in die css.inc.php eingebunden wird.

style.css

<?php
require_once( '/path/to/css.inc.php' );
// screen all
?>

...

<?php
if( $_GET['adm'] == 'true' )
{
echo <<< EOF
/* 
 * Admin
 */
#admin {
	position: fixed;
	top: 0; left: 0;
	width: 100%;
	height: 24px;
	background-color: $color;
}

...

EOF;
}
?>

...

#header {
	float: left
	background-color: <?php echo $color ?>;
}

Style Sheet einbinden

Das HTML Template in den der PHP geparste Style Sheet via link rel eingebunden wird.

index.html

...

<link rel="stylesheet" type="text/css" href="/css/gedit.net/v0.5/default/screen/style.9.css&amp;gzip=true&amp;adm=true" media="all">

...

Anhand der GET Variablen lassen sich verschiedene Schleifen, if Abfragen oder Funktionen in der nun geparsten CSS Datei ansprechen. Natürlich könnten Sie in das Template wiederum Abfragen oder Anweisungen integrieren, die die verschiedenen GET Variablen ansprechen.

Links und Quellen

Kommentare

Hallo,
danke für den guten Tip. Das ist genau was ich gesucht habe.
Liebe Grüße Flo

Florian, Montag, 01. Dezember 2008, 19:00

Hi,The right sidebar is toucnihg the middle column in the homepage as you can see. I want to change the size same like left sidebar, not toucnihg the middle column.Thanks for reply.

Best, Freitag, 08. August 2014, 13:44

Kommentar schreiben

  • (optional, Email Adresse wird nicht angezeigt)