{PROJECT} ../../template/home_nl.ini {GRAFIK_LINKS} $home/gifs/li_phpcms.gif {LOGO_1} $home/gifs/cmslogo1.gif {LOGO_2} $home/gifs/cmslogo2.gif {MENU} 00.08.12.07 {TITEL} Menu's {CONTENT}


Dynamische menu's in phpCMS

Wanneer u grotere websites wilt maken heeft u een navigatie systeem nodig. Wanneer u geen gebruikt wilt maken van frames of plug-in's, dan zit er normaal gesproken niets anders op dan handmatig op elke pagina menu-links in te voegen.
Extra vervelend is het, wanneer u achteraf een of meerdere pagina's vergeten bent, of een menu wilt wijzigen...
Om dit probleem op te lossen, heeft phpCMS een dynamisch menusysteem gekregen.

Workflow U hoeft hiervoor alleen maar een menunummer op te nemen in uw contentbestand en dit nummer samen met wat andere velden op te nemen in een menubestand. Het is mogelijk dat meerdere pagina's dezelfde menunummers gebruiken. Per project maakt u dan nog een menutemplatebestand aan, waarin u de precieze formattering van de afzonderlijke menu's vastlegd. U kunt in dit menutemplate voor actieve en niet actieve menu's afzonderlijk de opmaak met normale HTML-Tags instellen.

Bij de aanroep van het contentbestand wordt door de Parser aan de hand van het menunummer in het menubestand de status van het contentbestand uitgewisseld. Daarna worden de menu's in het template ingevoegd. Afhankelijk van de status van het contentbestand worden dan de menupunten als actief of niet-actief opgebouwd.

Submenu's worden alleen dan getoond, als ze bij het net uitgekozen (hoofd) menupunt horen. Er zijn zo theoretisch oneindig veel menulagen mogelijk. Maar om dit bruikbaar te houden kunt u dit beter beperken tot de praktische grens van maximaal 3 lagen.


Het maken van een menubestand

Een menubestand is een normaal tekstbestand, dat met iedere tekstverwerker gemaakt kan worden. De bestandsextensie is vrij kiesbaar. Ik heb mezelf aangeleerd om voor elk menubestand de extensie ".mnu" te gebruiken, zodat ik het overzichtelijk kan houden.

In menubestanden zijn geen commentaarregels toegestaan!

Als eerste kiest u een naam voor de menulaag. Ikzelf start altijd met het hoofdmenu "MAIN", maar ook deze naam is weer vrij kiesbaar. Als veldbenaming voor menunamen gebruiken we "MENU:". Dit ziet er dan bijvoorbeeld zo uit:

MENU: MAIN

Verder mag er niets op deze regel staan. Daarna gaat u verder met de keuze's voor deze menulaag. De menuklasse, de link en de naam van de menukeuze moeten minimaal ingesteld worden. Maar daarnaast kunt u naar eigen wens nog extra velden aangeven.

Extra velden gebruikt u bijvoorbeeld wanneer u in plaats van een tekstmenu gebruik wilt maken van grafische symbolen. In zo'n geval geeft u de locatie van het grafische bestand in een extra veld aan. Of u wilt gebruik maken van bijzondere scheidingstekens tussen de menukeuze's, etc. etc.

Een regel waarin een menu wordt ingesteld ziet er dan bijvoorbeeld als volgt uit:

CLASS;MNAME;LINK;TEXT ;

Zoals u wel gezien zult hebben, worden de afzonderlijke velden door een puntcomma (;) gescheiden.

De menuklasse wordt gebruikt om een lager gelegen menuoptie te koppelen aan een hoger gelegen menuoptie. Als u de menuoptie "phpCMS" als achtste menuoptie in uw hoofdmenu wilt, krijgt deze het nummer "00.08". Hieronder komen bijvoorbeeld de keuze's "Over phpCMS", "Downloaden", "Licentie", enz. De menuoptie "Over phpCMS" heeft dan het nummer "00.08.01", "Downloaden" dan "00.08.02" enzovoort.

U moet de "LINK" absoluut ten opzichte van document-root van de webserver ingeven, omdat een menu van verschillende directories van uw webserver kan worden aangeroepen.

Let daarbij op dat u bij geen van de menuopties een puntcomma (;) als veldinhoud wilt gebruiken. phpCMS zou dat als veldscheidingsteken interpreteren en daarachter het begin van het volgende veld verwachten. De veldnamen zijn vrij kiesbaar. U kunt dus bijvoorbeeld "URL" gebruiken in plaats van "LINK".

Uitzondering: "CLASS" moet zo geschreven worden, en moet in elke menudefinitie voorkomen.

Een correcte toekenning van submenu's is anders niet mogelijk.

Daarna kunt u een submenu definieren voor elke menukeuze waar u een submenu wilt. De opbouw van een submenu is identiek aan een hoofdmenu.


Voorbeeld van een menubestand

Hier als voorbeeld een stuk uit mijn eigen menubestand:

MENU: MAIN CLASS; MNAME; LINK; TEXT; 00.01; Galerie; $home/galerie/galerie.htm; Zur Galerie; 00.02; Dokumentation; $home/dokumentationen/doku.htm; Zu den Dokumentationen; 00.03; Links; $home/links/links.htm; Interessante Plätze im WWW; 00.04; Firma; $home/firma/firma.htm; Über das Unternehmen in dem ich arbeite; 00.05; Renate; $home/renate/renate.htm; Für meine Gattin; 00.06; Michael; $home/michael/michael.htm; Das ist nur für mich!; 00.07; Security; $home/security/security.htm; Alles über Security im Internet!; 00.08; phpCMS; $home/phpcms/phpcms.htm; Mein Content-Management-System;   MENU: SUB1 CLASS; MNAME; LINK; TEXT; 00.01.01; Sageders Abschied; $home/galerie/sageder.htm; Als Walter Sageder unser Unternehmen verlassen hat.; 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;


Het maken van een menutemplate

In menutemplates wordt de layout van de menu's gedefinieerd. Menutemplates zijn normale tekstbestanden, en kunnen dus met elke tekstverwerker worden gemaakt. De bestandsextensie is ook hier weer vrij kiesbaar. Ik heb er zelf voor gekozen om mijn menutemplates te voorzien van de extensie ".mtpl". commentaarregels beginnen met een puntcomma (;) en zijn hier weer toegestaan. Velden in een menutemplate beginnen met hetzelfde veldscheidingsteken als bij contentbestanden of templates. De layoutdefinitie van alle menu's in een project worden in dit bestand genoteerd.

Een layoutdefinitieblok begint met de menunaam, gevolgd door het sleutelwoord ".PRE".

Dat ziet er bijvoorbeeld zo uit:

{MAIN.PRE}

Daarachter komen de HTML-Tags, die voor de menuoptie moeten komen:

<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0><TR>

Als een menunaam, wordt gevolgd door het sleutelwoord ".NORMAL" vertellen we de Parser daarmee, dat hierachter de HTML-Tags voor niet actieve menuopties volgen:

{MAIN.NORMAL}

Daarna komt de definitie van tags, die voor het weergeven van een niet actieve menuoptie wordt gebruikt:

<TD><FONT FACE="Arial" class="mainmenu"><FONT POINT-SIZE=10pt><A HREF="{LINK}" onMouseOver="window.status='{TEXT}';return true;" class="main"> {MNAME} </A></FONT></FONT></TD>

Zoals je hier goed kunt zien, worden in de HTML-code op de plek waar later de afzonderlijke onderdelen van het menu komen te staan bladwijzers ingezet, die van te voren in het menubestand zijn gedefinieerd. In het voorbeeld hiervoor zijn dat de velden {LINK}, {TEXT} en {MNAME}. Het veld {CLASS} wordt uitsluitend door de Parser intern gebruikt om de juiste plaatsing van de submenu's onder het hoofdmenu te kunnen realiseren. Daarom kom je deze in de layoutdefinitie ook niet tegen.

Vervolgens definieren we met de menunaam, gevolgd door het sleutelwoord ".AKTIV" de HTML-tags voor de actieve menu-opties. Dit is gelijk aan de niet actieve menuopties.

Met de menunaam gevolgd door ".PAST" sluit je de layoutdefinitie van deze menulaag af:

{MAIN.PAST}

Daarna definieer je weer de tags, die direct achter het te tonen menu moeten worden getoond.


Voorbeeld van een menutemplate.

Hier als voorbeeld een stukje uit mijn eigen menutemplate:

{MAIN.PRE} <!-- Main Menu starts --> <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0><TR>   {MAIN.NORMAL} <TD><FONT FACE="Arial" class="mainmenu"><FONT POINT-SIZE=10pt><A HREF="{LINK}" onMouseOver="window.status='{TEXT}';return true;" class="main"> {MNAME} </A></FONT></FONT></TD>   {MAIN.AKTIV} <TD><FONT FACE="Arial" class="mainmenu"><FONT POINT-SIZE=10pt><B><A HREF="{LINK}" onMouseOver="window.status='{TEXT}';return true;" class="maina"> {MNAME} </A></B></FONT></FONT></TD>   {MAIN.PAST} </TR></TABLE> <!-- Main Menu ends -->   {SUB1.PRE} <!-- Sub Menu 1 starts --> <FONT FACE="Arial" class="mainmenu"><FONT POINT-SIZE=10pt> <BR></FONT></FONT><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>   {SUB1.NORMAL} <TR><TD><FONT FACE="Arial" class="mainmenu"><FONT POINT-SIZE=10pt>  </FONT></FONT></TD><TD><FONT FACE="Arial" class="mainmenu"><FONT POINT-SIZE=10pt><A HREF="{LINK}" onMouseOver="window.status='{TEXT}';return true;" class ="sub"> {MNAME} </A></FONT></FONT></TD></TR>   {SUB1.AKTIV} <TR><TD><FONT FACE="Arial" class="mainmenu"><FONT POINT-SIZE=10pt>  </FONT></FONT></TD><TD><FONT FACE="Arial" class="mainmenu"><FONT POINT-SIZE=10pt><B><A HREF="{LINK}" onMouseOver="window.status='{TEXT}';return true;" class = "suba"> {MNAME} </A></B></FONT></FONT></TD></TR>   {SUB1.PAST} </TABLE> <!-- Sub Menu 1 ends -->  


Het toekennen van contentbestanden aan menupunten.

Het toekennen van contentbestanden aan menupunten gebeurd door het vooraf gedefinieerde veld "MENU" in het contentbestand op te nemen. Dat ziet er dan bijvoorbeeld zo uit:

{MENU}
00.08.12.07

Deze schrijfwijze zou dit contentbestand aan de hoofdmenuoptie "8", van de submenuoptie "6" (op de eerste laag) en de submenuoptie van de tweede laag "7" koppelen.