CSS mit Markern

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.