[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Navigation mit Level 3 - 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/
Dios87
Beiträge: 50
Registriert: 14. Mär 2008, 17:04

Navigation mit Level 3

14. Mär 2008, 17:20

Hallo Zusammen,

an dieser Stelle möchte ich sagen, dass ich mir bewusst bin, dass es zu diesem Thema schon sehr viele Beiträge und auch im Download Verzechnis schon sehr viele Navigationen mit mehr als 2 Ebenen gibt.

Also wie Ihr aus meinem Titel entnehmen könnt möchte ich meine Standart Redaxo 4.1 Navigation (Horizontal - Vertical) um eine 3. Ebene (Vertical)
erweitern.

Ich weiss, ich könnte mir eine solche Navigation auch herunterladen, aber ich würde es gerne selber machen, zumal ich die Navigation schon meinen Wünschen entsprechend angepasst habe (soweit meine Kentnisse dies zulassen) und vorallem um etwas zu lernen und Redaxo näher zu kommen.

Ich habe schon versucht die Navigation um eine 3. Ebene zu erweitern:

Code: Alles auswählen

<?php
// EXPLODE PATH
$PATH = explode("|",$this->getValue("path").$this->getValue("article_id")."|");

// GET CURRENTS
$path1 = (isset ($PATH[1])) ? $PATH[1] : '';
$path2 = (isset ($PATH[2])) ? $PATH[2] : '';
$path3 = (isset ($PATH[3])) ? $PATH[3] : '';
$sitePath = '';
$titlePath = '';
$navLeftCol = '';

/* START 1st level categories */
$navHeader .= '<ul id="menu">';
$navLeftCol .= '<div>';
foreach (OOCategory::getRootCategories() as $lev1) {
		
	if ($lev1->isOnline()):
		if ($lev1->getId() == $path1) {
			$navHeader .= '<li  id="current"><a  href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';
			if ($lev1->getId() != "1") {
				$sitePath .= ' ›› <a href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';
			}
			$titlePath .= ' >> '.$lev1->getName();
		}
		// 2nd level - no active link
		else {
			$navHeader .= '<li><a href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';
		}	
		// 1st level had categories? -> go on 
		
		$lev1Size = sizeof($lev1->getChildren());
		if ($lev1->getId() == $path1) {
		if ($lev1Size != "0"):
			$navLeftCol .= '<ul id="navigation">';
			//$navLeftCol .= '<li>'.$lev1->getName();
			
			$navLeftCol .= '';
// START 2nd level categories 

			foreach ($lev1->getChildren() as $lev2):
				if ($lev2->isOnline()):
				// 2nd level - active link
				
					if ($lev2->getId() == $path2) {
						$navLeftCol .= '<li id="current"><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a></li>';
						$sitePath .= ' ›› <a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';
						$titlePath .= ' >> '.$lev2->getName();
					}
					// 2nd level - no active link
					
					else {
						$navLeftCol .= '<li><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a></li>';
					}
				endif;			
			endforeach;
			// END 2nd level categories		
      // START 3rd level categories 
      
			foreach ($lev2->getChildren() as $lev3):
				if ($lev3->isOnline()):
					// 2nd level - active link
					
					if ($lev3->getId() == $path3) {
						$navLeftCol .= '<li id="current"><a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a></li>';
						$sitePath .= ' ›› <a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a>';
						$titlePath .= ' >> '.$lev3->getName();
					}
					// 2nd level - no active link
					
					else {
						$navLeftCol .= '<li><a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a></li>';
					}
				endif;				
			endforeach;
			// END 3nd level categories
			
			$navLeftCol .= '</ul>';
			$navLeftCol .= '</li></ul>';
		endif; // END by if ($lev1Size != "0"):
		
		}
		$navHeader .= '</li>';

	endif; // END by if ($lev1->isOnline()) 
}
$navHeader .= '</ul>';
$navLeftCol .= '</div>';
// END 1st level categories 

if ($REX['CUR_CLANG'] == 1) $breadcrumb = 'You are here: <a href="index.php?clang=1">Startpage</a> '.$sitePath;
else $breadcrumb = 'Sie befinden sich hier: <a href="index.php">Startseite</a> '.$sitePath;
?>
Für Lösungsansätze und etwas Hilfe bin ich schon sehr Dankbar.

Gruß Kim

Dios87
Beiträge: 50
Registriert: 14. Mär 2008, 17:04

17. Mär 2008, 13:08

Ich habe mittlerweile versucht mir an vorhandenen Navigationen ein Beispiel zu nehmen und meinen Fehler zu finden, aber ich komm einfach nicht drauf.

Vielleicht hab ich hier ein Verständnisproblem? Ist den mein Ansatz richtig??

sebhecht
Beiträge: 126
Registriert: 22. Feb 2008, 11:02
Wohnort: Stuttgart

18. Mär 2008, 10:45

Hallo Kim,
der Ansatz sieht eigentlich richtig aus, hab meine Navigation ähnlich zusammengebastelt.
Was funktioniert denn nicht? Wird überhaupt irgendwas angezeigt oder erscheint gar nichts? Wär gut, das zu wissen, bevor man den Fehler sucht.

Sebastian

Dios87
Beiträge: 50
Registriert: 14. Mär 2008, 17:04

18. Mär 2008, 12:10

Hallo Sebhecht,

zuerst mal Danke für deine Antwort.

Also es funktioniert soweit alles in der Navigation, außer eben das 3. Level.
Ich habe eine horizontale Navigation (Level1, funktioniert) z.B.
Home | Das Unternehmen | Dienstleistungen | Management | ...

Dann die vertikale Navigation (Level2, funktioniert) z.B.

Management

- Gruppe 1
- Gruppe 2
...
Und Level3 wäre dann z.B.

- Gruppe 3
--- Programm
--- Fotos
--- ....

Dies funktioniert nicht, also wenn ich auf Gruppe 3 klicke, wird Programm und Fotos.. nicht angezeigt. Aber das Level3 selber ist über http://localhost/Management/Gruppe-3/Programm erreichtbar.

Das ist mein Code-Bereich für das Level3:

Code: Alles auswählen

// START 3rd level categories
     
         foreach ($lev2->getChildren() as $lev3):
            if ($lev3->isOnline()):
               // 3rd level - active link
               
               if ($lev3->getId() == $path3) {
                  $navLeftCol .= '<li id="current"><a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a></li>';
                  $sitePath .= ' ›› <a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a>';
                  $titlePath .= ' >> '.$lev3->getName();
               }
               // 3rd level - no active link
               
               else {
                  $navLeftCol .= '<li><a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a></li>';
               }
            endif;            
         endforeach;
         // END 3rd level categories 
hier wird ja das neue Level3 einfach über .= zu der variable $navLeftCol hinzugefügt, die ich dann in meinem Template über echo $navLeftCol; ausgebe. Das versteh ich doch richtig?

Aber ich bekomm wie gesagt Level 3 nicht angezeigt, also muss der Fehler ja im o.g. Code liegen. Ich denke das ich wieso auch immer nicht auf das $lev3 zugreifen kann.

Gruß kim

Dios87
Beiträge: 50
Registriert: 14. Mär 2008, 17:04

19. Mär 2008, 17:14

Wèiss niemand was ich falsch mache, oder warum das nicht funktioniert?

Gruß Kim

sebhecht
Beiträge: 126
Registriert: 22. Feb 2008, 11:02
Wohnort: Stuttgart

19. Mär 2008, 17:36

Hallo Kim,

erst mal beendest Du den Abschnitt mit den 2nd-Level-Categories, bevor Du mit den 3rd-Levels beginnst:
// 2nd level - no active link

else {
$navLeftCol .= '<li><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a></li>';
}
endif;
endforeach;
// END 2nd level categories
Das endif und endforeach kommt erst, nachdem Du die 3rd-Levels beendet hast.

Dann gehört noch eine Abfrage vor Deine 3rd-Levels, ähnlich wie Du sie vor den 2nd Levels gemacht hattest (musst Du natürlich anpassen):
// 1st level had categories? -> go on

$lev1Size = sizeof($lev1->getChildren());
if ($lev1->getId() == $path1) {
if ($lev1Size != "0"):
$navLeftCol .= '<ul id="navigation">';
//$navLeftCol .= '<li>'.$lev1->getName();

$navLeftCol .= '';
// START 2nd level categories
Deshalb wurden Deine 3rd-Levels auch ignoriert.

Außerdem verwendest Du mehrmals die CSS-ID "current". IDs verwendet man nur einmal pro Dokument, Du solltest also auf eine Klasse ausweichen (das aber nur nebenbei).

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

19. Mär 2008, 17:37

Hi,

das Template sieht gut aus.. Ich vermute du hast deine Kategorien nicht online gestellt?

Gruß,
Markus

sebhecht
Beiträge: 126
Registriert: 22. Feb 2008, 11:02
Wohnort: Stuttgart

19. Mär 2008, 17:46

So, damit es etwas verständlicher wird, hier mal ein Beispiel:
Ich hab mir mal eine ähnliche Navigation erstellt, bei der vor allem die navLeftCol-Elemente ziemlich genau so sind, wie Deine aussehen sollen.
Guck Dir das mal an (ich hab bei längeren If- und Foreach-Anweisungen am Zeilenende kommentiert, wo sie beginnen und enden). So änlich sollte das dann auch bei Dir aussehen:
<?php
// EXPLODE PATH
$PATH = explode("|",$this->getValue("path").$this->getValue("article_id")."|");

// GET CURRENTS
$path1 = $PATH[1];
$path2 = $PATH[2];
$path3 = $PATH[3];
$path4 = $PATH[4];
$path5 = $PATH[5];

// START Kategorien Level 1
foreach (OOCategory::getRootCategories() as $lev1) { // foreach 1 start
if ($lev1->isOnline()): // if 1 start
if ($lev1->getId() == $path1) {
$navHeader .= '<a class="active" href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';
if ($lev1->getId() != "1") {
$sitePath .= ' › <a href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';
}
$titlePath .= ' >> '.$lev1->getName();
}
else {
$navHeader .= '<a href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';
}

// Hatte Kategorie Level 1 Unterkategorien?
$lev1Size = sizeof($lev1->getChildren());
if ($lev1->getId() == $path1) { // if 2 start
if ($lev1Size != "0"): // if 3 start
// START Kategorien Level 2
$navLeftCol .= '<div id="navigation">';
$navLeftCol .= '<ul class="nav2nd">';
foreach ($lev1->getChildren() as $lev2): // foreach 2 start
if ($lev2->isOnline()): // if 4 start
// 2nd level - active link
if ($lev2->getId() == $path2) {
$navLeftCol .= '<li><a class="active" href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';
$sitePath .= ' › <a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';
$titlePath .= ' >> '.$lev2->getName();
}
// 2nd level - no active link
else {
$navLeftCol .= '<li><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a></li>';
}

// Hatte Kategorie Level 2 Unterkategorien?
$lev2Size = sizeof($lev2->getChildren());
if ($lev2->getId() == $path2) { // if 5 start
if ($lev2Size != "0"): // if 6 start: Existiert Kategorie 3?
// START Kategorien Level 3
$navLeftCol .= '<ul class="nav3rd">';
foreach ($lev2->getChildren() as $lev3): // foreach 3 start
if ($lev3->isOnline()): // if 7 start: Kategorie Level 3 online?
// Level 3 - active link
if ($lev3->getId() == $path3) {
$navLeftCol .= '<li class="active"><a class="current" href="'.$lev3->getUrl().'">'.$lev3->getName().'</a>';
$sitePath .= ' › <a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a>';
$titlePath .= ' >> '.$lev3->getName();
}
// Level 3 - no active link
else {
$navLeftCol .= '<li><a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a>';
}
endif; // if 7 end;
$navLeftCol .= '</li>';
endforeach; // foreach 3 end;
$navLeftCol .= '</ul>';
// ENDE Kategorien Level 3
endif; // if 6 end;
$navLeftCol .= '</li>';
} // if 5 end;

endif; // if 4 end;
endforeach; // foreach 2 end;
endif; // if 3 end;
if ($navLeftCol != "") $navLeftCol .= '</ul>';
$navLeftCol .= '</div>';
// ENDE Kategorien Level 2
} // if 2 end;
endif; // if 1 end;
}; // foreach 1 end;
// ENDE Kategorien Level 1

//Breadcrumb
if ($REX['CUR_CLANG'] == 1) $breadcrumb = 'You are here: <a href="/index.php?clang=1">Startpage</a> '.$sitePath;
else $breadcrumb = 'Sie sind hier: <a href="/index.php">Startseite</a> '.$sitePath;
?>
Da das ganze hier sehr unübersichtlich ist, solltest Du Dir den Text kopieren und in einem Editor betrachten, damit Du einen besseren Überblick hast. Am besten nicht im normalen Windows-Editor. Falls Du keinen besseren hast, würde ich Dir den hier empfehlen: Notepad++
Dort kannst Du Sprache auf PHP stellen und das ganze wird viel übersichtlicher.
Viel Glück
Sebastian

PS: Sorry, irgendwie wurden die Einrückungen nicht übernommen.

Dios87
Beiträge: 50
Registriert: 14. Mär 2008, 17:04

19. Mär 2008, 21:45

Vielen Dank für eure Antworten!!!

Ich hatte bis jetzt leider noch nicht die Zeit zu versuchen meine Navigation zu fixen, aber das ich das Level2 noch nocht beendet habe und im Level3 so beginnen sollte wie in Level1 leuchtet mir ein, und ich denke ich werde das so schon packen!

Ich geb euch die nächsten Tage auf jeden Fall ein Feedback ob ich es so geschafft habe!

Nochmals Vielen Dank für die Hilfe!!!

Ihr seit Super!

Gruß Kim :-)

Dios87
Beiträge: 50
Registriert: 14. Mär 2008, 17:04

25. Mär 2008, 19:03

Ich hab jetzt endlich einmal Zeit gefunden es so zu probieren wie du beschrieben hast sebhecht.

Ich habs hinbekommen, funktioniert 1a. Vielen Dank!!!!!

Es erscheint mir jetzt auch logisch, ist ja klar, wenn ich die foreach-schleife und die if-abfragen vorher beende bevor mein 3. Level startet kanns nicht klappen. :oops:

Das ich IDs nur einmal verwenden sollte hab ich schonmal gelesen, bekomm ich deshalb Fehler mit dem Validator?

Ansonsten ändere ich die currents ab in current1st current2nd etc. oder nutze eben Classes.

Nochmals Vielen Dank!!!!

Schönen Gruß Kim

Benutzeravatar
deynius
Beiträge: 1
Registriert: 16. Dez 2012, 14:41

Re: Navigation mit Level 3

18. Dez 2012, 04:22

Hallo Zusammen,

ich habe ebenfalls eine Navigation mit 3 Ebenen. Allerdings möchte ich das <li> der ersten Ebene auf class="active" setzen, wenn die jeweilige Unterebene aktiviert ist.
Mein Code sieht folgendermaßen aus:

Code: Alles auswählen

<?php
	echo '<ul class="rex-navi1 sf-menu sf-navbar">';
	foreach (OOCategory::getChildrenById (22,$depth = 3,$open = FALSE,$ignore_offlines = TRUE,$clang = false) as $lev1)
	{
	if($lev1->getId() == $REX["ARTICLE_ID"])
	echo '<li class="active"><a href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';
	else
	echo '<li><a href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';

if(count($lev1->getChildren())>0)
	{
	echo '<ul class="nav2">';
	foreach ($lev1->getChildren() as $lev2)
	{
	if($lev2->getId() == $REX["ARTICLE_ID"])
	echo '<li class="active"><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';
	else
	echo '<li><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';

	if(count($lev2->getChildren())>0)
	{
	echo '<ul class="nav3">';
	foreach ($lev2->getChildren() as $lev3)
	{
	if($lev3->getId() == $REX["ARTICLE_ID"])
	echo '<li class="active"><a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a>';
	else
	echo '<li><a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a>';
	}
	echo '</ul>';
	}}
	echo '</ul>';
	}
	echo '</li>';
	}
	echo '</ul>';
?>
[ externes Bild ]

Über ienen guten Tipp, bzw. etwas Hilfe würde ich mich sehr freuen. ^^
Schöne Grüße,

Damien

Benutzeravatar
Cheffchen
Beiträge: 1809
Registriert: 3. Mär 2009, 13:51
Wohnort: Berlin
Kontaktdaten: Website

Re: Navigation mit Level 3

18. Dez 2012, 16:46

Hallo hier im Forum.

zu erst mal ein anschi.... Bitte keine Uralten Beiträge aus der unterwelt holen, du darfst hier auch eigne Themen aufmachen :O)

wie so nimmst nicht rex_navigation::factory? http://www.redaxo.org/de/wiki/index.php ... Navigation

wenn deins weiter nehmen möchte schau dir das mal an: http://www.redaxo.org/de/download/templ ... =&cat_id=2
vor allem das $path1 das kannst für eine abfrage nehmen ob in diesem zweig drin bist.

zb von

Code: Alles auswählen

if($lev1->getId() == $REX["ARTICLE_ID"]) 
in

Code: Alles auswählen

if($lev1->getId() == $path1) 
damit weist das in diesem zweig bist.

Cheffchen

Benutzeravatar
Cheffchen
Beiträge: 1809
Registriert: 3. Mär 2009, 13:51
Wohnort: Berlin
Kontaktdaten: Website

Re: Navigation mit Level 3

19. Dez 2012, 10:54

Hallo,
deynius hat geschrieben:Vieleicht weißt du auch hier eine Lösung: Angenommen ich möchte jeden Button der Hauptkategorie anders färben. Gibt es auch hierfür eine elegante Lösung? (Ist nicht zwingend nötig.) Der Gedanke dahinter ist, dass jede Hauptkategorie ein eigenes Template mit Farbkonzept bekommt.
also ich mach das, in dem ich einfach die ID anspreche. Also am ende des css codes einfach standard hintergrundbild überschreiben.
zb so

Code: Alles auswählen

.ddsmoothmenu ul li.rex-article-2 a {background: url(bg-article-2.png) }
Cheffchen

Zurück zu „Allgemeines [R4]“