Vinzenz Mai: SSI: Verlinke niemals auf die aktuelle Seite

Beitrag lesen

Hallo Matthias,

Bisher habe ich für jedes Jahr eine include.
Vielen Dank für deine ausführliche Anleitung.

ich helfe und lerne gerne :-)

Wenn Du nun noch die Jahresangabe, die in jeder URI steckt, über eine Variable steuerst, dann musst Du für jedes neue Jahr nur noch an einer einzigen Stelle eine Änderung vornehmen. Wenn Du das Jahr aus dem Pfad zum Skript ermitteln kannst, so kannst Du eine Include-Datei schreiben, die für alle Jahre gleich ist.

ich meine hier: Ermitteln mit SSI!

btw. ist es eine gute Idee, den Titel zu missbrauchen oder verwendet man besser ein eigenes Attribut <body jahreszahl="2010">?

nicht aus dem Dokument, sondern - ähnlich wie im Tutorial angegebenen Beispiel - aus den Pfadangaben, die eine bestimmte Struktur einhalten müssen, ermitteln.

Beispiel wäre folgende Verzeichnisstruktur, die Deiner jetztigen Verzeichnis- und Dateistruktur entspricht (auch wenn nicht alle Dateien und Verzeichnisse vorhanden sind):

/
|
|- 2009/
|      |- bw-2009.html
|      |- by-2009.html
|      |- ...
|
|- 2010/
|      |- bw-2010.html
|      |- by-2010.html

Schauen wir uns ein paar Umgebungsvariablen an. Für Deinen Anwendungsfall kommen DOCUMENT_URI und DOCUMENT_NAME wie gerufen. Diese stehen bei mod_include, der Voraussetzung für SSI (unter apache) stets zur Verfügung.

<!-- Wir schauen uns an, was es alles an Umgebungsvariablen gibt -->  
<pre>  
<!--#printenv -->  
</pre>

Wir schauen uns den kompletten Pfad zur aufgerufenen Ressource an und den Namen des Dokumentes:

<p>DOCUMENT_URI: <!--#echo var="DOCUMENT_URI" --></p>
<p>DOCUMENT_NAME: <!--#echo var="DOCUMENT_NAME" --></p>

Wir ermitteln, ob im Pfad eine (mindestens) vierstellige Zahl vorkommt. Wenn ja, speichern wir diese vierstellige Zahl in der Variablen mit dem Namen "jahr". Dazu nutzen wir einen regulären Ausdruck mit Merken von Teilausdrücken, siehe auch http://de.selfhtml.org/perl/sprache/regexpr.htm#merken@title=SELFHTML:

<!--#if expr="${DOCUMENT_URI} = /\/([0-9]{4,})\/${DOCUMENT_NAME}$/"  
    <!--#set var="jahr" value="${1}" -->  
<!--#endif -->  
<!--#echo var="jahr" -->  

Erläuterung des regulären Ausdrucks:

${DOCUMENT_URI}   # Wenn wir im Inhalt der Umgebungsvariablen DOCUMENT_URI
= /               # Begrenzungszeichen des regulären Ausdrucks
/                # ab irgendeinem Punkt einen Slash (den wir mit einem
                  # Backslash maskieren müssen, weil der Slash das
                  # Begrenzungszeichen des regulären Ausdrucks darstellt)
                  # finden,
(                 # Wir fangen den Teilausdruck ein
[0-9]             # Der Teilausdruck fängt mit einer Ziffer an,
{4,}              # es sind mindestens vier Ziffern
                  # (damit wir kein Jahr-10000-Problem bekommen [1])
)                 # Wir beenden das Einfangen.
/                # nach den Ziffern folgt ein Slash (maskiert, s.o)
${DOCUMENT_NAME}  # gefolgt vom Inhalt der Umgebungsvariablen DOCUMENT_NAME
                  # (siehe Variablen-Substitution),
$                 # gefolgt vom Ende der Zeichenkette
/                 # Ende des regulären Ausdrucks

Den Teilausdruck, den wir fangen ist die mindestens vierstellige Zahl, die das tiefste Unterverzeichnis im Pfad der URI angibt.

Da es der erste Teilausdruck ist, den wir einfangen, können wir später über die Variable $1 darauf zugreifen. Im Erfolgsfall speichern wir das Jahr in der Variablen jahr zwischen. Das Jahr müssen wir nur ein einziges Mal ermitteln, da im Menü alle Verweise auf das gleiche Jahr verweisen, nur unterschiedliche Bundesländer.

Bauen wir die URI zusammen (am Beispiel von Baden-Württemberg):

<!--#set var="uri" value="bw-${jahr}.html" -->
An den festen Text

bw-

hängen wir den Inhalt der Variablen jahr und daran den festen Text

.html

und erfüllen so das von Dir vorgegebene Namensschema unabhängig davon, in welchem Jahresverzeichnis wir uns befinden. Siehe ebenfalls Abschnitt Variablen-Substitution in der Doku.

<li>  
<!-- Stimmt der Name des geladenen Dokuments mit dieser Zeichenkette überein -->  
<!-- geben wir den Menüpunkt unverlinkt aus -->  
<!--#if expr="${DOCUMENT_NAME} = ${uri}" -->  
    Baden-Württemberg  
<!--#else -->  
    <!-- müssen wir verlinken -->  
    <a href="[code lang=apache]<!--#echo var="uri" -->
~~~">Baden-Württemberg</a>  
<!--#endif -->  
</li>[/code]  
  
Andere Bundesländer analog. Dadurch, dass Du das Jahr aus dem Verzeichnis ausliest, kannst Du die gleiche Include-Datei für jedes Jahr verwenden. Verbesserungspotential ist noch genug vorhanden, unter anderem verletze ich derzeit an mindestens einer Stelle [DRY](http://de.wikipedia.org/wiki/DRY). Du willst am Wochenende noch genug Stoff zum Experimentieren haben. Viel Spass mit SSI, Du siehst, dass man damit eine Menge erreichen kann.  
  
  
Freundliche Grüße  
  
Vinzenz  
  
[1] [Gunnar und seth](/archiv/2006/3/t126272/#m814810) haben mich für die Ewigkeit beeindruckt!