[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Problem mit Navigation - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Hirbod
Beiträge: 435
Registriert: 15. Jan 2008, 14:46

Problem mit Navigation

27. Feb 2008, 15:23

Hallo,

habe ein Update von R3 auf R4 gemacht, und nun wird meine Navigation nicht mehr eingezeigt. Habe es im Template richtig eingebunden, aber leider keine Ausgabe. Ich nehme an für R4 müssen noch irgendwelche Änderungen vorgenommen werden, aber leider bin ich noch zu neu in Redaxo um zu wissen wo der braten hängt.

Navigationstemplate:

Code: Alles auswählen

<?php
/*
	Navigationstemplate zur Gestaltung von Seitennavigationen/-menüs auf der
	Grundlage unsortierter Listen (<ul></ul>) mit folgenden Funktionen:

	- beliebige Verschachtelungstiefe
	- Veröffentlichungszeitraum (Online vom/bis) wird beachtet
	- individuelle Benutzerbereiche werden ausgewertet
	- Verschachtelung der unsortierten Listen wahlweise mit w3c-konformer
	  <ul>-Gliederung im jeweils übergeordnetern <li>-Element oder als
	  "Pseudo"-Verschachtelung in nur einem <ul>-Element
	- Wahlweise Anzeige der Untermenüpunkte nur der aktuellen Kategorie oder
	  Anzeige aller Untermenüpunkte
	- Wahlweise getrennte Anzeige von Haupt- und Untermenü
	- Generierung eines Breadcrumb-Menüs

	------------------------------------------------------------------------
	Peter Reiche - www.raybeam.de
	------------------------------------------------------------------------
	letzte Änderung: 25.01.2007:
	Wahlweise getrennte Anzeige von Haupt- und Untermenü ($subUl='extra')
	letzte Änderung: 10.12.2006:
	Einbindung eines "SuperUsers" der alle individuellen Menüpunkte sieht
 	Auswahl: Untermenüpunkte des aktiven Menüpunkts / alle anzeigen
	letzte Änderung: 12.10.2006:
	Darstellung der Untermenüpunkte erweitert
	letzte Änderung: 09.07.2006:
	Breadcrumb-Menü optimiert
	------------------------------------------------------------------------

	Installation:

	Einbindung des Navigationstemplates in das Seitentemplate durch

	// Template f. Navigation bestimmen
	$navTemplateId = "14"; hier die aktuelle Navigations-Template-ID eintragen

	// Navigation einbinden
	include $REX['INCLUDE_PATH']."/generated/templates/$navTemplateId.template";

	Darstellung des Breadcrumb-Menüs im HTML-Teil des Seitentemplates durch:
	print $breadcrumb."\n";

	Darstellung der Navigation im HTML-Teil des Seitentemplates durch:
	print $navigation."\n";
	
	Trennung von Haupt- und Unternavigation durch Setzen des "Menü-Umschalters" auf:
	$subUl = 'extra';
	
	Dadurch Darstellung der Navigation im HTML-Teil des Seitentemplates durch:
	print $navigation."\n";
	
	und Darstellung der Unternavigation im HTML-Teil des Seitentemplates durch:
	print $subNavigation."\n";

	*/
	$arrayNavigation = array();
	function build_navigation($userTyp, $nav, $path, $subUl='on',$pathIndex=1,&$arrayNavigation)
	{
		// in Unterkategorien verlinken, wenn Überkategorie leer
		$hasContent = OOArticleSlice::getFirstSliceForArticle($nav->getId());
		$subcategories = OOCategory::getChildrenById($nav->getId());
		$firstCatChild = $subcategories[0];
		if($hasContent OR !$firstCatChild)
		{
		    $url=$nav->getUrl();
		}
		else
		{
		    $url=$firstCatChild->getUrl();
		} 

		// Wenn der Veröffentlichungszeitraum "Online von / bis zum" nicht zutrifft, wird der
		// Navigationslink nicht angezeigt. Artikel die direkt über den URL aufgerufen
    	// wurden, werden jedoch immer noch angezeigt. Das entsprechende Seiten-Template
    	// muss also bezügl. des Veröffentlichungszeitraums ebenfalls angepasst werden.
    	$time = time();
    	
    	// Type-ID für den "SuperUser", der alle individuellen Menüpunkte sehen darf.
		// Die ID sollte mit dem $su-Wert aus dem Authentifizierungstemplate übereinstimmen.
		$su = 99;
		
      	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 überein
    	// stimmt, geht es weiter
    	if($nav->getTypeId()==1 || $userTyp == $nav->getTypeId() || $userTyp == $su)
      	{
      		// Nur Submenü des aktuellen Root anzeigen
      		if($subUl=='on' || $subUl=='off' || $subUl=='extra')
      		{
      			if($nav->getId()==$path[$pathIndex])
      			{
      				// Durch ...->getChildren(1) anstatt ...->getChildren() werden
        			// nur Kategorien durchlaufen die "online" sind
        			if($nav->getChildren(1))
          			{
          				// "geöffnete" Rootkategorie durch css-Klasse '.open' markieren
          				if($pathIndex==1)
            			{
            				$oClass="open";
            			}
            			else
            			{
            				$oClass="";
            			}
      					if((count($path) > $pathIndex) && ($path[$pathIndex + 1] > 0))
            			{
            				if($pathIndex>1 && $subUl=='extra')
            				{
            					$subNavigation.='<li class="inactive '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" href="'.$url.'">'.$nav->getName().'</a>';
            				}
            				else
            				{
            					$navigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$url.'">'.$nav->getName().'</a>';
            				}
            			}
            			else
            			{
            				// bei 'extra' würde der root-Navigationspunkt ins submenü verschoben, soll er aber nicht
            				if($pathIndex>1 && $subUl=='extra')
            				{
            					$subNavigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$url.'">'.$nav->getName().'</a>';
            				}
            				else
            				{
            					$navigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$url.'">'.$nav->getName().'</a>';
            				}
            			}
            			// Wenn keine untergeordneten <ul>-Tags im Menü verwendet
              			// werden sollen ($subUl='off'), wird der <li>-Tag geschlossen
						if($subUl=='off')
              			{
              				$navigation.= '</li>'."\n";
              			}
              			// Wenn untergeordnete <ul>-Tags im Menü verwendet
            			// werden sollen ($subUl='on'), wird in dem noch offenen
            			// <li>-Tag der <ul>-Tag geöffnet
/*            			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->g3etChildren(1) as $sub)
            			{
            				$tmpNav=build_navigation($userTyp, $sub, $path,$subUl, $pathIndex+1, $arrayNavigation);
//            				$navigation.=$tmpNav[0];
//            				$subNavigation.=$tmpNav[1];
            			}
            			// Wenn untergeordnete <ul>-Tags im Menü 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)
            			{
            				$oClass="open";
            			}
            			else
            			{
            				$oClass="";
            			}

						if($pathIndex>1 && $subUl=='extra')
						{
       						$subNavigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$url.'">'.$nav->getName().'</a>';
       					}
       					else
       					{
       						$navigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$url.'">'.$nav->getName().'</a>';
       					}
       						

						if($subUl=='off')
          				{
          					$navigation.= '</li>'."\n";
          				}
              		}
              	}
              	else
        		{
					if($pathIndex>1 && $subUl=='extra')
					{
						$subNavigation.='<li class="inactive level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" href="'.$url.'">'.$nav->getName().'</a>';
					}
					else
					{
						$navigation.='<li class="inactive level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" href="'.$url.'">'.$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";
        			}
      			}
      		}
      		// Subemenüs aller Kategorien anzeigen
      		elseif($subUl=='allOn' || $subUl=='allOff')
      		{
      			if($nav->getChildren(1))
          		{
          			// "geöffnete" Rootkategorie durch css-Klasse '.open' markieren
          			if($pathIndex==1)
            		{
            			$oClass="open";
            		}
            		else
            		{
            			$oClass="";
            		}
          			if($nav->getId()==$path[$pathIndex])
            		{
            			$navigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$url.'">'.$nav->getName().'</a>';
            		}
            		else
            		{
            			$navigation.='<li class="inactive '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" href="'.$url.'">'.$nav->getName().'</a>';
            		}
            		// Wenn keine untergeordneten <ul>-Tags im Menü verwendet
              		// werden sollen ($subUl='allOff'), wird der <li>-Tag geschlossen
					if($subUl=='allOff')
              		{
              			$navigation.= '</li>'."\n";
              		}
              		// Wenn untergeordnete <ul>-Tags im Menü verwendet
            		// werden sollen ($subUl='allOn'), wird in dem noch offenen
            		// <li>-Tag der <ul>-Tag geöffnet
/*            		else
            		{
            			$navigation.= "\n<ul class=\"subnav".$pathIndex."\">\n";
            		}*/
            		foreach($nav->getChildren(1) as $sub)
            		{
             			$tmpNav=build_navigation($userTyp, $sub, $path,$subUl, $pathIndex+1, $arrayNavigation);
//             			$navigation.=$tmpNav[0];
            		}
            		// Wenn untergeordnete <ul>-Tags im Menü 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 class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$url.'">'.$nav->getName().'</a>';
          			}
          			else
          			{
          				$navigation.='<li class="inactive level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" href="'.$url.'">'.$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>"
      	// gelöscht 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;
      	$arrayNavigation[$pathIndex][] = $navigation;
      	return $navArray;
    }  /////////////////// Ende der function build_navigation //////////////


//////////////// ------- Navigation erstellen ------------ ///////////////

// Voreinstellungen:
    $path = explode("|",$this->getValue("path").$this->getValue("article_id")."|");

// Usertyp festlegen, um Authentifizierung zu ermöglichen
    $userTyp='0';
    if ($FORM['USR_TYP'] != 0)
    {
        $userTyp = $FORM['USR_TYP'];
    }
//////////////////////////////////////////////
//  " M E N Ü - U M S C H A L T E R "
//////////////////////////////////////////////
//  Menü mit <ul></ul> Auszeichnung
//  auch in den Unter-Menüpunkten oder
//  alle Untermenüpunkte ständig anzeigen
//  <ul> einschalten:.................. on
//  <ul> ausschalten:.................. off
//  alle mit <ul> ständig anzeigen:.... allOn
//  alle ohne <ul> ständig anzeigen:... allOff
//  Untermenü extra:................... extra
//////////////////////////////////////////////

    $subUl = 'on';

//////////////////////////////////////////////

   	// 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($userTyp, $nav, $path, $subUl, 1, $arrayNavigation);
     	$navMain.=$navi[0];
     	$navSub.=$navi[1];
   	}
   	
   	ksort($arrayNavigation);
//   	output_ary($arrayNavigation);

   	$i=1;
	foreach($arrayNavigation as $level) {
		$navigation .= '<ul class="nav'.$i.'">';
		foreach ($level as $row) {
			$navigation .= $row;
		}
		$navigation .= '</ul>';
		$i++;
	}
/*	if($navMain)
   	{
   		$navigation= "<ul class=\"navroot\">\n".$navMain."</ul>\n";
   	}
   	
   	if($navSub)
   	{
   		$subNavigation= "<ul class=\"navsub\">\n".$navSub."</ul>\n";
   	}
*/	
//////////////// ------- Breadcrumb erstellen ---------- ////////////////

    $aktArticle = OOArticle::getArticleById($this->getValue('article_id'));
    $tree = $aktArticle->getParentTree();

//////////////////////////////////////////////
//  Titel und Trennzeichen für die
//  Breadcrumb-Links festlegen
//////////////////////////////////////////////

    $bcTitle = 'Sie befinden sich hier: ';
    $bcDivi  = ' > ';

//////////////////////////////////////////////

    if(is_array($path))
    {
    	$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-Einträge 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";
    }
?>

Und Standarttemplate:

Code: Alles auswählen

<?php
	//$navTemplateId = "3";
	
	$navTemplate = new rex_template(3);

	ini_set('arg_separator.output',  '&'); 
	ini_set ( "arg_separator.output", ";");
	ini_set ( "url_rewriter.tags", "a=href");

	// Metadaten bestimmen
	$siteStartArticle = OOArticle::getArticleById($REX['START_ARTICLE_ID'], $REX['CUR_CLANG']);
	$articleK = $siteStartArticle->getValue("_keywords");
	$articleD = $siteStartArticle->getDescription();
	if($this->getValue("description") != "") {
	  $meta_beschreibung = htmlspecialchars($this->getValue("description"));
	} else {
	  $meta_beschreibung = htmlspecialchars($articleD);
	}
	if($this->getValue("keywords")!= "") {
	  $meta_suchbegriffe = htmlspecialchars($this->getValue("keywords"));
	} else {
	  $meta_suchbegriffe = htmlspecialchars($articleK);
	}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
	<title><? print $REX['SERVERNAME'].' : '.$this->getValue("name"); ?></title>
	<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
	<meta name="keywords" content="<?php print $meta_suchbegriffe; ?>" />
	<meta name="description" content="<?php print $meta_beschreibung; ?>" />
	<link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
</head>

<body>
	<div id="wrapper">
		<div id="header">
			<div id="logo">
				<a href="http://dsf.softloop.net/index.php?article_id=<?php echo $REX['START_ARTICLE_ID'] ?>"><img src="pics/logo.gif" alt="Logo"/></a>
			</div> <!-- logo Ende -->
		<div class="smallnav">
			<?php
				switch ($REX['CUR_CLANG']) {
					case 0:
						echo "<span class=\"aktiv\">Deutsch</span>&nbsp;&nbsp;|&nbsp;&nbsp;<a href=".rex_getUrl("","1").">English</a>";
						break;
					case 1:
						echo "<a href=".rex_getUrl("","0").">Deutsch</a>&nbsp;&nbsp;|&nbsp;&nbsp;<span class=\"aktiv\">English</span>";
						break;
				}
			?>
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="index.php?article_id=<?php echo $REX['START_ARTICLE_ID'] ?>">Home</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
			<form action="index.php?" method="get">
				<label for="search">Suche:</label>
				<input type="hidden" name="article_id" value="39" />
				<input type="text" class="text" id="search" name="rexsearch" value="" />
			</form>
		</div>
		</div> <!-- header Ende -->
		<div id="content">
			<div id="navibar">
				<div id="mainnavi">
					<?php
include $navTemplate->getFile();
						print $navigation."\n";
					?>
				</div>
				<div class="content"><?php echo $this->getArticle(3); ?></div>
			</div>
			<div id="article">
				<div id="articleheader">
					<?php echo !$this->getArticle(1) ? "<h1 class=\"standard\">".htmlspecialchars($this->getValue("name"))."</h1>" : ""; ?>
					<?php echo $this->getArticle(2); ?>
				</div>
				<?php echo $this->getArticle(1); ?>
			</div>
		</div> <!-- content Ende -->
	<div id="footer">
		<div class="smallnav"><a href="index.php?article_id=18">Sitemap</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="index.php?article_id=17">Impressum</a></div>
	</div> <!-- footer Ende -->
</div> <!-- wrapper Ende -->

Weiss jmd aus dem Stehgreif heraus was für Änderungen notwendig sind damit die Navigation wieder angezeigt wird?

Benutzeravatar
raybeam
Beiträge: 442
Registriert: 5. Feb 2006, 21:30
Kontaktdaten: Website

27. Feb 2008, 19:49

Hallo Hbod,

ich habe das Navigations-Template im Downloadbereich aktualisiert und im Quelltext, hoffentlich ausführlich, kommentiert:

http://www.redaxo.de/168-Templatedetail ... late_id=24

Ich hoffe, dass es funktioniert. Ich hab's zwar eben nochmal gestestet aber man weiß ja nie :wink:

Die <ul>-Navigation sollte jetzt sowohl unter 3.x als auch unter 4.x funktionieren.

Gruß

Peter

Hirbod
Beiträge: 435
Registriert: 15. Jan 2008, 14:46

27. Feb 2008, 20:02

Danke raybeam, wunderbar, funktioniert einwandfrei. Hab nur in der ganzen eile meine anpassung zerschossen, aber nicht weiter schlimm, hab noch nen Backup. Dankeschön :-)

benny
Beiträge: 171
Registriert: 29. Mai 2007, 09:57
Wohnort: Fulda

5. Mär 2008, 00:43

Hab das Problem leider mit dem "neuen" Template nicht beheben können. Bei mir bleibt $navigation einfach leer.
(Hab ebenfalls von R2 auf R4 gewechselt - Das Template mit dieser Navi/Auth war vorher mit R2 einwandfrei)

Mein Seiten Template begnnt so:

Code: Alles auswählen

<?php

error_reporting(E_ALL ^ E_NOTICE); // Notices ausschalten

//	Setting
////////////////////////////////////////////////////////////////////////////////
$navTemplateId = "2";
$authTemplateId = "3";

ini_set('arg_separator.output',  '&'); 
ini_set ( "arg_separator.output", ";");
ini_set ( "url_rewriter.tags", "a=href");

//	Code
////////////////////////////////////////////////////////////////////////////////
	$article = OOArticle::getArticleById($REX['START_ARTICLE_ID'], $REX['CUR_CLANG']);
	$articleK = $article->getValue("_keywords");
	$articleD = $article->getDescription();

// Den letzten Login des 'master' abrfagen
	$lastLogin = new sql();
        $lastLogin->setQuery("SELECT lasttrydate FROM rex_user WHERE user_id = '1'");

// Die letzte Änderung an dieser Seite
        $articleAktuell = OOArticle::getArticleById($this->article_id);
        $timestamp = $articleAktuell->getValue('updatedate');	

// Authentifizierungs-Template einbinden
	$authTemplate = new rex_template($authTemplateId);	
	include $authTemplate->getFile();

// Navigations-Template einbinden
        $navTemplateInc = new rex_template($navTemplateId);
	include $navTemplateInc->getFile();
Das Template selbst ist zwar eigentlich unnötig hier nochmal zu posten, aber ich machs trotzdem - ist 1:1 das von raybeam

Code: Alles auswählen

<?php
/*
	Navigationstemplate zur Gestaltung von Seitennavigationen/-menüs auf der
	Grundlage unsortierter Listen (<ul></ul>) mit folgenden Funktionen:

	- beliebige Verschachtelungstiefe
	- Veröffentlichungszeitraum (Online vom/bis) wird beachtet
	- individuelle Benutzerbereiche werden ausgewertet
	- Verschachtelung der unsortierten Listen wahlweise mit w3c-konformer
	  <ul>-Gliederung im jeweils übergeordnetern <li>-Element oder als
	  "Pseudo"-Verschachtelung in nur einem <ul>-Element
	- Wahlweise Anzeige der Untermenüpunkte nur der aktuellen Kategorie oder
	  Anzeige aller Untermenüpunkte
	- Wahlweise getrennte Anzeige von Haupt- und Untermenü
	- Generierung eines Breadcrumb-Menüs

	------------------------------------------------------------------------
	Peter Reiche - www.raybeam.de
	------------------------------------------------------------------------
	letzte Änderung: 27.02.2008:
	Anpassung an redaxo 3.x/4.x
	letzte Änderung: 25.01.2007:
	Wahlweise getrennte Anzeige von Haupt- und Untermenü ($subUl='extra')
	letzte Änderung: 10.12.2006:
	Einbindung eines "SuperUsers" der alle individuellen Menüpunkte sieht
 	Auswahl: Untermenüpunkte des aktiven Menüpunkts / alle anzeigen
	letzte Änderung: 12.10.2006:
	Darstellung der Untermenüpunkte erweitert
	letzte Änderung: 09.07.2006:
	Breadcrumb-Menü optimiert
	------------------------------------------------------------------------

	Installation:

	Einbindung des Navigationstemplates in das Seitentemplate durch

	Template f. Navigation bestimmen:
	$navTemplateId = "2"; hier die aktuelle Navigations-Template-ID eintragen

	Navigation einbinden redaxo 3.x:
	include $REX['INCLUDE_PATH']."/generated/templates/$navTemplateId.template";

	Navigation einbinden redaxo 4.x:
	$navTemplateInc = new rex_template($navTemplateId);
	include $navTemplateInc->getFile();

	Darstellung des Breadcrumb-Menüs im HTML-Teil des Seitentemplates durch:
	print $breadcrumb."\n";

	Darstellung der Navigation im HTML-Teil des Seitentemplates durch:
	print $navigation."\n";

	Trennung von Haupt- und Unternavigation durch Setzen des "Menü-Umschalters" auf:
	$subUl = 'extra';

	Dadurch Darstellung der Navigation im HTML-Teil des Seitentemplates durch:
	print $navigation."\n";

	und Darstellung der Unternavigation im HTML-Teil des Seitentemplates durch:
	print $subNavigation."\n";

	*/

	function build_navigation($userTyp, $nav, $path, $subUl='on',$pathIndex=1)
	{
		// Wenn der Veröffentlichungszeitraum "Online von / bis zum" nicht zutrifft, wird der
		// Navigationslink nicht angezeigt. Artikel die direkt über den URL aufgerufen
    	// wurden, werden jedoch immer noch angezeigt. Das entsprechende Seiten-Template
    	// muss also bezügl. des Veröffentlichungszeitraums ebenfalls angepasst werden.
    	$time = time();

    	// Type-ID für den "SuperUser", der alle individuellen Menüpunkte sehen darf.
		// Die ID sollte mit dem $su-Wert aus dem Authentifizierungstemplate übereinstimmen.
		$su = 99;

		// -------> redaxo 4.0 Anpassung:
		// online_from und online_to werden nunmehr über Metainformationen der Artikel zur
		// Verfügung gestellt.
		global $REX;

		if($REX['VERSION']>"3")
		{
			$onlineFrom = 'art_online_from';
			$onlineTo = 'art_online_to';
		}
		else
		{
			$onlineFrom = 'online_from';
			$onlineTo = 'online_to';
		}
		// Folgende Felder müssen, falls nicht vorhanden, in der redaxo 4.x über "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 Prüfung
		// einbezogen, wenn sich art_online_from und art_online_to unterscheiden.
		if($nav->getValue($onlineFrom) != $nav->getValue($onlineTo))
		{
      		if($nav->getValue($onlineFrom) > $time || $nav->getValue($onlineTo) < $time)
      		{
      			return;
      		}
		}
      	// Wenn die Typ-ID des Startartikels leer ist oder der UserTyp des angemeldeten
      	// Benutzers mit der Typ-ID des Startartikels der aktuellen Kategorie überein
    	// stimmt, geht es weiter.

    	// -------> redaxo 4.0 Anpassung:
    	// Der Artikel-Typ wird nun über die Metainformationen der Artikel zur Verfügung gestellt
    	// Folgendes Feld muss, falls nicht vorhanden, über "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 für alle sichtbaren Artikels dar.
		// ZUSATZ:
		// Das simple-user Addon wird derzeit nicht vollständig von redaxo 4.x unterstützt,
		// bzw. wurde es nicht an die Version 4.x angepasst. Da derzeit ein neues community - Addon
		// entwickelt wird, ist mit einer Anpassun auch nicht mehr zu rechnen. Das gilt auch für
		// dieses Template. Die Einbindung des simple-user Addon unter redaxo 4.x mit diesem
		// Navigationstemplate wurde von mir nicht getestet!

		// redaxo 4.x

		if($REX['VERSION']>"3")
		{
			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();
		}

    	if($artTypeId =='1' || $userTyp == $nav->getTypeId() || $userTyp == $su)
      	{
      		// Nur Submenü des aktuellen Root anzeigen
      		if($subUl=='on' || $subUl=='off' || $subUl=='extra')
      		{
      			if($nav->getId()==$path[$pathIndex])
      			{
      				// Durch ...->getChildren(1) anstatt ...->getChildren() werden
        			// nur Kategorien durchlaufen die "online" sind
        			if($nav->getChildren(1))
          			{
          				// "geöffnete" Rootkategorie durch css-Klasse '.open' markieren
          				if($pathIndex==1)
            			{
            				$oClass="open";
            			}
            			else
            			{
            				$oClass="";
            			}
      					if((count($path) > $pathIndex) && ($path[$pathIndex + 1] > 0))
            			{
            				if($pathIndex>1 && $subUl=='extra')
            				{
            					$subNavigation.='<li class="inactive '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
            				}
            				else
            				{
            					$navigation.='<li class="inactive '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
            				}
            			}
            			else
            			{
            				// bei 'extra' würde der root-Navigationspunkt ins submenü verschoben, soll er aber nicht
            				if($pathIndex>1 && $subUl=='extra')
            				{
            					$subNavigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
            				}
            				else
            				{
            					$navigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
            				}
            			}
            			// Wenn keine untergeordneten <ul>-Tags im Menü verwendet
              			// werden sollen ($subUl='off'), wird der <li>-Tag geschlossen
						if($subUl=='off')
              			{
              				$navigation.= '</li>'."\n";
              			}
              			// Wenn untergeordnete <ul>-Tags im Menü verwendet
            			// werden sollen ($subUl='on'), wird in dem noch offenen
            			// <li>-Tag der <ul>-Tag geöffnet
            			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($userTyp, $sub, $path,$subUl, $pathIndex+1);
            				$navigation.=$tmpNav[0];
            				$subNavigation.=$tmpNav[1];
            			}
            			// Wenn untergeordnete <ul>-Tags im Menü 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)
            			{
            				$oClass="open";
            			}
            			else
            			{
            				$oClass="";
            			}

						if($pathIndex>1 && $subUl=='extra')
						{
       						$subNavigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
       					}
       					else
       					{
       						$navigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
       					}


						if($subUl=='off')
          				{
          					$navigation.= '</li>'."\n";
          				}
              		}
              	}
              	else
        		{
					if($pathIndex>1 && $subUl=='extra')
					{
						$subNavigation.='<li class="inactive level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
					}
					else
					{
						$navigation.='<li class="inactive level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" 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";
        			}
      			}
      		}
      		// Subemenüs aller Kategorien anzeigen
      		elseif($subUl=='allOn' || $subUl=='allOff')
      		{
      			if($nav->getChildren(1))
          		{
          			// "geöffnete" Rootkategorie durch css-Klasse '.open' markieren
          			if($pathIndex==1)
            		{
            			$oClass="open";
            		}
            		else
            		{
            			$oClass="";
            		}
          			if($nav->getId()==$path[$pathIndex])
            		{
            			$navigation.='<li class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
            		}
            		else
            		{
            			$navigation.='<li class="inactive '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
            		}
            		// Wenn keine untergeordneten <ul>-Tags im Menü verwendet
              		// werden sollen ($subUl='allOff'), wird der <li>-Tag geschlossen
					if($subUl=='allOff')
              		{
              			$navigation.= '</li>'."\n";
              		}
              		// Wenn untergeordnete <ul>-Tags im Menü verwendet
            		// werden sollen ($subUl='allOn'), wird in dem noch offenen
            		// <li>-Tag der <ul>-Tag geöffnet
            		else
            		{
            			$navigation.= "\n<ul class=\"subnav".$pathIndex."\">\n";
            		}
            		foreach($nav->getChildren(1) as $sub)
            		{
             			$tmpNav=build_navigation($userTyp, $sub, $path,$subUl, $pathIndex+1);
             			$navigation.=$tmpNav[0];
            		}
            		// Wenn untergeordnete <ul>-Tags im Menü 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 class="active '.$oClass.' level'.$pathIndex.'"><a class="level'.$pathIndex.' active" href="'.$nav->getUrl().'">'.$nav->getName().'</a>';
          			}
          			else
          			{
          				$navigation.='<li class="inactive level'.$pathIndex.'"><a class="level'.$pathIndex.' inactive" 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>"
      	// gelöscht 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 //////////////


//////////////// ------- Navigation erstellen ------------ ///////////////

// Voreinstellungen:
    $path = explode("|",$this->getValue("path").$this->getValue("article_id")."|");

// Usertyp festlegen, um Authentifizierung zu ermöglichen
    $userTyp='0';
    if ($FORM['USR_TYP'] != 0)
    {
        $userTyp = $FORM['USR_TYP'];
    }
//////////////////////////////////////////////
//  " M E N Ü - U M S C H A L T E R "
//////////////////////////////////////////////
//  Menü mit <ul></ul> Auszeichnung
//  auch in den Unter-Menüpunkten oder
//  alle Untermenüpunkte ständig anzeigen
//  <ul> einschalten:.................. on
//  <ul> ausschalten:.................. off
//  alle mit <ul> ständig anzeigen:.... allOn
//  alle ohne <ul> ständig anzeigen:... allOff
//  Untermenü extra:................... extra
//////////////////////////////////////////////

    $subUl = 'on';

//////////////////////////////////////////////

   	// 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($userTyp, $nav, $path, $subUl);
     	$navMain.=$navi[0];
     	$navSub.=$navi[1];
   	}

	if($navMain)
   	{
   		$navigation= "<ul class=\"navroot\">\n".$navMain."</ul>\n";
   	}

   	if($navSub)
   	{
   		$subNavigation= "<ul class=\"navsub\">\n".$navSub."</ul>\n";
   	}

//////////////// ------- Breadcrumb erstellen ---------- ////////////////

    $aktArticle = OOArticle::getArticleById($this->getValue('article_id'));
    $tree = $aktArticle->getParentTree();

//////////////////////////////////////////////
//  Titel und Trennzeichen für die
//  Breadcrumb-Links festlegen
//////////////////////////////////////////////

    $bcTitle = 'Sie befinden sich hier: ';
    $bcDivi  = ' > ';

//////////////////////////////////////////////

    if(is_array($path))
    {
    	$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-Einträge 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";
    }
?>
Ich bin durch den Code im Navi-Template noch nicht durchgestiegen - find den Fehler bis jetzt noch nicht.
mfg Benny

Benutzeravatar
raybeam
Beiträge: 442
Registriert: 5. Feb 2006, 21:30
Kontaktdaten: Website

5. Mär 2008, 12:55

Hallo Benny,

deine Einbindung der Templates scheint ja auf den ersten Blick soweit in Ordnung zu sein.

Ich könnte mir vorstellen, dass evt. Probleme bei der Überprüfung der Artikel-Typen bestehen, so dass gar keine Navigation angezeigt wird.

Im Navigationstemplate habe ich die Neuerungen, die man bei der V. 4 beachten muss, näher erläutert. Vielleicht schaust Du dir diesen Bereich noch mal an?

Gruß

Peter

Zurück zu „Allgemeines [R4]“