CSS mit Markern
Hinweis: Das war noch bevor ich Less und Sass entdeckt habe, aber vielleicht gab es das auch gar nicht, damals als ich das geschrieben hatte. Das ist jedenfalls die elegantere Variante, weshalb dieser Artikel im Archiv gelandet ist.
Um in CSS Marker verwenden zu können folgendes in das TS Template (hier für 2 Stylesheets + 4 Overlays):
#--------------------------------
# Stylesheets parsing
#--------------------------------
# ---------- Template ----------
cssTemplate1 = TEMPLATE
cssTemplate1.template = FILE
cssTemplate1.template.file = fileadmin/layout/css/rsys_layout.css
# ---------- Markers ----------
cssTemplate1.marks {
BODY = TEXT
BODY {
data = levelmedia: -1 "slide"
wrap = background-image: url(uploads/media/ |); background-repeat: no-repeat;
listNum = 0
}
FULL_WIDTH = TEXT
FULL_WIDTH.value = {$full_width}
LINK_HOVER = TEXT
LINK_HOVER.value = {$link_hover}
LINK_NORMAL = TEXT
LINK_NORMAL.value = {$link_normal}
}
# ---------- Page Object ----------
cssObject1 = PAGE
cssObject1 {
typeNum = 31
config {
disableAllHeaderCode = 1
additionalHeaders = Content-type: text/css
admPanel = 0
}
# dynamische CSS-Vorlage aus Bibliothek laden
20 < cssTemplate1
}
# ---------- Duplicate and modify Template ----------
cssTemplate2 < .cssTemplate1
cssTemplate3 < .cssTemplate1
cssTemplate4 < .cssTemplate1
cssTemplate5 < .cssTemplate1
cssTemplate6 < .cssTemplate1
cssTemplate2.template.file = fileadmin/layout/css/rsys_style.css
cssTemplate3.template.file = fileadmin/layout/css/rsys_style-overlay-1.css
cssTemplate4.template.file = fileadmin/layout/css/rsys_style-overlay-2.css
cssTemplate5.template.file = fileadmin/layout/css/rsys_style-overlay-3.css
cssTemplate6.template.file = fileadmin/layout/css/rsys_style-overlay-4.css
# ---------- Duplicate and modify Page Object ----------
cssObject2 < .cssObject1
cssObject3 < .cssObject1
cssObject4 < .cssObject1
cssObject5 < .cssObject1
cssObject6 < .cssObject1
cssObject2.typeNum = 32
cssObject3.typeNum = 33
cssObject4.typeNum = 34
cssObject5.typeNum = 35
cssObject6.typeNum = 36
cssObject2.20 < cssTemplate2
cssObject3.20 < cssTemplate3
cssObject4.20 < cssTemplate4
cssObject5.20 < cssTemplate5
cssObject6.20 < cssTemplate6
# ---------- Include ----------
page.headerData {
5 = TEXT
5 {
value (
<link rel="stylesheet" type = "text/css" media="screen" title="Style"href="rsys_layout.css">
)
insertData =1
}
}
page.headerData {
6 = TEXT
6 {
value (
<link rel="stylesheet" type = "text/css" media="screen" title="Style" href="rsys_style.css">
)
insertData =1
}
}
page.headerData {
7 = TEXT
7 {
value (
<link rel="stylesheet" type = "text/css" media="screen" title="Style" href="rsys_style-overlay-1.css">
)
insertData =1
}
}
In die Constants dann:
link_hover = green
link_normal = green
full_width = 900px
Real URL
Um schönere Namen zu haben folgendes in die localconf.php bei RealURL:
// -------------------------
// Stylesheet parsing
// -------------------------
array(
'GETvar' => 'type',
'valueMap' => array(
'rsys_layout.css' => '31',
'rsys_style.css' => '32',
'rsys_style-overlay-1.css' => '33',
'rsys_style-overlay-2.css' => '34',
'rsys_style-overlay-3.css' => '35',
'rsys_style-overlay-4.css' => '36',
'valueDefault' => '31',
),
'noMatch' => 'bypass',
),
CSS mit Markern und Strukturiert
Um folgende Sachen zu erreichen:
1.) Marker in Stylesheets verwenden zu können
2.) Stylesheets in einzeln Dateien in Untervereichnisse aufzuteillen
habe ich letzlich ein php-Skript geschrieben, welche die zentrale CSS Datei "ausgibt".
Punkt 2 ginge auch mit den @import Anweisungen von css - dies hat aber den Nachteil, dass die Browser diese dann nicht mehr parallel sondern sequentiell laden, was zu einer starken Performance Einbusse führt.
rsysstyle.php
Das Skript rsysstyle.php sieht folgendermassen aus:
<?php
$filename = $_SERVER['DOCUMENT_ROOT'] . $_SERVER['REQUEST_URI'];
$basename = preg_match('/(\/.*\/).*css/', $filename, $matches);
$basename = $matches[1];
header('Content-type: text/css');
$lines = file ( $filename);
foreach ($lines as $line_num => $line) {
if( preg_match('/\@import url\((.*css)/', $line, $matches)) {
$sublines = file ($basename . $matches[1]);
foreach ($sublines as $subline_num => $subline) {
echo parse($subline);
}
} else {
echo $line;
}
}
function parse($text) {
$replacements = array(
'#3B66BD' =>'grellrot',
);
$ret = str_replace('../../','../',$text);
foreach ($replacements as $search => $replace) {
$ret = str_replace($search, $replace, $ret);
}
return $ret;
}
?>
.htaccess
Das Skript rsysstyle.php wird mittels .htaccess Einstellungen aufgerufen wenn Stylesheets angefordert werden. Die .htaccess sieht folgendermassen aus:
# Enable URL rewriting
RewriteEngine On
RewriteRule fileadmin/layout/css/(.*)\.(css)$ rsysstyle.php?filename=$1 [C]
# Typo Standard
RewriteRule ^(typo3|t3lib|tslib|fileadmin|typo3conf|typo3temp|uploads|showpic\.php|favicon\.ico)/ - [L]
Stylesheets
Die angeforderten Stylesheets sind bei mir z.B. fileadmin/layout/css/rsys_layout.css. Die Datei rsys_layout.css sieht dabei folgendermassen aus:
@import url(./layout/layout-boxes.css);
@import url(./layout/layout-common.css);
@import url(./layout/layout-content.css);
@import url(./layout/layout-footer.css);
@import url(./layout/layout-header.css);
@import url(./layout/layout-login.css);
@import url(./layout/layout-menues.css);
@import url(./layout/layout-search.css);
Das php Skript lädt die mit @import deklarierten Stylesheets und gibt sie allessamt als eine Datei Namens rsys_layout.css aus. Der Vorteil des gesamt Konzeptes ist dass es auch ohne das Skript funktioniert - dann wird einfach der css import Befehl interpretiert.