sorry, aber ich hab das mit der zweiten lösung nicht hinbekommen. habe das nach der angegeben beschreibung versucht einzufügen, bekomme aber ne fehlermedlung. hier mal mein code.
Code: Alles auswählen
<?php
/*
* Universelle <ul>-Navigation (YAML)
* YAML-Navigationstemplate
* V 0.9
*
* YAML3.0-konformes universelles Navigations-Template
* fuer Redaxo 3.x/4.x
*
* Navigationstemplate zur Gestaltung von Seitennavigationen/-menues auf der
* Grundlage unsortierter Listen (<ul></ul>) mit folgenden Funktionen:
* - Durch eine Meta-Info cat_styleclass kann jeder beliebigen Kategorie eine
* individuelle Style-Klasse hinzugefuegt werden
* - An YAML CSS-Framework angepasst, funktioniert aber auch eigenstaendig
* - beliebige Verschachtelungstiefe
* - Veroeffentlichungszeitraum (Online vom/bis) wird beachtet
* - individuelle Benutzerbereiche des Simple User - Addon 0.9 und 1.1
* und Community Addon werden ausgewertet
* - Verschachtelung der unsortierten Listen wahlweise mit w3c-konformer
* <ul>-Gliederung im jeweils uebergeordnetern <li>-Element oder als
* "Pseudo"-Verschachtelung in nur einem <ul>-Element
* - Wahlweise Anzeige der Untermenuepunkte nur der aktuellen Kategorie oder
* Anzeige aller Untermenuepunkte
* - Wahlweise getrennte Anzeige von Haupt- und Untermenue
* - Generierung eines Breadcrumb-Menues
* - zusaetzliches Navigationsmenue aus root-Artikeln moeglich
*
* weitere ausfuehrliche Erlaeuterungen zu diesem Template neben den
* Hinweisen im Quelltext auch unter:
*
* http://www.raybeam.de/index.php?article_id=20
* http://www.raybeam.de/index.php?article_id=35
*
* -----------------------------
* Peter Reiche - www.raybeam.de
* -----------------------------
* letzte Aenderung: 15.11.08
* Individuelle Styleklassen ueber Meta-Infos
* -----------------------------
* letzte Aenderung: 06.09.08
* Anpassung an Simple User 1.1
* -----------------------------
* letzte Aenderung: 15.08.08
* Anpassung an redaxo-community-addon
* -----------------------------
* letzte Aenderung: 01.05.2008
* -Neue Navigationsmoeglichkeit
* anhand von root-Artikeln hinzugefuegt
* -Bei getrennter Darstellung von Haupt-/Untermenue
* wird dem Untermenue der Hauptmenuename als Titel hinzugefuegt
* -----------------------------
* letzte Aenderung: 27.02.2008:
* Anpassung an redaxo 3.x/4.x
* -----------------------------
*/
function build_navigation($feUser, $nav, $path, $subUl='on',$pathIndex=1)
{
/* Wenn der Veroeffentlichungszeitraum "Online von / bis zum" nicht zutrifft, wird der
* Navigationslink nicht angezeigt. Artikel die direkt ueber den URL aufgerufen
* wurden, werden jedoch immer noch angezeigt. Das entsprechende Seiten-Template
* muss also bezuegl. des Veroeffentlichungszeitraums ebenfalls angepasst werden. */
$time = time();
/* Type-ID fuer den "SuperUser", der alle individuellen Menuepunkte sehen darf.
* Die ID sollte mit dem $su-Wert aus dem Authentifizierungstemplate uebereinstimmen. */
$su = 99;
/* -------> redaxo 4.x Anpassung:
* online_from und online_to werden nunmehr ueber Metainformationen der Artikel zur
* Verfuegung gestellt.
* Folgende Felder muessen, fall nicht vorhanden, ueber "Metainformationen erweitern/Artikel"
* angelegt werden
* /////////////////////////////////
* Prefix: art_
* Spaltenname: online_from
* Feldposition: [nach belieben]
* Feldbezeichnung: [nach belieben]
* Feldtyp: date
* Feldattribute: [kein Eintrag]
* Standardwert: [kein Eintrag]
* /////////////////////////////////
* und
* ////////////////////////////////
* Prefix: art_
* Spaltenname: online_to
* ... wie oben
* Werden die Metadaten im Backend gespeichert, so wird das aktuelle Datum in art_online_from
* und art_online_to gespeichert, wenn dort zuvor keine Werte eingetragen waren. Um eine un-
* beabsichtigte Sperrung der Artikel zu vermeiden, wird das Onlinedatum nur in die Pruefung
* einbezogen, wenn sich art_online_from und art_online_to unterscheiden. */
if($nav->getValue('online_from') != $nav->getValue('online_to'))
{
if($nav->getValue('online_from') > $time || $nav->getValue('online_to') < $time)
{
return;
}
}
/* Wenn die Typ-ID des Startartikels = 1 ist oder der UserTyp des angemeldeten
* Benutzers mit der Typ-ID des Startartikels der aktuellen Kategorie ueberein
* stimmt, geht es weiter
* -------> redaxo 4.x Anpassung:
* Der Artikel-Typ wird nun ueber die Metainformationen der Artikel zur Verfuegung gestellt
* Folgendes Feld muss, falls nicht vorhanden, ueber "Metainformationen erweitern/Artikel" angelegt werden
* /////////////////////////////////
* Prefix: art_
* Spaltenname: type_id
* Feldposition: [nach belieben]
* Feldbezeichnung: [nach belieben]
* Feldtyp: select
* Parameter: |[typ1]|[typ2]...
* Feldattribute: size=1
* Standardwert: [kein Eintrag]
* /////////////////////////////////
* WICHTIG: Im Unterschied zu den Beispielen in der Demo, erfolgt bereits vor
* dem ersten Parameter [typ1] das Pipezeichen "|". Dadurch wird der Select-Auswahl
* "Artikeltyp" im Backend ein "Leerfeld" vorangestellt. Dieser "Nullwert" stellt
* die Standardeinstellung eines fuer alle sichtbaren Artikels dar. */
// redaxo 4.x
global $REX;
global $csMetaInfo;
if($REX['VERSION']>"3")
{
// Zugriffsberechtigung fuer redaxo-community pruefen
if(OOAddon::isAvailable('community'))
{
$chkUsrPerm = rex_com_checkUserPerm($nav->getValue("art_com_perm"));
}
else
{
// permisson-Check fuer redaxo-community umgehen
$chkUsrPerm = true;
}
// Zugriffsberechtigungen fuer Simple User 1.1 pruefen
if(OOAddon::isAvailable('simple_user'))
{
// auf User-Gruppen pruefen
$arrArticleGroupId = explode("|",$nav->getValue("art_type_group_id"));
if($arrArticleGroupId[1]!="")
{
$arrUserGroupId = explode("|+|",$feUser['group']);
if($feUser['group'] != "")
{
$chkSimpleUsrGrp = false;
foreach($arrUserGroupId as $usrGroupId)
{
if(in_array($usrGroupId,$arrArticleGroupId))
{
$chkSimpleUsrGrp = true;
}
}
}
}
else
{
$chkSimpleUsrGrp = true;
}
}
else
{
$chkSimpleUsrGrp = true;
}
if($nav->getValue('art_type_id')=='' || $nav->getValue('art_type_id')=='Standard')
{
$artTypeId = '1';
}
else
{
$artTypeId = $nav->getValue('art_type_id');
}
}
// redaxo 3.x
else
{
$artTypeId = $nav->getTypeId();
// permisson-Check fuer redaxo-community umgehen
$chkUsrPerm = true;
// Group-Check fuer simple_user umgehen
$chkSimpleUsrGrp = true;
}
if($chkUsrPerm && $chkSimpleUsrGrp && ($artTypeId=='1' || $feUser['typ'] == $artTypeId || $feUser['typ'] == $su))
{
// Falls MetaInfo cat_styleclass vorhanden ist, Klasseneintrag
// 'class="cat_styleclass-Wert" ' generieren
if($nav->getValue($REX['csMetaInfo']))
{
$oStyleClass = ' class="'.$nav->getValue($REX['csMetaInfo']).'" ';
}
// "geoeffnete" Rootkategorie durch css-ID 'current' markieren
if($pathIndex==1 || ($pathIndex==2 && $subUl=='extra'))
{
if($pathIndex==1)
{
$oStyleID=' id="current"';
}
else
{
$oStyleID=' id="current'.$pathIndex.'"';
}
}
else
{
$oStyleID=' id="active"';
}
// Nur Submenue des aktuellen Root anzeigen
if($subUl=='on' || $subUl=='off' || $subUl=='extra')
{
if($nav->getId()==$path[$pathIndex])
{
// Namen der aktuellen root-Kategorie als Titel fuer
// das Submenue uebernehmen
if($pathIndex==1)
{
$subNavigation='<li id="title"'.$oStyleClass.'>'.$nav->getName()."</li>\n";
}
// Durch ...->getChildren(1) anstatt ...->getChildren() werden
// nur Kategorien durchlaufen die "online" sind
if($nav->getChildren(1))
{
if((count($path) > $pathIndex) && ($path[$pathIndex + 1] > 0))
{
if($pathIndex>1 && $subUl=='extra')
{
$subNavigation.='<li'.$oStyleID.$oStyleClass.'><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
else
{
if($oStyleID==' id="active"')$oStyleID='';
$navigation.='<li'.$oStyleID.$oStyleClass.'><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
}
else
{
// bei 'extra' wuerde der root-Navigationspunkt ins submenue verschoben, soll er aber nicht
if($pathIndex>1 && $subUl=='extra')
{
$subNavigation.='<li'.$oStyleID.$oStyleClass.'><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
else
{
$navigation.='<li'.$oStyleID.$oStyleClass.'><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
}
// Wenn keine untergeordneten <ul>-Tags im Menue verwendet
// werden sollen ($subUl='off'), wird der <li>-Tag geschlossen
if($subUl=='off')
{
$navigation.= '</li>'."\n";
}
// Wenn untergeordnete <ul>-Tags im Menue verwendet
// werden sollen ($subUl='on'), wird in dem noch offenen
// <li>-Tag der <ul>-Tag geoeffnet
else
{
if($pathIndex>1 && $subUl=='extra')
{
$subNavigation.= "\n<ul class=\"subnav".$pathIndex."\">\n";
}
else
{
$navigation.= "\n<ul class=\"subnav".$pathIndex."\">\n";
}
}
// Durch ...->getChildren(1) anstatt ...->getChildren() werden
// nur Kategorien durchlaufen die "online" sind - dazu wird die
// Funktion erneut aufgegrufen
foreach($nav->getChildren(1) as $sub)
{
$tmpNav=build_navigation($feUser, $sub, $path,$subUl, $pathIndex+1);
$navigation.=$tmpNav[0];
$subNavigation.=$tmpNav[1];
}
// Wenn untergeordnete <ul>-Tags im Menue verwendet
// werden sollen ($subUl='on'), wird der <ul>-Tag hier wieder geschlossen
if($subUl=='on' || $subUl=='extra')
{
if($pathIndex>1 && $subUl=='extra')
{
$subNavigation.="</ul>\n";
}
else
{
$navigation.="</ul>\n";
}
}
}
else
{
if($pathIndex>1 && $subUl=='extra')
{
$subNavigation.='<li'.$oStyleID.$oStyleClass.'><a class="level'.$pathIndex.' active" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
else
{
$navigation.='<li'.$oStyleID.$oStyleClass.'><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
if($subUl=='off')
{
$navigation.= '</li>'."\n";
}
}
}
else
{
if($pathIndex>1 && $subUl=='extra')
{
$subNavigation.='<li'.$oStyleClass.'><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
else
{
$navigation.='<li'.$oStyleClass.'><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
if($subUl=='off')
{
$navigation.= '</li>'."\n";
}
}
if($subUl=='on' || $subUl=='extra')
{
if($pathIndex>1 && $subUl=='extra')
{
$subNavigation.= '</li>'."\n";
}
else
{
$navigation.= '</li>'."\n";
}
}
}
// Submenues aller Kategorien anzeigen
elseif($subUl=='allOn' || $subUl=='allOff')
{
if($nav->getChildren(1))
{
// ID="active" bei aktiver Unterkategorie wieder loeschen
if((count($path) > $pathIndex) && ($path[$pathIndex + 1] > 0))
{
if($oStyleID==' id="active"')$oStyleID='';
}
if($nav->getId()==$path[$pathIndex])
{
$navigation.='<li'.$oStyleID.$oStyleClass.' ><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
else
{
$navigation.='<li'.$oStyleClass.'><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
// Wenn keine untergeordneten <ul>-Tags im Menue verwendet
// werden sollen ($subUl='allOff'), wird der <li>-Tag geschlossen
if($subUl=='allOff')
{
$navigation.= '</li>'."\n";
}
// Wenn untergeordnete <ul>-Tags im Menue verwendet
// werden sollen ($subUl='allOn'), wird in dem noch offenen
// <li>-Tag der <ul>-Tag geoeffnet
else
{
$navigation.= "\n<ul class=\"subnav".$pathIndex."\">\n";
}
foreach($nav->getChildren(1) as $sub)
{
$tmpNav=build_navigation($feUser, $sub, $path,$subUl, $pathIndex+1);
$navigation.=$tmpNav[0];
}
// Wenn untergeordnete <ul>-Tags im Menue verwendet
// werden sollen ($subUl='allOn'), wird der <ul>-Tag hier wieder geschlossen
if($subUl=='allOn')
{
$navigation.="</ul>\n";
}
}
else
{
if($nav->getId()==$path[$pathIndex])
{
$navigation.='<li'.$oStyleID.$oStyleClass.'><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
else
{
$navigation.='<li'.$oStyleClass.'><a href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
}
if($subUl=='allOff')
{
$navigation.= '</li>'."\n";
}
}
}
if($subUl=='allOn')
{
$navigation.= '</li>'."\n";
}
}
// Kleiner Trick, falls ausser der root-Kategorie alle weiteren aufgrund
// der Rechtevergabe ausgeblendet sind. Um validen HTML-Code zu erhalten
// muss am Ende des $navigations-String "<ul class=\"subnav1\">\n</ul>"
// geloescht werden
if(strstr($navigation,"<ul class=\"subnav1\">\n</ul>"))
{
$navigation = str_replace("\n<ul class=\"subnav1\">\n</ul>","\n",$navigation);
}
$navArray=array();
$navArray[0].=$navigation;
$navArray[1].=$subNavigation;
return $navArray;
} // ------------------ Ende der function build_navigation ------------------
//////////////////////////////////////////////
// " M E N U E - U M S C H A L T E R "
//////////////////////////////////////////////
// Menue mit <ul></ul> Auszeichnung
// auch in den Unter-Menuepunkten oder
// alle Untermenuepunkte staendig anzeigen
// <ul> einschalten:.................. on
// <ul> ausschalten:.................. off
// alle mit <ul> staendig anzeigen:.... allOn
// alle ohne <ul> staendig anzeigen:... allOff
// Untermenue extra:................... extra
//////////////////////////////////////////////
// Standardparameter fuer $subUl setzen, falls
// yaml-Layout-Template nicht benutzt wird
// (Bei Einsatz des yaml-templates werden diese
// Werte dort gesetzt)
//////////////////////////////////////////////
if($subUl=='')$subUl='extra';
//////////////////////////////////////////////
// Ein Zusaetzliches Menue (z. B. als topnav-Menue) kann auf Basis von root-Artikeln,
// die ueber eine Meta Info selektiert werden koennen, oder ohne eine Meta Info
// komplett in die Variable $raNavigation uebergeben werden.
// $raNav = 'on|off' (Bei Einsatz des yaml-templates wird dieser Wert dort gesetzt)
if($raNav=='')$raNav = 'off';
//////////////////////////////////////////////
// Standardwert fuer individuelle StyleKlassen der Kategorien ueber MetaInfo setzen
// ueber $REX['csMetaInfo'] ist der Wert automatisch global, also auch in der
// Funktion build_navigation sofort abrufbar (Bei Einsatz des yaml-templates wird
// dieser Wert dort gesetzt)
if($REX['csMetaInfo']=='')$REX['csMetaInfo']= 'cat_styleclass';
// Den Meta Infos wird unter *KATEGORIEN* folgendes hinzugefuegt:
// ---------------------------------
// Spaltenname: styleclass
// Feldposition: beliebiger Wert
// Feldbezeichnung: styleclass
// Feldtyp: select
// Parameter (z.B.): |rot|gruen|blau (durch das erste Pipezeichen kann ein Eintrag spaeter wieder geleert werden)
// Feldattribute: size=1
// ---------------------------------
// Über Kategorie editieren/löschen im Strukturmenue kann man jetzt
// jeder Kategorie eine css-Klassenbezeichnung zufuegen, die dann im
// Quelltext z. B. aus <li> <li class="rot"> macht.
// ------------------ Navigation erstellen ------------------
// Voreinstellungen:
$path = explode("|",$this->getValue("path").$this->getValue("article_id")."|");
// Usertyp und -gruppe festlegen, um Authentifizierung zu ermoeglichen
if(is_array($FORM))
{
$feUser['typ']=$FORM['USR_TYP'];
$feUser['group']=$FORM['USR_GROUP'];
}
else
{
$feUser['typ']=$_SESSION['USR_TYP'];
$feUser['group']=$_SESSION['USR_GROUP'];
}
// Durch ...::getRootCategories(1) anstatt ...::getRootCategories()
// werden nur die Root-Kategorien durchlaufen die "online" sind
$navi=array();
foreach (OOCategory::getRootCategories(1) as $nav)
{
$navi=build_navigation($feUser, $nav, $path, $subUl);
$navMain.=$navi[0];
$navSub.=$navi[1];
}
$cssId = ' id="submenu"';
if($subUl=='extra')
{
$navigation= "<ul> \n".$navMain."</ul>\n";
}
else
{
$navigation= "<ul $cssId> \n".$navMain."</ul>\n";
}
if($navSub)
{
$subNavigation= "<ul $cssId>\n".$navSub."</ul>\n";
}
// Hier die ID's für die gewünschten Kategorien zuordnen
// z. B. $catIdRot='2'
$catIdRot='';
$catIdGruen='';
$catIdBlau='';
// Hier wird das "rote" Menü aufgebaut und an $navigation_rot übergeben
$nav1=OOCategory::getCategoryById($catIdRot);
$navi1 = build_navigation($userTyp, $nav1, $path, 'on');
$navigation_rot = "<ul class=\"rot\">\n {$navi1[0]} </ul>\n";
// Hier wird das "grüne" Menü aufgebaut und an $navigation_gruen übergeben
$nav2=OOCategory::getCategoryById($catIdGruen);
$navi2 = build_navigation($userTyp, $nav2, $path, 'on');
$navigation_gruen = "<ul class=\"gruen\">\n {$navi2[0]} </ul>\n";
// Hier wird das "blaue" Menü aufgebaut und an $navigation_blau übergeben
$nav3=OOCategory::getCategoryById($catIdBlau);
$navi3 = build_navigation($userTyp, $nav3, $path, 'on');
$navigation_blau = "<ul class=\"blau\">\n {$navi3[0]} </ul>\n";
// Im Seitentemplate können die Menüs nun einfach mit der Variable
// §navigation_rot, $navigation_gruen oder $navigation_blau uebergeben und angezeigt werden
// ------------------ Breadcrumb erstellen ------------------
$aktArticle = OOArticle::getArticleById($this->getValue('article_id'));
$tree = $aktArticle->getParentTree();
//////////////////////////////////////////////
// Standardwerte fuer Titel und Trennzeichen
// fuer die Breadcrumb-Links festlegen, falls
// yaml-Layout-Template nicht benutzt wird
// (Bei Einsatz des yaml-templates werden diese
// Werte dort gesetzt)
//////////////////////////////////////////////
if($bcTitle=='')$bcTitle = 'Sie befinden sich hier: ';
if($bcDivi =='')$bcDivi = ' > ';
// Startartikel im Breadcrumbmenue verlinken (Dank an rudoo fuer die Idee!)
// $bcServerLink='on|off'
if($bcServerLink=='')$bcServerLink='on';
//////////////////////////////////////////////
if(is_array($path))
{
if($bcServerLink=='on')
{
$startArticle = OOArticle::getArticleByID($REX['START_ARTICLE_ID']);
$breadcrumb = '<div id="breadcrumb">'."\n".'<span class="bcTitle">'.$bcTitle.'<a href="'.$startArticle->getUrl().'">'.$REX ['SERVERNAME'].'</a>'.'</span>';
}
else
{
$breadcrumb = '<div id="breadcrumb">'."\n".'<span class="bcTitle">'.$bcTitle.$REX ['SERVERNAME'].'</span>';
}
foreach($path as $bcNr)
{
if($bcNr!='')
{
$art = OOArticle::getArticleByID($bcNr);
if($art->getValue('id')!=$this->getValue('article_id'))
{
// Pfad-Eintraege des Artikels verlinken
$breadcrumb .= $bcDivi.$art->toLink();
}
else
{
// Artikelname der aktuellen Seite nicht verlinken
$breadcrumb .= $bcDivi.'<span class="bcActive">'.$this->getValue("name")."</span>\n";
}
}
}
$breadcrumb .='</div>'."\n";
}
// ------------------ Navigationsmenue anhand von root-Artikeln erstellen ------------------
if($raNav=='on')
{
$rootArticles = OOArticle::getRootArticles($ignore_offlines = true, $clang = false);
$raNavigation='';
$raCnt = 1;
foreach($rootArticles as $rootArticle)
{
// ab redaxo 4.x
// mit MetaInfo ob der root-Artikel im Menue erscheinen soll
if($REX['VERSION']>"3" && $rootArticle->hasValue($raMetaInfo))
{
if($rootArticle->getValue($raMetaInfo)=='|true|')
{
if($raCnt>1)
{
$raNavigation=$raNavigation.$raDivi;
}
$raCnt++;
$raNavigation = $raNavigation.$rootArticle->toLink($params='', $attributes=null, $sorround_tag=null, $sorround_attributes=null);
}
}
// redaxo 3. oder redaxo 4.x ohne MetaInfo-Nutzung
else
{
if($raCnt>1)
{
$raNavigation=$raNavigation.$raDivi;
}
$raCnt++;
$raNavigation = $raNavigation.$rootArticle->toLink($params='', $attributes=null, $sorround_tag=null, $sorround_attributes=null);
}
}
}
?>