Wie wird ein Menü als Punkteliste generiert?
Ein Menü als Punkteliste und nicht als GMENU aufzubauen hat verschiedene Vorteile:
- Die Übertragungszeit der Seite ist schneller.
- Schriften wirken schärfer als die, die der GIFBUILDER erzeugt
- Wenn der Text zu lang werden sollte, wird automatich eine neue Zeile angefangen. Der Text steht dabei in jeder Zeile immer bündig untereinander.
- Die so erzeugten Menüeinträge sind "barrierefrei"
- Die Suchmaschinen können die Links hervorragend analysieren
Das Punkteliste-Menü baut dabei auf das normale TMENU auf.
TypoScript (Setup)
Beschreibung des Sourcecodes:
In der Zeile 1 wird dem Marker MENU das cObjekt HMENU zugewiesen.
In diesem Beispiel wird der Einstiegspunkt für das Menü auf die Seite mit der ID 5 gelegt. Für die generierung der 2. Menüebene gibt man hier noch die Seitenbaum-Ebene an, ab der die 2. Menüebene generiert werden soll.
In den Zeile 6-19 wird dann die erste Menüebene definiert.
Das noBlur = 1 wird nur benötigt, wenn die Seite möglichst barrierefrei sein soll.
In Zeile 9 wird die komplette 1. Menüebene mit dem <ul>-Tags umschlossen.
Anstatt der linkWraps muss nun wrapItemAndSub verwendet werden. Somit wird jetzt ein Link ohne Untermenü mit <li>...</li> umschlossen; ein Link mit Untermenü allerdings nur mit <li>... . Dadurch, das die nächste Menüebene wieder mit einem <ul>-Tag anfängt, wird die Punkteliste sauber generiert.
Zeile 12 sorgt noch dafür, daß jedem Link ein <title>-Tag aus dem Datenbankfeld mitgegeben wird.
Wenn in den Datenbankfeldern der Seite sowohl abstract als auch description nicht eingetragen ist, wird zumindest der Seitentitel eingetragen.
Zeile 15 kopiert die Definition noch vom Normal-Zustand in den Zustand, der aktiv ist, wenn die Seite geöffnent ist.
Zeile 16 entfernt nun noch den Link auf diese Seite, da er hier nicht notwendig und bei barrierefreien Seiten auch nicht gewünscht ist.
Diese Definition wird dann nur noch in Zeile 18 und 19 für die 2. und 3. Menüebene generiert.
Nun kann man diese Menü mit CSS grafisch noch verfeinern. Ein paar Beispiele wird es mit der nächsten Bearbeitung dieses Tutorials geben.
Kommentare von registrierten Benutzern:
Da ein Link nicht auf die gerade aktuelle Seite zeigen sollte, wird der Link der aktuellen Seite herausgenommen und mit einem strong-Tag ersetzt. Bei einem Link aus der zweiten Ebene wird zusätzlich der übergeordnete Link der ersten Ebene mit einem em-Tag gezeichnet.
So ist für den User sein momentaner Standort auch ohne CSS erkennbar.
XHTML 1.0 Strict konforme Listennavigation erzeugen nach dem folgenden Schema:
Ausschnitt aus dem Template (TemplaVoila):
| Html4strict: | Zeilennummerierung: An / Aus |
Mapping:
TypoScript Object Path -> lib.mainnav
Mapping rules -> ul:INNER
TypoScript (Setup):
| Typoscript: | Zeilennummerierung: An / Aus |
- # Hauptnavigation
- lib.mainnav = HMENU
- lib.mainnav {
- entryLevel = 0
- 1 = TMENU
- 1 {
- noBlur = 1
- expAll = 1
- NO = 1
- NO {
- wrapItemAndSub = <li>|</li>
- }
- CUR = 1
- CUR {
- wrapItemAndSub = <li>|</li>
- doNotLinkIt = 1
- ATagBeforeWrap = 1
- linkWrap = <strong>|</strong>
- }
- ACTIFSUB = 1
- ACTIFSUB {
- wrapItemAndSub = <li>|</li>
- ATagBeforeWrap = 1
- linkWrap = <em>|</em>
- }
- }
- 2 = TMENU
- 2 {
- noBlur = 1
- wrap = <ul>|</ul>
- NO = 1
- NO {
- allWrap = <li>|</li>
- }
- CUR = 1
- CUR {
- ATagBeforeWrap = 1
- linkWrap = <li><strong>|</strong></li>
- doNotLinkIt = 1
- }
- }
- }
Um auch aufwendige CSS-Gestaltung der Navigation zu ermöglichen, können wir (wie hier im Forum mehrfach erklärt) die verschiedene Zustände der Listenpunkte durch TypoScript mit class oder id ausstatten lassen.
Alternativ können wir den Listen der ersten Ebene id-s (mit Hilfe der OptionSplit) vergeben. Dazu bekommen die body-Tags der ersten Seiten-Ebene class-en.
das funzt perfekt
| Typoscript: | Zeilennummerierung: An / Aus |
- temp.nav_sub {
- noBlur = 1
- wrap = <div id="submenu">| </div>
- entryLevel =2
- excludeUidList =
- 1 = TMENU
- 1 {
- noBlur = 1
- expAll = 0
- wrap = <ul>|</ul>
- NO = 1
- NO.allWrap = <li >|</li>
- ACT = 1
- ACT.wrapItemAndSub = <li class="current">|</li>
- ACTIFSUB = 1
- }
- }
- 2 = TMENU
- 2 {
- noBlur = 1
- wrap = <ul>|</ul></li>
- expAll = 0
- NO = 1
- NO.allWrap = <li >|</li>
- ACT = 1
- ACT.wrapItemAndSub = <li class="current">|</li>
- ACTIFSUB = 1
- }
- 3 < .2
- 4 < .2
- }
Hier ist ein etwas umfangreicherer, XHTML konformer Vorschlag für ein hierarchisch nummeriertes Menü.
Anforderung war, dass ein Zweig des Seitenbaums auf allen Seiten als submenu zu sehen ist.
Vielen Dank an Joey (J. Hasenau, TypoScript Experte), der den Grundvorschlag im Typo3 Kochbuch gemacht hat und der den Feinschliff für dieses Beispiel beisteuerte.
So ist das ausgegebene Submenü aufgebaut:
| Typoscript: | Zeilennummerierung: An / Aus |
- #temp.submenu
- temp.submenu = COA
- temp.submenu {
- 10 = HMENU
- 10 {
- special = directory
- special.value = 29
- #entryLevel = 1
- 1 = TMENU
- 1 {
- noBlur = 1
- wrap = <ul>|</ul>
- NO = 1
- NO {
- linkWrap = |<span class="hidden">.</span>
- wrapItemAndSub = <li>|</li>
- stdWrap.prepend = COA
- stdWrap.prepend {
- 10 = LOAD_REGISTER
- 10 {
- # L2N: Level2Number
- tempN.data = register:L2N
- tempN.wrap = |+1
- L2N.data = register:tempN
- L2N.prioriCalc = 1
- L3N = 0
- }
- 20 = COA
- 20 {
- stdWrap.noTrimWrap = |<dfn>3.|</dfn> |
- 10 = TEXT
- 10.data = register:L2N
- }
- }
- }
- ACT = 1
- ACT {
- wrapItemAndSub = <li class="parent">|</li>
- }
- CUR = 1
- CUR {
- linkWrap = <span class="current">|</span><span class="hidden">.</span>
- doNotLinkIt = 1
- }
- }
- 2 < .1
- 2 {
- 10 {
- # L3N: Level1Number
- tempN.data = register:L3N
- L2N >
- L3N.data = register:tempN
- L3N.prioriCalc = 1
- }
- 20 {
- 10.wrap = |.
- 20 = TEXT
- 20.data = register:L3N
- }
- }
- }
- }
- }
- # in the rootline of the active submenu no 'directory' but 'entryLevel' for subsubmnues
- [PIDinRootline = 29]
- temp.submenu.10.special >
- temp.submenu.10.entryLevel = 1
- # Home page without subemnu
- [globalVar = TSFE:id = 47]
- temp.submenu >
- temp.submenu = TEXT
- temp.submenu.value =
- [END]
Anmerkungen:
1. Das Menü wurde mit der Eigenschaft "special = directory" angelegt. So kann es auf allen Seiten angezeigt werden. "special = directory" erlaubt aber nur die Darstellung einer Menüebene und zeigt keine Submenüs an. Daher wird in der Rootline des im Menü dargestellten Zweigs des Seitenbaums die Eigenschaft special gelöscht und statt dessen der passende "entryLevel" definiert. Auf der Startseite soll das Submenü nicht angezeigt werden, daher wird dort der Marker mit dem Text "" (Nichts) versehen.
2. Der unsichtbare Punkt (für den Screenreader, der dadurch die Stimme etwas senkt) soll nach jedem Link stehen, auch wenn ein Submenü folgt, das vom <li>-Tag eingeschlossen wird. Daher wird zweimal ge-wrapt. Einmal der Link (linkWrap) und einmal das Item einschließlich des Submenüs (wrapItemAndSub).
3. Die Nummerierung wird per CSS ebenfalls unsichtbar formatiert (weit aus dem Blickfeld gerückt). Der nachfolgende Linktext soll mit einem Leerzeichen beginnen. Da in einem COA-Element "noTrimWrap" nicht möglich ist, braucht es ein "stdWrap.noTrimWrap = |<dfn>3.|</dfn> |" (Danke an Jooey). Die Pipes zeigen Anfang und Ende des umgebenden Strings an. Das Pipe in der Mitte ist der Platzhalter für die nachfolgende Zahl der Nummerierung.
4. Die im ersten NO-Element festgelegten Eigenschaften, werden an die anderen Zustände weitestmöglich kopiert, so dass das Typoscript einigermaßen übersichtlich bleibt. ACT und CUR Definitionen vererben sich automatisch in nächste Ebene. Dort muss nur überschrieben werden, was sich von der ersten Ebene unterscheidet.
5. Wie das mit der Nummerierung genau funktioniert kann im Typo3 Kochbuch nachgelesen werden.
CSS- Beispiel dazu:
| Html4strict: | Zeilennummerierung: An / Aus |
- <style type="text/css">
- .hidden, dfn {
- position: absolute;
- left: -1000px;
- top: -10000px;
- width: 0;
- height: 0;
- overflow:hidden;
- display:inline;
- }
- #submenu {
- float: left;
- width: 191px;
- }
- #submenu ul{
- margin: 0;
- padding: 0;
- list-style: none;
- }
- #submenu li{
- margin: 0 0 2px 0;
- }
- *html #submenu li{
- margin: 0;
- border-bottom: 2px solid #fff;
- }
- *html #submenu ul ul{
- margin: 0 0 -2px 0;
- }
- #submenu ul a,
- #submenu ul a:link,
- #submenu ul a:visited,
- #submenu ul .current {
- display: block;
- padding: 5px 5px 4px 8px;
- color: #fff;
- background-color: #0075A1;
- text-decoration: none;
- }
- #submenu ul a:hover,
- #submenu ul .current,
- #submenu ul li.parent a,
- #submenu ul li.parent a:link,
- #submenu ul li.parent a:visited {
- color: #fff;
- background-color: #0087B7;
- }
- #submenu ul ul a,
- #submenu ul ul a:link,
- #submenu ul ul a:visited,
- #submenu ul li.parent ul a,
- #submenu ul li.parent ul a:link,
- #submenu ul li.parent ul a:visited,
- #submenu ul li.parent ul .current{
- display: block;
- padding: 5px 5px 4px 8px;
- color: #0075A1;
- background-color: #d2f0ff;
- }
- #submenu ul ul a:hover,
- #submenu ul li .current ul a:hover,
- #submenu ul li.parent ul a:hover,
- #submenu ul li.parent ul .current{
- font-weight: bold;
- padding-left: 22px;
- background-image: url(img/submenu_bullet.gif);
- background-position: 10px;
- background-repeat: no-repeat;
- }
- </style>
auch für Typo3 1.4.1 :
XHTML konform
Das Haupt und das Submenü sind auf zwei unterschiedliche Marker gelegt, was aber eine Anpassung auf jede Unterseite des Hauptmenüs erfordert. Danach werden die Unterseiten in der Liste des Submenüs als Unterpunkte dargestellt.
Außerdem wird vor jedem Submenüpunkt ein >> geschrieben, welches bei der aktiver Seite Rot erscheinen; dies ist für die Ausgabe mit CSS Formatierung gedacht, wenn die Listenpunkte ausgeblendet werden.
| Typoscript: | Zeilennummerierung: An / Aus |
- MENU = HMENU
- MENU {
- wrap = <ul> | </ul>
- special = directory
- special.value = 23
- 1 = TMENU
- }
- SUBMENU = COA
- SUBMENU {
- 10 = TEXT
- ################# Titel #############################################
- 10.value = <p>Titel</p>
- #####################################################################
- 20 = HMENU
- 20 {
- wrap = <ul> | </ul>
- special = directory
- ################# Seiten ID #########################################
- special.value = xxx
- #####################################################################
- 1 = TMENU
- 2 < .1
- 3 < .1
- }
- }
Folgendes TS erzeugt XHTML-konformen Output:
habe mir den code von stephan mal angesehen und festgestellt das es anders herum "besser" funktioniert!
| Typoscript: | Zeilennummerierung: An / Aus |
- temp.navi = HMENU
- temp.navi {
- 1 = TMENU
- 1{
- expAll = 1 #<--Alle Level ausklappen z.B. für dropdown menüs mit hover
- noBlur = 1
- #Äuserer Rahmen
- wrap = <ul id="Navigation">|</ul>
- NO = 1
- NO{
- linkWrap = <li> |
- IFSUB = 0
- IFSUB.linkWrap = <li> | </li>
- }
- ACTIFSUB = 0
- ACTIFSUB.linkWrap = <li> | </li>
- }
- 2 = TMENU
- 2{
- expAll = 1
- NO =1
- wrap = <ul id="L2"> | </ul></li>
- NO.linkWrap = <li> | </li>
- }
- }
hiermit moch mal vielen dank für das script!
hat eigentlich jemand ne lösung für das, was
adventuremaker geschrieben hat?
| Html4strict: | Zeilennummerierung: An / Aus |
Mal noch was für Anfänger.
Wie geh ich denn dabei vor wenn ich IDs genutzt hab um die anzuwenden? Habs bisher nur an Klassen gesehen:
DIV#menu ul a {
text-decoration: none;
background-image: url(images/link.jpg);
background-repeat: no-repeat;
display: block;
color: #FFF;
font-size: 13px;
font-weight: bold;
padding: 3px 3px 5px 15px;
line-height: 16px;
font-size: 13px;
height: 17px;
}
DIV#menu ul ul a {
display: block;
padding-left: 35px;
background-image: url(images/link_sub.jpg);
background-repeat: no-repeat;
padding: 3px 3px 5px 20px;
font-weight: normal;
}
Hallo,
ich hab folgendes Menü XHTML strict bekommen:
LG und viel Spass
Alex
Hallo zusammen,
wie würde denn nun das TS für das letzte Menü aussehen?
<ul>
<li>Seite 1</li>
<li>Seite 2
<ul>
<li>Unterseite 1</li>
<li>Unterseite 2</li>
</ul>
</li>
<li>Seite 3</li>
</ul>
Ich bekomm das einfach nicht hin. Danke für die Hilfe.
hoi!
genau das problem hab ich auch!
rein optisch kommt zwar geknaupe auch hin, aber xhtml-konform is es nich :-(
hab folgendes probiert:
| Typoscript: | Zeilennummerierung: An / Aus |
- temp.menu = HMENU
- temp.menu.entryLevel = 0
- temp.menu {
- 1 = TMENU
- 1.expAll = 0
- 1 {
- NO {
- ATagTitle.cObject = TEXT
- ATagTitle.cObject.dataWrap = {field:title}|
- ATagBeforeWrap = 1
- ATagParams = class="menu_noact"
- allWrap = <li>|</li>
- }
- CUR = 1
- CUR {
- allWrap = <li>|</li>
- ATagParams = class="menu_act"
- }
- }
- 2 = TMENU
- 2.wrap =<ul class="submenu">|</ul></li>
- 2 {
- NO {
- ATagTitle.cObject = TEXT
- ATagTitle.cObject.dataWrap = {field:title}|
- ATagBeforeWrap = 1
- ATagParams = class="submenu_noact"
- allWrap = <li>|</li>
- }
- CUR = 1
- CUR {
- allWrap =<li>|</li>
- ATagParams = class="submenu_act"
- }
- }
- }
, was natürlich nich wirklich gehn kann.
ich müßte auf der hauptebene n spezielles wrap, was sagt, ifsub = wrap <li>|
geht sowas überhaupt?
versucht hab ichs noch nich da ich vermute, dass das geöffnete tag auch wieder automatishc geschlossen wird;
das <ul>|</ul></li> geht auch nicht, ignoriert er einfach...
bin mit meinem noch bescheidenen latein am ende.
ich brauch halt unbedingt ne TMENU lösung,xhtml-konform und am besten sofort :-D
in erwartung auf einen geistesblitz
greez
phil
Mein (einfacher) Vorschlag für die Html-Strict Version von adventuremaker wäre folgender:
| Typoscript: | Zeilennummerierung: An / Aus |
Wenn also Unterpunkte vorhanden sind dann wird das <li> Tag einfach erst im wrap der nächsten Ebene zugemacht.
Hallo zusammen,
Ne frage habe ich: wie mache ich, dass 2.Menüebene (SUBMENU) oben erscheint (mit ###SUBMENU###), falls ich auf Eintrag drücke?
Einfach
für die erste Ebene verwenden, dann wird <ul> innerhalb von <li> dargestellt.
Bei mir functioniert folgeder code
10 = HMENU
10{
1 = TMENU
1.wrap=<ul><li>|</li></ul>
1.NO = 1
1.NO.allWrap=| |*| </li><li>|
1.ACT.allWrap = | |*| </li><li>|
2 < .1
3 < .1
...
}
Folgendes müßte XHTML-konform sein:
Danach kann es mit CSS formatiert werden.
Es gab da mal ein Beitrag in der Mailinglist zu.
Ich meine da wurde und verwendet.
Wenn man dann bei die Eigenschaft leert, dann müsste dass hinhauen.
Das Submenü müsste dann dann halt noch der modifiziert werden.
| Typoscript: | Zeilennummerierung: An / Aus |
- wrap = <ul> | </ul></li>
- Der Ansatz war jedenfalls die Eigenschaft [TYPOSCRIPT]before
Gibt es auch eine XHTML-konforme Variante?
Obiges Beispiel erzeugt ja folgendes HTML:
| Html4strict: | Zeilennummerierung: An / Aus |
XHTML-konform müsste das Menü so aussehen:
| Html4strict: | Zeilennummerierung: An / Aus |
Hintergrund: Das UL-Element muss innerhalb des LI-Elementes vorkommen.






