Zum Inhalt springen

dynamische navigation inkl. userfunction

Erstellt am 21. Oktober 2008 · Noch keine Antworten

Tags: Frage

daniel23 ·

hallo!

meine typo3 kenntnisse sind recht frisch, deswegen versuche ich mal, das ganze zu beschreiben:

ich habe eine dynamische unternavigation auf meiner website, die den seitenbaum ausliest. funktioniert wunderbar:

## Unternavigation
lib.subMenu = HMENU
lib.subMenu {
	1 = TMENU
	1 {
		expAll = 0
		NO {
			doNotShowLink = 1
		}
		ACT = 1
		ACT {
			allWrap = <h3 id="navititle"> | </h3>
			doNotLinkIt = 1
		}
	}
	2 = TMENU
	2 {
		expAll = 0
		wrap = <ul id="subNavi"> | </ul>
		NO {
			wrapItemAndSub = <li> | </li>
			text = 
		}
		ACT = 1
		ACT {
			wrapItemAndSub = <li class="sel"> | </li>
		}
	}
}
lib.subMenu.3 < lib.subMenu.2
lib.subMenu.3 {
    wrap = <ul> | </ul>
}
lib.subMenu.4 < lib.subMenu.3
lib.subMenu.5 < lib.subMenu.4
lib.subMenu.6 < lib.subMenu.5

.1 ist die überschrift der unternavigation und .2 ist die erste ebene.. der rest wird ja fast ausschließlich auf die nächsten ebenen vererbt.. also .3, .4, .5 und .6

nun habe ich eine seite, wo ich .3 mit einer userfunction ersetzen möchte. es ist so, dass ich eine eigene extension mit listenseite und detailansicht mit dem kickstarter erstellt habe und diese datensätze in der navigation auftauchen sollen. nach vielem suchen bin ich dann auf folgende codeschnipsel gestoßen, die auch einwandfrei funktionieren:
userfunction:

<?php
    class user_menuFunc {
        function makeMenuArray($content,$conf) {
            $menuArr = array();
            $lConf = $conf["userFunc."];
            $actuid = 0;
            if ($lConf['actextkey'] && $lConf['actextvar']) {
                $getval = t3lib_div::_GET();
                $actuid = $getval[$lConf['actextkey']][$lConf['actextvar']];
            }
            $res = $this->cObj->exec_getQuery($lConf["table"],$lConf["select."]);
            if ($error = $GLOBALS['TYPO3_DB']->sql_error()) {
                $GLOBALS['TT']->setTSlogMessage($error,3);
            } else {
                $GLOBALS['TT']->setTSlogMessage('NUMROWS:'.$GLOBALS['TYPO3_DB']->sql_num_rows($res));
                while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
                    if ($actuid!=0 && $actuid==$row['uid']) $row['ITEM_STATE']='ACT';
                    $menuArr[] = $row;
                }
            }
            return $menuArr;
        }
    }
?>

und der dazugehörige ts-code:

## Unternavigation 2
page.includeLibs.subMenu = fileadmin/navi-rahmenprogramme.inc
lib.subMenu = HMENU
lib.subMenu.special = userfunction
lib.subMenu.special.userFunc = user_menuFunc->makeMenuArray
# Die Tabelle setzen aus der man das Menü generieren möchte
lib.subMenu.special.userFunc.table = tx_rahmenprogramme_content

[globalVar = TSFE:id = 65]
	# uid der Seite wo diese Records gespeichert sind
	lib.subMenu.special.userFunc.select.pidInList = 65
	#den Extension key von dem die entsprechnde GET Variable für den ACT status kommt.
	lib.subMenu.special.userFunc.actextkey = tx_rahmenprogramme_pi1
	#Setzt den namen der GET Variable in der Extension
	lib.subMenu.special.userFunc.actextvar = showUid
	lib.subMenu.1 = TMENU
	lib.subMenu.1 {
		NO {
			doNotLinkIt = 1
			stdWrap.field = headline
			stdWrap.typolink.useCacheHash = 1
			stdWrap.typolink.parameter.data = page:uid
			stdWrap.typolink.additionalParams.dataWrap = &tx_rahmenprogramme_pi1[showUid]={field:uid}
			#stdWrap.data = debug:data
			allWrap = |<br />
		}
		ACT < .NO
		ACT = 1
		ACT.allWrap = <b>|</b><br />
	}
[global]

funktioniert wie gesagt wunderbar, aber nur, wenn ich lib.subMenu eben damit überschreibe.. das möchte ich aber nicht, sondern ich möchte es verschachteln.. und habe deswegen versucht, mit conditions zu arbeiten. hier meine bemühungen:

## Unternavigation

page.includeLibs.subMenu = fileadmin/navi-rahmenprogramme.inc
lib.subMenu = HMENU
lib.subMenu.special = userfunction
lib.subMenu.special.userFunc = user_menuFunc->makeMenuArray
lib.subMenu.special.userFunc.table = tx_rahmenprogramme_content
lib.subMenu {
	1 = TMENU
	1 {
		expAll = 0
		NO {
			doNotShowLink = 1
		}
		ACT = 1
		ACT {
			allWrap = <h3 id="navititle"> | </h3>
			doNotLinkIt = 1
		}
	}
	2 = TMENU
	2 {
		expAll = 0
		wrap = <ul id="subNavi"> | </ul>
		NO {
			wrapItemAndSub = <li> | </li>
			text = 
		}
		ACT = 1
		ACT {
			wrapItemAndSub = <li class="sel"> | </li>
		}
	}
}
[globalVar = TSFE:id=65]
	# uid der Seite wo diese Records gespeichert sind
	lib.subMenu.special.userFunc.select.pidInList = 65
	#den Extension key von dem die entsprechnde GET Variable für den ACT status kommt.
	lib.subMenu.special.userFunc.actextkey = tx_rahmenprogramme_pi1
	#Setzt den namen der GET Variable in der Extension
	lib.subMenu.special.userFunc.actextvar = showUid
	lib.subMenu.3 = TMENU
	lib.subMenu.3 {
		NO {
			doNotLinkIt = 1
			stdWrap.field = headline
			stdWrap.typolink.useCacheHash = 1
			stdWrap.typolink.parameter.data = page:uid
			stdWrap.typolink.additionalParams.dataWrap = &tx_rahmenprogramme_pi1[showUid]={field:uid}
			#stdWrap.data = debug:data
			allWrap = |<br />
		}
		ACT < .NO
		ACT = 1
		ACT.allWrap = <b>|</b><br />
	}
[else]
	lib.subMenu.3 < .2
	lib.subMenu.3 {
		wrap = <ul> | </ul>
	}
	lib.subMenu.4 < .3
	lib.subMenu.5 < .4
	lib.subMenu.6 < .5
[global]

nur leider funktioniert das nicht.. die unternavigation bleibt einfach weiss.

hat jemand eine idee? einen vorschlag?

liebe grüße,
daniel