Zum Inhalt springen

Darstellung der untersten Menuebene

Erstellt am 29. April 2006 · 8 Antworten · letzte Antwort am 30. April 2006

Tags: Frage

StefanKr ·

Ich möchte ein Menu in der Art darstellen, dass bis zu der Ebene, die ich aktuell angeklickt habe, die rootline (also special.range=0|-1) dargestellt wird und zusätzlich die Seiten der aktuell angewählten Ebene. Das habe ich so hinbekommen:

temp.menu3 = COA
temp.menu3 { 
# Anzeige der Rootline 
  10 = HMENU
  10 {
        special = rootline
        special.range = 0|-1
        1 = TMENU
        1.NO = 1
        1.NO.linkWrap = <div class="M3-H1">|</div> || <div class="M3-H2">|</div> || <div class="M3-H3">|</div>  
   }
 
# Anzeige der eigenen Verzeichnisebene
  20 = HMENU  
  20 {
        entryLevel = -1
        1 = TMENU
        1.NO = 1
        1.NO.linkWrap = <div class="M3-L1-NO">|</div>
      }
}

Das funktioniert auch ordentlich. Aber es hat einen Schönheitsfehler: wenn ich im unteren Menüteil (20) eine Seite anklicke, die keine weitere Unterseite hat, sollen beide Teile des Menus (10+20) unverändert bleiben. Stattdessen wird im rootline-Menü (10) ein weiterer Eintrag gemacht und im unteren Teil (20) steht gar nichts mehr. Ich hätte aber eben gerne den untersten Level immer sichtbar, egal wo der sich im Baum befindet, es muss also dynamisch funktionieren. Es ist mir klar, dass es so, wie ich es versucht habe, nicht funktionieren kann, schließlich sorgt entryLevel=-1 genau dafür, dass im 20-Menu die Unterseiten der gerade gewählten Seite angezeigt werden. Und wenn es keine gibt, bleibt alles leer - logisch. Aber wie bringe ich das Script dazu, dies nur dann nicht zu tun, wenn keine Unterseiten vorhanden sind? Mit IFSUB komme ich nicht weiter. Ist da etwa PHP Programmierung nötig?
Beispiel: http://test.ahden.de/183.html(bitte ignoriert das grausame Styling, das wird noch über CSS getunt)
Wenn ich hier auf "Heimspiele" klicke, soll die Heimspiel-Seite angezeigt werden, das Menu soll aber unverändert bleiben, da es keine Unterseiten gibt - darum geht's, das bekomme ich nicht hin. Wenn ich auf "Jugendfussball" klicke, soll das Ganze eine Ebene weiter runter gehen - das tut es auch richtig. Das gleiche Verhalten soll in allen Ebenen der Webseite vorliegen, egal welcher Level, es soll nur davon abhängen, ob Unterseiten vorhanden sind oder nicht.

Ich kann mir nicht vorstellen, dass nur ich dieses Problem habe, die Suche in diesem und im typo3forum hat aber leider nichts ergeben. Einen Foreneintrag von vor 2 Jahren habe ich gefunden, nur dummerweise wurde dort die vom Autor selbst gefundene Lösung nicht von ihm veröffentlicht. Vielleicht bekomme ich hier trotzdem Hilfe, obwohl es sich bestimmt um eine lächerliche Sache handelt (deswegen auch im Anfängerbereich und nicht im Menübereich). Dank im voraus.

StefanKr ·

Hallo, dass meine Anfrage bisher unbeantwortet bleibt, hat wahrscheinlich einen der Gründe:
1. Das Problem ist eine olle Kamelle, die Lösung ist längst bekannt. Ich soll das Forum besser durchsuchen.
2. Ich habe das Problem zu umständlich erklärt, die eigentliche Frage kommt nicht richtig rüber und es verursacht zuviel Arbeit, es zu verstehen
3. Das Problem ist erkannt, aber keiner weiss eine Lösung
4. Gemach, gemach, Rom ist auch nicht in 3 Tagen erbaut worden.

An die Profis: könnt ihr mir wenigstens einen Hinweis geben, welche der drei Möglichkeiten zutrifft. Und wenn es 1. sein sollte -glaubt mir bitte, ich habe mittlerweile Tage mit der Suche nach der Lösung meines Problems verbracht- dann gebt mir doch einen Tipp, wonach ich genau suchen soll. Es kann ja durchaus sein, das irgendwo die Lösung steht - aber ich vermute, sie ist Teil eines anderen Problems, wonach ich gar nicht gesucht habe. Oder ich seh' den Wald vor lauter Bäumen nicht. Noch eine Hinweis: wie man mehrstufige Menus erstellt, weiß ich, darum geht es mir bei dem Problem nicht. Ursprünglich war mein Menubaum 4 Ebenen tief.
Gruß,
Stefan

theo ·

Das liegt alles an Deiner Grundkonfiguration. Du bereitest Dir damit selbst den Boden für dieses Problem.

Falls ich Deinen TS-Schnipsel richtig verstehe:
1) Du scheinst das Rootline-Menü mit Deinem "normalen" Menü zu koppeln (Stichwort: COA). Warum nur?? Das eine hat mit dem anderen doch gar nichts zu tun.

2) Dein Menü links sollte ein ganz normal verschachteltes mehrstufiges TMENU sein, das Du doch für jedes Level eigenständig formatieren kannst.

StefanKr ·

Hallo Theo, super, dass du so schnell reagierst.
Ich hatte zuerst auch ein mehrstufiges Menu, aber das sah, wenn man nur tief genug in die Ebenen geht, zu unübersichtlich aus. Ich versuchs zu erklären, was ich benötige:

Ich befinde mich in Ebene n, dort gibt es mehrere Parallelseiten n.1, n.2, .. n.m

Im oberen Menuteil sollen die Seiten der Ebenen 0 bis n-1 angezeigt werden, die sich in der Rootline befinden, aber nicht die Parallelseiten der Ebenen 0 bis n-1 ausserhalb der Rootline. Deshalb habe ich im ersten Teil des Menus eine Rootline verwendet. Das funktioniert. In einem klassischen hierarchischen Menu (2=TMENU, 3=TMENU usw) mit mehreren Ebenen werden dagegen auch die Parallelseiten der Rootlineseiten angezeigt.
In der Ebene n, und nur dort, sollen alle Parallelseiten angezeigt werden. Deshalb kommt dafür Rootline nicht in Frage. Ja, und hier stehe ich auf dem Schlauch, denn wenn ich eine Seite ohne Unterseiten anklicke, steht rechts nichts mehr. Logisch.

Um bei dem Beispiel meiner Testseite http://test.ahden.de/183.html zu bleiben: mit einer klassischen Hierachieanzeige würden bei dem Aufruf auch die übergeordneten "BSV Ahden"-Unterseiten "Verein, Tennis, Breitensport, Bildergalerie" im Menu auftauchen, teils drüber, teils drunter. Das soll weg.

Ich weiß, dass ich jeden Menulevel eigenständig formatieren kann - aber ich muss nicht nur formatieren, ich muss auch Inhalte komplett rausfiltern, nämlich die Parallelseiten der Ebenen < n. Wenn ich wüßte, wie das geht, wär das Problem gelöst.

Ich kann schon quasi sehen, wie du dir die Haare raufst - anscheinend habe ich etwas grundsätzlich falsch verstanden. Bloss was?

theo ·

Ich bleibe bei meiner Behauptung... 😉

Im oberen Menuteil sollen die Seiten der Ebenen 0 bis n-1 angezeigt werden, die sich in der Rootline befinden, aber nicht die Parallelseiten der Ebenen 0 bis n-1 ausserhalb der Rootline.

Bei einem rootlinemenü werden Seiten außerhalb der rootline qua definition nicht eingebunden.
Das Problem existiert also überhaupt nicht. Das liegt schließlich in der Natur der Sache.
Im Umkehrschluß heißt das: wenn Seiten außerhalb der rootline angezeigt würden, wäre es kein rootlinemenü...

StefanKr ·

oje, wir reden anscheinend aneinander vorbei. :o Natürlich ist es so, wie du schreibst, genau deswegen verwende ich ja Rootline in dem .10-Teil. Bis dahin wird alles so angezeigt, wie ich es möchte.

Mir geht es um den .20-Teil, der nicht als Rootline gelöst wurde:
Wie bekomme ich es hin, dass hier weiterhin die Parallelseiten eine Seite angezeigt werden, wenn ich eine Seite ohne Unterseiten anklicke. Um bei der Testseite zu bleiben: wenn ich "Heimspiele" anklicke, soll das Menu unverändert bleiben, wenn ich dagegen "Jugendfussball" anklicke, soll das Ganze eine Ebene tiefer gehen.

Ich habe mir schon mangels Lösungen überlegt, das über Conditions zu machen. Aber ich suche noch nach dem Abfrageausdruck, der mir sagt, ob eine Seite Unterseiten hat oder nicht.

theo ·

Lange Rede, schwacher Sinn: ich kann Dir keine Tips zum Umbau, bzw. zur Anpassung Deiner Menükonstruktion geben, denn erstens braucht man dazu Deinen kompletten Typoscript-Code und zweitens würde ich es wahrscheinlich prinzipiell anders aufbauen, also neuschreiben.

In jedem Fall wäre das ein Unterstützungs-/Zeitaufwand, der mir zu weit ginge, sorry vielmals.

StefanKr ·
theo schrieb

In jedem Fall wäre das ein Unterstützungs-/Zeitaufwand, der mir zu weit ginge, sorry vielmals.

Kann ich verstehen. Trotzdem danke für den Versuch!

StefanKr ·

Ich hab' es! Die Lösung steckt in diesem Uralt-Thread: #4128
Es ist tatsächlich eine User PHP Funktion notwendig, die einem sagt, ob die aktuelle Seite Unterverzeichnisse hat oder nicht. Ist nur eine simple Funktion, aber das hat es gebracht. Der Rest ist Fleissarbeit. Ich wundere mich immer noch, dass das Problem so exotisch ist, dass dafür eine Funktion geschrieben werden muss. Aber anscheinend habe ich merkwürdige Bedürfnisse #paralyzed#
Mannomann, das war eine schwere Geburt, an dem Ding habe ich jetzt 3 Wochen gesessen und alles mögliche erfolglos probiert. An PHP hatte ich mich nicht rangetraut - aber zukünftig liegt diese Hürde deutlich niedriger.

Der Menucode sieht so aus, das Verhalten kann man auf test.ahden.de (im Laufe des Jahres 2006 dann www.ahden.de) sehen. Die CSS Daten habe ich nicht mit angehängt, die kann man sich jederzeit selbst ansehen, z.B. mit dem Webdeveloper http://chrispederick.com/work/webdeveloper/. Super-Tool, sehr zu empfehlen.

includeLibs.user_sk = fileadmin/ahden/sk.inc.php

temp.menu3 = COA
temp.menu3 { 
# Anzeige der Rootline bis zur aktuellen Ebene, wenn die Seite Unterseiten hat
  10 = HMENU
  10 {
        special = rootline
        special.range = 1|-1
        if.value.postUserFunc = user_sk->numofsubs
        if.equals = 0
        if.negate = 1
        1 = TMENU
        1.NO = 1
        1.NO {
           ATagBeforeWrap = 1
           linkWrap = <div class="M3-H1">|</div> || <div class="M3-H2">|</div> || <div class="M3-H3">|</div>  
        }
   }

# Anzeige der Rootline bis eins vor der aktuellen Ebene, wenn die Seite keine Unterseiten hat
  15 = HMENU
  15 {
        special = rootline
        special.range = 1|-2
        if.value.postUserFunc = user_sk->numofsubs
        if.equals = 0
        1 = TMENU
        1.NO = 1
        1.NO {
           ATagBeforeWrap = 1
           linkWrap = <div class="M3-H1">|</div> || <div class="M3-H2">|</div> || <div class="M3-H3">|</div>  
        }
   }

# Anzeige der Unterseiten der aktuelle Seite, vorausgesetzt, sie hat Unterseiten
  50 = HMENU  
  50 {
        entryLevel = -1
        if.value.postUserFunc = user_sk->numofsubs
        if.equals = 0
        if.negate = 1
        1 = TMENU
        1.noBlur = 1
        1.collapse = 0
        1.NO = 1
        1.NO.linkWrap = <div class="M3-L1-NO">|</div>
      }

# Anzeige der Ebene der aktuellen Seite, wenn die aktuelle Seite keine Unterseiten hat
  60 = HMENU  
  60 {
        entryLevel = -2
        if.value.postUserFunc = user_sk->numofsubs
        if.equals = 0
        1 = TMENU
        1.noBlur = 1
        1.collapse = 0
        1.NO = 1
        1.NO.linkWrap = <div class="M3-L1-NO">|</div>
        1.CUR = 1
        1.CUR.linkWrap = <div class="M3-L1-CUR">|</div>
      }
}

Die php Datei liegt ihm Verzeichnis fileadmin/ahden und heisst sk.inc.php. Sie liefert die Anzahl der Unterseiten der aktuellen Seite zurück. Der Inhalt:

<?php

class user_sk {

  function numofsubs() {
    global $GLOBALS;

    $content = $GLOBALS["TSFE"]->sys_page->getMenu($GLOBALS["TSFE"]->id);
    $output = sizeof($content);
    return $output;
  }
}
?>