Zum Inhalt springen

TMENU, IFSUB und LOAD_REGISTER

Erstellt am 7. Mai 2012 · 2 Antworten · letzte Antwort am 15. Juni 2016

Tags: Frage

harvey ·

Hallo Forum, ich schon wieder.

Diesmal liegt mein Problem in der Kombination TMENU, IFSUB und LOAD_REGISTER.
Ich habe eine Extension mit dem Kickstarter erstellt, die mir die pages-Tabelle um zwei Felder erweitert: menuCols und menuDir. menuCols soll die Anzahl der Spalten des Level2-Dropdown Submenüs aufnehmen (String wegen CSS-Klasse), menuDir die Richtung, in der das Dropdown-Menü sich öffnet (auch String wegen CSS). Geht soweit.

In der ersten Ebene lese ich über {field:menuDir} den Wert aus und schreibe ihn in wrapItemAndSub in einem Optionsplit in das gewünschte Element. Funktioniert wunderbar.

Für die zweite Ebene benötige ich jetzt den Wert aus menuCols für die CSS-gesteuerte Breite des Dropdown. Den Wert kann ich aber nur in der ersten Ebene auslesen. Also habe ich mittels LOAD_REGISTER ein register erstellt und lese da den Wert hinein. Funktioniert auch! Auch das Auslesen geht, der Wert wird korrekt ausgegeben.

Aber: Jetzt ist der Wert meines wrapItemAndSub in IFSUB leer, das heisst, der Seitentitel, der hier erscheinen sollte, wird nicht ausgegeben. Ansonsten ist der resultierende HTML-Quelltext korrekt.

Ich habe folgendes TS-Snippet:

lib.dropdown = HMENU
lib.dropdown {
  includeNotInMenu = 1
  1 = TMENU
  1 {
    wrap = <ul>|</ul>
    expAll = 1
    noBlur = 1

    NO = 1
    NO {
      wrapItemAndSub = <li class="first">|</li>|*|<li>|</li>|*|<li class="last">|</li>
    }
    IFSUB < .NO
    IFSUB {

      stdWrap.cObject = LOAD_REGISTER
      stdWrap.cObject {
        numCols.field = menuCols
        numCols.insertData = 1
      }

      wrapItemAndSub.insertData = 1
      wrapItemAndSub = <li class="first dir{field:menuDir}">|</li>|*|<li class="dir{field:menuDir}">|</li> |*|<li class="last dir{field:menuDir}">|</li>
    }
  }

  2 < .1
  2 {
    stdWrap.dataWrap = <div class="cols-wrap {register:numCols}"><div class="cols clearfix"><div class="col"><ul>|</ul></div></div></div>
    stdWrap.insertData = 1
  ...

Und hier ein Ausschnitt des resultierenden HTML-Quelltextes:

  <ul>
    <li class="first">
      <a href="home.html">Home</a>
    </li>
    <li class="dirright">
      <a href="Punkt Zwei.html"></a> <!-- Hier fehlt der Seitentitel -->
      <ul>
        <div class="cols-wrap one">
          ...
        </div>
      </ul>
      ....

Installiert habe ich Typo3 4.7.0 mit realurl und templavoila

Ich habe schon alles Mögliche ausprobiert und 'ne Menge Artikel gelesen, aber leider noch keinen Lösungsansatz gefunden. Vielleicht bin ich ja wieder blind...

--harvey

Jan68 ·

Hallo,

ok, ich werfe dir hier einfach mal so eine Schnipsel zu:

NO.before.dataWrap = <li class="item{register:count_HMENU_MENUOBJ}">|
NO.wrapItemAndSub = |</li>

Das funktioniert immer ganz gut!

LG Jan

haraldwittdpfade ·

Hallo harvey,

es ist zwar schon eine Weile her, aber das Netz vergisst ja nie. Daher hier eine Antwort auf deine Frage, die hoffentlich noch vielen anderen weiterhilft.

Es ist offensichtlich so, dass IFSUB.stdWrap.cObject zu Erzeugung des TMENU_ITEM genutzt wird. Vermutlich ist das ein TEXT mit allen möglichen anderen stdWrap-Eigenschaften. Durch die Zeile 17 wird das cObject in LOAD_REGISTER umgeschrieben und funktioniert daher nicht mehr. Diese Geschichte ist nicht genauer dokumentiert. Da hilft nur ein Blick in den Core-Quelltext!

Wie also das Register laden?
Wir lassen also das cObject weitgehend unangetastet und suchen uns eine Eigenschaft aus, die selbst auch wieder stdWrap-Eigenschaften hat. Das sollte eine Eigenschaft sein, die doch relativ selten benutzt wird und vor allem hier nicht. Ich habe mich für den innerWrap entschieden.

Wenn du also die Zeilen 17 und 18 wie folgt umschreibst, funktioniert alles hervorragend:

stdWrap.innerWrap.cObject = LOAD_REGISTER
stdWrap.innerWrap.cObject {
...

Ich hatte übrigens das Problem, weil ich ein MegaMenü machen wollte. Allerdings nicht für alle Level1-Menüpunkte, sondern selektiv nur für ganz bestimmte. Folglich muss ich diese kennzeichnen (entspricht deinem menuDir) und auch noch Infos für Level 2 hinterlegen (entspricht deinem menuCols).

Wäre nett, wenn du mir mal die kleine Extension zur Erweiterung des Pages-Tables schicken oder hier posten könntest. Hat vermutlich nur die ext_emconf.php, ext_tables.php und die ext_tables.sql? Aber du hast ja den Kickstarter benutzt.

LG
Harald