{PROJECT} ../../template/doc.de.ini {ROBOTS}INDEX, FOLLOW {DESCRIPTION}Die automatische menü-Verwaltung ist eine der mächtigsten Funktionen von phpCMS. Hier lest Ihr, wie das funktioniert und was Ihr tun müßt um das einzusetzen. {MENU} 00.06.07 {TITEL} Menüs {CONTENT}
- Dynamische Menüs in phpCMS.
- Erstellen einer Menü-Datei.
- Beispiel einer Menü-Datei.
- Erstellen eines Menü-Templates.
- Beispiel eines Menü-Templates.
- Einbinden des Menüs in das Seiten-Template.
- Besondere Menüart: CURRENT
- Zuordnen von Content-Dateien zu Menüpunkten.

Wenn Ihr größere Web-Projekte realisiert, die mehrere oder gar viele Seiten umfassen, benötigt Ihr ein Navigationssystem. Wollt Ihr keine Frames oder Plug-In's einsetzen, bleibt Euch im Normalfall gar nichts anderes übrig, als jeden neuen Menüpunkt in jeder Seite Eures Projektes manuell nachzutragen.
Besonders peinlich ist, wenn man dann eine oder gar mehrere Seiten vergißt. Um diese Verwaltungstätigkeit möglichst gering zu halten, bietet phpCMS ein dynamisches Menüsystem.

In jeder Content-Datei wird eine Menünummer vergeben. Parallel dazu wird eine Menüdatei angelegt, in der die Menünummern und weitere Felder notiert werden. Natürlich können auch mehrere Seiten die gleiche Menünummer haben. Pro Projekt legt Ihr dann noch eine Template-Datei an, in der die geanue Formatierung der einzelnen Menüs festgelegt wird. Ihr könnt in dem Menü-Template je eine Formatierung für aktive und passive Menüpunkte definieren.

Beim Abruf der Content-Datei wird nun vom Parser anhand der Menünummer in der Menüdatei der Status der Content-Datei ermittelt. Dann werden die Menüs in das Template eingesetzt. Abhängig vom Status der Content-Datei werden dann die Menüpunkte als aktiv oder als inaktiv dargestellt.

Untermenüs werden nur dann angezeigt, wenn sie zum gerade ausgewählten Obermenüpunkt passen. Es sind theoretisch beliebig viele Menüebenen möglich. Wegen guter Bedienbarkeit solltet Ihr aber nicht mehr als drei Menüebenen einsetzen.

Eine Menü-Datei ist ein normales Text-File, das Ihr mit jedem Text-Editor bearbeiten könnt. Die Dateiendung ist frei wählbar. Ich habe mir der Übersicht wegen angewöhnt, Menü-Dateien auf ".mnu" enden zu lassen.

In Menü-Dateien sind keine Kommentarzeilen zulässig!

Zuerst vergebt Ihr einen Namen für die Menüebene. Ich starte immer mit dem Hauptmenü "MAIN", der Name ist aber wieder frei wählbar. Die Feldbezeichnung für den Menünamen ist "MENU:". Die Zeile sieht also so aus:

> MENU: MAIN

Sonst darf nichts in dieser Zeile stehen. Danach überlegt Ihr Euch, welche Felder Ihr für diese Menüebene vergeben wollt. Die Menüklasse, der Link und der Name des Menüpunktes müssen mindestens angegeben werde. Zusätzlich könnt Ihr noch beliebig viele andere Felder angeben.

Weitere Felder machen dann Sinn, wenn Ihr z.B. statt eines Text-Menüs grafische Symbole verwenden wollt. In diesem Fall gebt Ihr ein weiteres Feld an, das dann auf den Speicherort der Grafik zeigt. Oder Ihr wollt besondere Trennzeichen für Menüpunkte benutzen, etc.

Die Zeile mit den Feldern sieht dann so aus:

`

      CLASS;    MNAME;    LINK;    TEXT;

`

- "CLASS" ist der Feldnamen für die Menüklasse, die in der Content-Datei angegeben wird.
- "MNAME" ist der Platzhalter für den Text, der als Menüpunkt angezeigt wird.
- "LINK" ist die Adresse, auf die verwiesen wird, wenn der Menüpunkt ausgewählt wurde. Wenn Ihr hier die Variable "$home" benutzt, muß diese in der PROJECT-Datei definiert sein. Andernfalls müssen die Pfade absolut zum ROOT-Directory Eures Webservers angegeben werden.
- "TEXT" habe ich bei meinen Menüs zusätzlich definiert. Dieser Text wird in der Statuszeile angezeigt, wenn man mit der Maus über den Menüpunkt fährt.

Wie Ihr sicher bemerkt habt, werden die einzelnen Felder durch Semikolone (;) getrennt.

Die Menüklasse dient zur Zuordnung von Untermenüpunkten. Angenommen wir haben einen Hauptmenüpunkt "phpCMS" der an 8. Stelle in Eurem Hauptmenü steht. Dieser Hauptmenüpunkt hat dann die Menüklasse "00.08". Diesem Hauptmenüpunkt werden nun die Untermenüpunkte "Über phpCMS", "Download", "Lizenz", "Features", "Voraussetzungen", "Konfiguration" und "Dokumentation" zugeordnet. Der Untermenüpunkt "Über phpCMS" hätte nun die Menüklasse "00.08.01", der Untermenüpunkt "Download" die Klasse "00.08.02" und so fort.

Den "LINK" gebt Ihr absolut zum Document-Root Eures Webservers an. Das ist erforderlich, weil das Menü ja von unterschiedlichsten Unterverzeichnissen Eures Webservers aufgerufen wird.

Achtet darauf, daß Ihr bei keinem der Menü-Felder ein Semikolon (;) im Feldinhalt habt. phpCMS würde das als Feldtrennzeichen interpretieren und dahinter den Beginn des nächsten Feldes annehmen. Die Namen der Feldbezeichner sind frei wählbar. Statt "MNAME" könntet Ihr also auch "MENÜNAME" schreiben.

Ausnahme: "CLASS" und "LINK" müssen genau so geschrieben werden und müssen auch in der Menü-Definition vorkommen.

Die korrekte Zuordnung von Untermenüs wäre sonst nicht möglich.

Untermenüs werden dann für jeden Menüpunkt definiert, bei dem es sie gibt. Verfahrt bei der Definition von Untermenüs genau so wie bei der Definition des Hauptmenüs.

Hier nun als Beispiel ein Auszug aus meiner Menü-Datei:

`

    MENU: MAIN
    CLASS;  MNAME;           LINK;                   TEXT;
    00.01;  Galerie;         $home/galerie.htm;  Zur Galerie;
    00.02;  Dokumentationen; $home/doku.htm;     Zu den Dokumentationen;
    00.03;  Links;           $home/links.htm;    Interessante Plätze im WWW;
    00.04;  Firma;           $home/firma.htm;    Über das Unternehmen in dem ich arbeite;
    00.05;  Renate;          $home/renate.htm;   Für meine Gattin;
    00.06;  Michael;         $home/michael.htm;  Das ist nur für mich!;
    00.07;  Security;        $home/security.htm; Alles über Security im Internet!;
    00.08;  phpCMS;          $home/phpcms.htm;   Mein Content-Management-System;

    MENU: SUB1
    CLASS;      MNAME;          LINK;                           TEXT;
    00.01.01;   Sageder;        $home/galerie/sageder.htm;  Walter Sageder;
    00.01.02;   Leo '99;        $home/galerie/leo99.htm;    Wie ich den Leo 99 gewann;
    00.01.03;   Diverse Bilder; $home/galerie/diverse.htm;  Allerlei;
    00.01.04;   EBS;            $home/galerie/ebs/ebs.htm;  Bilder vom Projekt;

`

Natürlich ist das nur ein Beispiel und die Inhalte müssen durch Eure Begriffe ersetzt werden.

In Menü-Templates wird das Layout der Menüs definiert. Menü-Templates sind normale Text-Dateien, können also mit jedem Text-Editor bearbeitet werden. Die Datei-Endung ist wieder frei wählbar. Meine Menu-Templates enden auf ".mtpl". Kommentarzeilen beginnen mit einem Semikolon (;) und sind hier wieder erlaubt. Felder beginnen bei Menü-Templates mit den gleichen Feld-Trennzeichen wie in Content-Dateien oder Templates. Ich benutze die geschwungene Klammern dafür. Die Layoutdefinitionen aller Menüs eines Projekts werden in dieser Datei notiert.

Ein Layout-Definitions-Block beginnt mit dem Menünamen, gefolgt von dem Schlüsselwort ".PRE". Das sieht z.B. so aus:

> {MAIN.PRE}

Dahinter folgen die HTML-Tags, die vor dem Menü angezeigt werden sollen:

> <table border="0" cellspacing="0" cellpadding="0"><tr>

Mit dem Menünamen, gefolgt von dem Schlüsselwort ".NORMAL" teilen wir dem Parser mit, daß nun die Definition der HTML-Tags für inaktive Menüpunkte folgt:

> {MAIN.NORMAL}

Danach folgt die Definition jener Tags, die für die Darstellung eines inaktiven Menüpunktes benutzt werden:

> <td><a href="{LINK}" title="{TEXT}" class="main"> {MNAME} </a></td>

Wie Ihr hier sehr gut sehen könnt, werden in den HTML-Code dort wo später die einzelnen Element der Menüs stehen sollen jene Platzhalter eingesetzt, die zuvor in der Menü-Datei definiert wurden. In der Zeile oben sind das die Felder {LINK}, {TEXT} und {MNAME}. Das Feld {CLASS} wird nur vom Parser intern verwendet um die richtige Zuordnung von Untermenüpunkten zu Hauptmenüpunkten zu realisieren. Deshalb kommt es in der Layoutdefinition auch nicht vor.

Als Nächstes definieren wir mit dem Menünamen, gefolgt von dem Schlüsselwort ".AKTIV" die HTML-Tags für Aktive Menüpunkte. Ihr verfahrt hier wie bei inaktiven Menüpunkten.

Mit dem Menünamen gefolgt von ".PAST" beendet Ihr die Layoutdefinition dieser Menüebene:

> {MAIN.PAST}

Dahinter wieder jene Tags notieren, die nach dem Menü angezeigt werden sollen.

Hier nun als Beispiel ein Auszug aus meinem Menü-Template:

`

    {MAIN.PRE}
    <!-- Main Menu starts -->
    <table border="0" cellspacing="0" cellpadding="0"><tr>

    {MAIN.NORMAL}
    <td><a href="{LINK}" title="{TEXT}" class="main"> {MNAME} </a></td>

    {MAIN.AKTIV}
    <td><b><a href="{LINK}" title="{TEXT}" class="maina"> {MNAME} </a></b></td>

    {MAIN.PAST}
    </tr></table>
    <!-- Main Menu ends -->

    {SUB1.PRE}
    <!-- Sub Menu 1 starts -->
    <table border="0" cellspacing="0" cellpadding="0">

    {SUB1.NORMAL}
    <tr><td><a href="{LINK}" title="{TEXT}" class="sub"> {MNAME} </a></td></tr>

    {SUB1.AKTIV}
    <tr><td><b><a href="{LINK}" title="{TEXT}" class="suba"> {MNAME} </a></b></td></tr>

    {SUB1.PAST}
    </table>
    <!-- Sub Menu 1 ends -->

`

Jetzt müssen wir noch im Template für die Content-Seite eintragen, wo und wie das Menü angezeigt wird. Ihr notiert dafür in der Template-Datei einfach den Feldbezeichner "MENU" mit dem Attribut "NAME=" und den Menünamen, als z.B. für das Hauptmenü den Namen "MAIN". Habt Ihr Eure Sub-Menüs erster Ebene, wie im obigen Beispiel, "SUB1" genannt, notiert Ihr im Template diesen Namen an der Position, wo später das Submenü angezeigt werden soll, z.B.:

`

    <html>
    <body>
    <table>
    <tr><td>Erste Splate links oben</td><td>{MENU NAME="MAIN"}</td></tr>
    <tr><td>{MENU NAME="SUB1"}</td><td>Hier steht der Content</td></tr>
    </table>
    </body>
    </html>

`

Das entspricht einer Aufteilung der Seite, wie auf dieser Website. Zusätzlich könnt Ihr bei der Notation des Menüs in der Template-Datei auch noch einen Namen für ein Menütemplate angeben, mit dem diese Menüebene angezeigt werden soll. Dafür muß ein entsprechendes Menütemplate natürlich in der Menü-Template-Datei definiert sein. Die Notation sieht dann so aus:

> {MENU NAME="MAIN" MENTEMP="LINE"}

In diesem Beispiel werden also die Menüeinträge für das Menü "MAIN" aus der Menüdatei gelesen. Dann werden diese Menüeinträge mit dem Menü-Template "LINE" geparsed, daß In der Menü-Template-Datei notiert ist.

Diese Funktion ist hilfreich, wenn Ihr den Inhalt eines Menüs erneut, in anderem Layout auf der selben Seite anzeigen wollt, oder wenn Ihr den bisherigen Pfad durch die Menüebenen anzeigen wollt (Brotkrümelnavigation). Dem Download liegt eine Beispiel-Site bei, in der eine solche Navigation realisiert ist.

In manchen Fällen möchte man nur all jene Menüpunkte anzeigen, die sich auf der selben Menüebene befinden wie der gerade ausgewählte Menüpunkt. Das erreicht man durch die Notation:

> {MENU NAME="CURRENT" MENTEMP="SUB1"}

Durch das Schlüsselwort "CURRENT" wird nur die gewünschte Menüebene angezeigt. Wichtig ist die Angabe eines Menütemplates, da sonst im jeweiligen Menütemplate des ausgewählten Menüs angezeigt wird. Das bedeutet aber, daß die erforderlichen Felder in der Menüdefinition vorhanden sein müssen.

Die Zuordnung von Content-Dateien zu Menüpunkten erfolgt durch das vordefinierte Feld "MENU" in der Content-Datei. Das sieht z.B. so aus:

> {MENU}
> 00.08.06.07

Diese Notation würde also das Content-Dokument zum Hauptmenüpunkt "8", zum Untermenüpunkt der ersten Ebene "6" und zum Untermenüpunkt der zweiten Ebene "7" zuordnen. Es können ohne weiteres mehrere Dokumente diesen Menüpunkten zugeordnet werden.

Auf Anregung von Emile habe ich ein Feature eingebaut: Ihr könnt in Zukunft die Angabe der Menüklasse in der Content-Datei unterlassen. In diesem Fall sucht der Parser nach einem passenden Eintrag mit der gleichen URL in der Menüdatei. Dann ist aber wichtig, daß die Menüdatei in der Reihenfolge aufgebaut ist, in der auch die Einträge hierachisch angeordnet sind, da der Parser die Menüs beim Auslesen von Oben nach Unten durchläuft.

Gebt Ihr trotzdem eine Menüklasse im Content-Dokument an, überschreibt dieser Wert den automatisch ermittelten Wert.