Zum Inhalt springen

Submenu für bestimmte Seite ersetzen

Erstellt am 3. Dezember 2014 · 5 Antworten · letzte Antwort am 7. Dezember 2014

Tags: TYPO3 6.x, Frage

Unbekannter Benutzer ·

Hallo,

ich habe ein relativ simples Menu im TS:

lib.mainmenu = HMENU
lib.mainmenu {
    entryLevel = 0
    special = directory
    special.value = {$page.mainmenu}

    1 = TMENU
    1 {
        NO {
            field = nav_title // title
            wrapItemAndSub = <li>|</li>
        }
        wrap = <ul>|</ul>
        expAll = 1
    }
    2 < .1
}

Das rendert also eine Liste und wenn es auf der zweiten Ebene Seite gibt, diese als Kindliste.
Ich will nun für eine bestimmte Seite der ersten Ebene, welche keine Kindseiten hat, als Kindmenu Daten aus einer Extension einfügen. Ich würde die Daten mit RECORDS-Element oder per USER-Element auslesen, habe aber keinen Schimmer, wie ich die in das Menü bekomme.
Habe schon bisschen rumprobiert und hinbekommen, den wrap für diese Seite im Menü zu überschreiben, aber nicht mehr:

lib.mainmenu.1.NO.wrapItemAndSub = <li>XXX|</li>
lib.mainmenu.1.NO.wrapItemAndSub.if {
	value.data = field: uid
	equals = 17
}

Kann mir jemand einen Denkanstoß geben, wie man das lösen könnte? Danke!

jenses ·

Du machst es dir unnötig kompliziert.
Nimm eine Condition und schreib da hinein deinen abweichenden Menücode:

[PIDinRootline = 17]
...
   Menü-TS
...
[global]
Wool ·

Hallo,

"special" und "entryLevel" zusammen ist bäh... böse... brrr... nicht machen!

...
ANMERKUNG: Setzen Sie nicht die Eigenschaft .entryLevel für ein HMENU, wenn Sie diese (.special) Option benutzen! ...

Quelle: https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/ContentObjects/Hmenu/Index.html
AUSNAHME: .special = keywords

und so sollte es dann aussehen für den aktuellen Status:

lib.mainmenu = HMENU
lib.mainmenu {
  #entryLevel = 0
  special = directory
  special.value = {$page.mainmenu}
  1 = TMENU
  1 {
    NO {
      field = nav_title // title
      wrapItemAndSub = <li>|</li>
    }
    wrap = <ul>|</ul>
    expAll = 1
  }
  2 < .1
}
[PIDinRootline = 17]
  lib.mainmenu.1.NO.wrapItemAndSub = <li>XXX|</li>
[global]

Hier ein Beispiel mit PHP-Funktion:
http://www.typo3wizard.com/de/snippets/menus/menues-erstellen-mit-daten-aus-anderen-tabellen-als-pages.html

Hier ein Beispiel einer Produktliste:
http://stackoverflow.com/questions/21116289/typo3-extbase-hmenu-with-multiple-records

Hier Beispiele wie man in TS Links bastelt:
http://www.thefox.ch/extdev/typo3/typoscript/cobject/text/typolink/

Ich hoffe das genügt als Ansatz. 😉

Bitte auch Deine Lösung hier mit posten, danke.

Unbekannter Benutzer ·

Hi, ich danke euch für euren Input!
Allerdings ist das nicht ganz das, was ich machen will. Da habe ich mich etwas unklar formuliert.

Besagtes TS-Menu rendert folgenden Baum:

- Seite A
--- Sub A1
--- Sub A2
- Seite B
--- Sub B1
--- Sub B2
- Seite C
- Seite D
--- Sub D1
--- Sub D2

Seite C (die irgendwo sein kann, also keinen festen Platz hat) hat keine Unterseiten. Das HTML für das Kindseitenmenü habe ich ein einem TS-Objekt lib.submenu. Das ist ein USER-Objekt, generiert von einer Extension und liefert einen String mit HTML zurück. Das soll nun in das Element von Seite C.

Bisher:

<ul>
    ...
    <li>Seite C</li>
    ...
</ul>

Jetzt:

<ul>
    ...
    <li>
        Seite C
        <!-- kommt aus dem USER-Objekt -->
        <ul><li>....</li></ul>
        <!-- Ende USER-Objekt -->
    </li>
    ...
</ul>

Der TypoScript-Code

[PIDinRootline = 17]
    ...
[global]

funktioniert nicht, weil das dann nur auf Seite mit PID 17 angezeigt werden würde, aber ich will das Submenü immer da haben, es soll nur eben als Kind von Seite 17 im Menü auftauchen.

Zu Wraps hab ich mich belesen, soweit ich das aber verstanden habe kann ich da nicht irgendwo das USER-Objekt reinklemmen - wenn das geht weiß ich schlicht nicht wie.

Der Code von oben:

lib.mainmenu.1.NO.wrapItemAndSub = <li>XXX|</li>
lib.mainmenu.1.NO.wrapItemAndSub.if {
	value.data = field: uid
	equals = 17
}

ist schon genau das, was ich brauche, nur dass anstatt des XXX der Inhalt des USER-Objektes stehen muss.

Mit z.B.

lib.mainmenu.1.NO.wrapItemAndSub < lib.submenu
lib.mainmenu.1.NO.wrapItemAndSub.if {
	value.data = field: uid
	equals = 17
}

schreibt es mir nur "USER" in den Wrap und nicht den eigentlichen Inhalt des USER-Objektes.

Vielleicht habt ihr jetzt noch Ideen? Ich würde mich freuen, vielen Dank schon im Voraus!

Unbekannter Benutzer · · Beste Antwort

Hi Wool,

danke für den Tipp, das hat es gebracht. Ich habe nun nur den after-Wrap überschrieben, das ist genau das, was ich brauchte:

lib.menuuser = USER
lib.menuuser {
    ....
}
lib.custommenu = COA
lib.custommenu {
	10 < lib.menuuser
	if {
		value.data = field: uid
		equals = 17
	}
}
lib.mainmenu.1.NO.after.override.cObject < lib.custommenu
lib.mainmenu.1.CUR.after.override.cObject < lib.custommenu

Nochmal danke für die Anregungen!