Seite 1 von 4

neues Hauptmenü - Vollständige Anleitung

Verfasst: Sa 28. Sep 2002, 20:18
von Sven777b
Weil es immer wieder Fragen und auch diverse Bugfixes etc gegeben hat, hier nochmal ganz genau und komplett erklärt. In dieser Erklärung ist auch die Änderung der front_content.php beschrieben.

Ich sage gleich vorweg wieder, dass man sich vorher sein Layout und die front_content sichern sollte – falls etwas schief geht – oder nicht so klappt, wie es sollte.

Ersteinmal die front_content.php editieren:

Der alte Code für die Hauptnavigation enthielt einige SQL-Abfragen, die nunmehr unnötig geworden sind – daher werden sie entfernt und durch die beiden neuen ersetzt:

Suche:

Code: Alles auswählen

$sql = "SELECT A.idcat, visible, public FROM $cfgTab_cat_tree AS A, $cfgTab_cat AS B, $cfgTab_cat_lang AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND B.idclient='$client' AND C.idlang='$lang' AND level='0' ORDER BY idtree";
$db->query($sql);
$i=1;
while ($db->next_record())
	{$sql = "SELECT parentid, A.idcat, name, visible, public FROM $cfgTab_cat_tree AS A, $cfgTab_cat AS B, $cfgTab_cat_lang AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND B.idclient='$client' AND C.idlang='$lang' AND B.parentid='".$db->f("idcat")."' ORDER BY A.idtree";
	$db2 = new DB_Contenido;
	$db2->query($sql);
	$j=1;
	while ($db2->next_record())
		{if ($db->f("visible") == "1" & $db2->f("visible") == "1")
			{if ($db->f("public") == "1" & $db2->f("public") == "1" | $auth->auth["uid"] != "nobody")
				{$tree["".$i.""]["".$j.""][link] = $sess->url("front_content.php?client=".$client."&lang=".$lang."&parent=".$db2->f("parentid")."&subid=".$db2->f("idcat")."&idcat=".$db2->f("idcat")."");
				$tree["".$i.""]["".$j.""][idcat] = $db2->f("idcat");
				$tree["".$i.""]["".$j.""][name] = $db2->f("name");
                                 if ($tree[$i][$j][idcat] == $subid)
                                 {$sql = "SELECT parentid, A.idcat, name, visible, public FROM $cfgTab_cat_tree AS A, $cfgTab_cat AS B, $cfgTab_cat_lang AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND B.idclient='$client' AND C.idlang='$lang' AND B.parentid='".$db2->f("idcat")."' ORDER BY A.idtree";
				$db3 = new DB_Contenido;
				$db3->query($sql);
				$k=1;
				while ($db3->next_record())
					{if ($db3->f("visible") == "1")
                                         	{if ($db3->f("public") == "1" | $auth->auth["uid"] != "nobody")
                                                 {$tree["".$i.""]["".$j.""]["".$k.""][link] = $sess->url("front_content.php?client=".$client."&lang=".$lang."&parent=".$db3->f("parentid")."&subid=$subid&idcat=".$db3->f("idcat")."");
						$tree["".$i.""]["".$j.""]["".$k.""][idcat] = $db3->f("idcat");
						$tree["".$i.""]["".$j.""]["".$k.""][name] = $db3->f("name");
                                                 $k++;}}}}
                                 $j++;}}}
$i++;}
Ersetze mit

Code: Alles auswählen

// --------------------------------------------------------------------- //
// Gruppen einlesen //
$sql = "SELECT A.idcat, A.parentid, A.preid, A.postid, B.name, B.public, B.visible, C.level FROM $cfgTab_cat AS A, $cfgTab_cat_lang AS B, $cfgTab_cat_tree AS C WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND A.idclient='$client' AND B.idlang='$lang'";
$db->query($sql);
while($db->next_record()){
	$con_tree[$db->f("idcat")][parent]	= $db->f("parentid");
	$con_tree[$db->f("idcat")][preid]	= $db->f("preid");
	$con_tree[$db->f("idcat")][postid]	= $db->f("postid");
	$con_tree[$db->f("idcat")][titel]	= $db->f("name");
	$con_tree[$db->f("idcat")][public]	= $db->f("public");
	$con_tree[$db->f("idcat")][visible]	= $db->f("visible");
	$con_tree[$db->f("idcat")][level]	= $db->f("level");
	$con_tree[$db->f("idcat")][link]	= $sess->url("front_content.php?client=".$client."&lang=".$lang."&parent=".$db->f("parentid")."&idcat=".$db->f("idcat")."");
	if($db->f("idcat") > $con_tree_max){$con_tree_max = $db->f("idcat");} 
};
// Seiten einlesen //
$sql = "SELECT A.idcat, A.idside, A.is_start, B.title, B.summary, C.public FROM $cfgTab_cat_side AS A, $cfgTab_side_lang AS B, $cfgTab_cat_lang AS C, $cfgTab_cat AS D WHERE A.idside=B.idside AND A.idcat=C.idcat AND C.idcat=D.idcat AND A.online='1' AND C.visible='1' AND D.idclient='$client'";
$db->query($sql);
while($db->next_record()){
	$con_side[$db->f("idcat")][$db->f("idside")][idcat]		= $db->f("idcat");
	$con_side[$db->f("idcat")][$db->f("idside")][idside]	= $db->f("idside");
	$con_side[$db->f("idcat")][$db->f("idside")][is_start]	= $db->f("is_start");
	$con_side[$db->f("idcat")][$db->f("idside")][titel]		= $db->f("title");
	$con_side[$db->f("idcat")][$db->f("idside")][summary]	= $db->f("summary");
	$con_side[$db->f("idcat")][$db->f("idside")][public]	= $db->f("public");
	$con_side[$db->f("idcat")][$db->f("idside")][link]		= $sess->url("front_content.php?client=".$client."&lang=".$lang."&idcat=".$db->f("idcat")."&idside=".$db->f("idside")."");
};
// --------------------------------------------------------------------- //
Wer sich mit PHP auskennt, wird feststellen, dass hier eine 2. Abfrage ist, die auch die Seiten abruft. Diese wird für die Hauptnavigation noch nicht benötigt. Ist aber hilfreich, wenn man eine noch bessere Navigation schaffen will.
Hinweise für Entwickler kommen später...

Nun zum Layout

wer die Demos verwendet, der hat im Demo-Layout auch eine feste Navigation. Diese ist eingerahmt durch:
<!-- begin main-navigation-->
<!-- end main-navigation-->
da zwischen kommt die neue Navigation ... ansonsten halt einfach dorthin, wo sie am besten passt.
die hauptnavigation sieht so aus:

Code: Alles auswählen

<!-- BEGIN MAIN_NAVIGATION -->
<?php
//-----------------------------------------------------------------------------//
$nav_start = '3';
$nav_col_out  = "#6699FF";
$nav_col_over = "#9999FF";
$nav_col_back = "#6600FF";
$nav_col_on   = "#FF0000";
$nav_col_off  = "#000000";
// offenen Pfad finden //
$nav_path = array();
$nav_tree = array();
$tmp_idcat = $idcat;
while($tmp_idcat > 0){
	array_push($nav_path, $tmp_idcat);
	$tmp_idcat = $con_tree[$tmp_idcat][parent];
};
$nav_path = array_reverse($nav_path);
if($nav_path[0] != $nav_start){$nav_path = array($nav_start);};
// Baum sortieren //
for($i = 0;$i < sizeof($nav_path);$i++){
	$tmp_found=0;
	for($nr = 0; $nr <= $con_tree_max; $nr++){
		if($con_tree[$nr][parent] == $nav_path[$i] && $con_tree[$nr][preid] == '0'){$tmp_found=1;break;}
	}
	unset($tmp_level);$tmp_level = array();
	do{
		array_push($tmp_level , $nr);
		$nr = $con_tree[$nr][postid];
	} while($nr != '0' && $tmp_found==1);
	if($i == 0){$nav_tree = $tmp_level;} 
	else {
		$x = array_search("$nav_path[$i]", $nav_tree);
		array_splice($nav_tree, $x+1, 0, $tmp_level);
	};			
};
// Baum ausgeben //
echo "<table width=100% cellspacing=\"5\" cellpadding=\"0\" border=\"0\">\n";
foreach($nav_tree as $nr){
	if(($con_tree[$nr][public] == '1' or $auth->auth["uid"] != "nobody") and $con_tree[$nr][visible] == '1'){
		echo "<tr><td onMouseOver=\"this.style['background']='".$nav_col_over."';\" ";
		echo "onMouseOut=\"this.style['background']='".$nav_col_out."';\" bgcolor=\"$nav_col_out\" nowrap>";
		unset($mod_space);$mod_space = array();
		$mod_space = array_pad($mod_space,($con_tree[$nr][level] - 1),"&nsbp;&nbsp;");
		echo "<span style='background-color:".$nav_col_back.";'>".implode("",$mod_space)."</span>";
		if($nr == $idcat){ echo "<span style='background-color:".$nav_col_on."'>&nbsp;</span>"; } 
		else { echo "<span style='background-color:".$nav_col_off."'>&nbsp;</span>"; };
		echo "<a href=\"".$con_tree[$nr][link]."\" id=\"left-menu\">".$con_tree[$nr][titel]."</a></td></tr>";
	};
};
unset($nav_tree);unset($nav_path);
echo "</table>";
?>
<!-- END MAIN_NAVIGATION -->
Jetzt das Menü konfigurieren

$nav_start = '3';
hier wird der Startpunkt festgelegt. Eigentlich ist das nicht der Startpunkt... es geht darum, dass man ja auch den Baum "Service" hat. Und wenn man dort hin klickt, kann es passieren, dass die Navigation ab sofort die Service-Punkte anzeigt. Um das zu verhindern, wird überprüft, ob die aktuelle Seite eine Unterseite dieser Startkategorie ist.

Wie finde ich raus, welchen Startpunkt ich habe?
- Normalerweise sind die Startpunkte so verteilt: home client1 = 1 ; service client1 = 2 ; home client2 = 3 ; service client2 = 4
also ist der Startpunkt meist die 3
- wenn es nicht geht, wirds wohl ein anderer Punkt sein - also:
-- im backend auf "Content" -> "Struktur" gehen.
-- Hinter dem Punkt "home" mit der maus über den Link "umbenennen" fahren.
-- in der Statuszeile unten kann man den Link sehen. Da steht irgendwo z.b. idcat=3 <- diese Nummer ist der Startpunkt.


$nav_col_out = "#6699FF";
Die Zeilenfarbe für einen normalen Menüpunkt.

$nav_col_over = "#9999FF";
Die Zeilenfarbe, wenn man mit der Maus darüber fährt.

$nav_col_back = "#6600FF";
Ein kleiner Trick... hier sollte die Farbe des Hintergrundes eingetragen werden. Dadurch wird das Einrücken simuliert. Der erste Teil der Zeile wird einfach in dieser Farbe dargestellt.

$nav_col_on = "#FF0000";
Die Farbe des Markierers vor einem normalen Menüpunkt

$nav_col_off = "#000000";
Die Farbe des Markierers vor dem aktuellen Menüpunkt

F.A.Q
Die Unterpunkte sind nicht mehr eingerückt und die Markierung fehlt
-dann wird wohl wieder das &nbsp; in ein normales Leerzeichen umgewandelt worden sein. Das passiert jedesmal, wenn man das Layout ändert. Also immer gleich die Leerzeichen drch &nbsp; ersetzen. Es sind insgesamt 4 Stück in der Navigation verteilt.

Es erscheint überhaupt keine Navigation
- entweder stimmt der Startpunkt nicht
- oder die Änderung in der front_content.php wurden nicht vorgenommen

Jetzt werden die Service-Punkte nicht mehr angezeigt
- das ist richtig... durch die Änderung in der front_content.php geht die <!--Second Navigation--> nicht mehr. Stattdessen kann man aber einen Container dort einbinden und das normale Navigations-Modul benutzen. Die Navigation wie folgt konfigurieren:
* Gruppen
* den Baum "Service" markieren.

Alternativ kann man auch ein festes Servicemenü bauen... das kann so aussehen:

Code: Alles auswählen

<!-- BEGIN SECOND_NAVIGATION -->
<?php
//-----------------------------------------------------------------------------//
$baum = '4';
$font_normal  = "font11";
$font_aktiv   = "font3";
// Baum sortieren //
for($nr = 0; $nr <= $con_tree_max; $nr++){
	if($con_tree[$nr][parent] == $baum && $con_tree[$nr][preid] == '0'){$tmp_found=1;break;}
}
unset($nav_tree);$nav_tree = array(); $i = -1;
do{
	array_push($nav_tree , $nr);
	$nr = $con_tree[$nr][postid];
	$i++;
} while($nr != '0' && $tmp_found==1 && $i <= $con_tree_max);
// Baum ausgeben //
foreach($nav_tree as $nr){
	if(($con_tree[$nr][public] == '1' or $auth->auth["uid"] != "nobody") and $con_tree[$nr][visible] == '1'){
		echo "<a href=\"".$con_tree[$nr][link]."\" id=\"";
		if($nr == $idcat){ echo $font_aktiv; } else { echo $font_normal; };
		echo "\">".$con_tree[$nr][titel]."</a> ";
		if($con_tree[$nr][postid] != 0){ echo "| "; };
	};
};
unset($nav_tree);
?>
<!-- END SECOND_NAVIGATION -->
Anmerkung für Entwickler:
Durch die Änderung in der front_content.php werden einige neue Variablen zur Verfügung gestellt und alte sind verschwunden.
Die Variable $tree ist jetzt weg!
Stattdessen folgendes:
$con_tree[?] enthält jede Kategorie (auch versteckte und geschützte) der Reihe nach in Abhängigkeit zu ihrer idcat.
- also $con_tree[1] enthält vermutlich alle Info´s zum Menüpunkt "haupt" des Client 1
- es werden nur die Punkte des aktuellen Clienten und der aktuellen Sprache eingelesen.

$con_tree[?][parent] - die übergeordnete Kategorie (vorige Ebene)
$con_tree[?][preid] - die vorangehende Seite in dieser Ebene (sortierung) (wenn 0 - dann ist es die erste)
$con_tree[?][postid] - die nachfolgende Seite in dieser Ebene (Sortierung) (wenn 0 - dann ist es die letzte)
$con_tree[?][titel] - der Name dieser Kategorie
$con_tree[?][public] - ist 1 wenn die Kategorie öffentlich ist und 0 wenn sie geschützt ist.
$con_tree[?][visible]- ist 1 wenn die Seite online ist und 0 wenn die Seite offline ist.
$con_tree[?][level] - enthält die Nummer der Ebene (Ebene 0 ist haupt und service)
$con_tree[?][link] - enthält den Link zur Startseite dieser Kategorie

$con_tree_max enthält die höchste idcat. Kann zur Sicherheit in loops eingebaut werden um zu verhindern, dass sich das Script tot läuft. Einfach von 0 - $con_tree_max zählen lassen - wird der Wert überschritten, ist es sinnlos weiter zu suchen.

$con_side[?][??] enthält jede Seite in Abhängigkeit zu ihrer idcat und idside. Der erste Wert ist idcat und der 2. ist idside. Somit kann man schnell alle unterseiten einer kategorie auflisten. Es sind nämlich bei idcat=1 z.b. $con_side[1][?].
Es werden nur die Seiten des aktuellen Clients und der aktuellen Sprache eingelesen, die online sind und deren Kategorie sichtbar ist.

$con_side[?][??][idcat] - enthält die aktuelle idcat.
$con_side[?][??][idside] - enthält die aktuelle idside.
$con_side[?][??][is_start] - ist 1 wenn die Seite eine Startseite ist - sonst 0
$con_side[?][??][titel] - der Titel der aktuellen Seite
$con_side[?][??][summary] - die zusammenfassung der aktuellen Seite
$con_side[?][??][public] - ist 1 wenn die übergeordnete Kategorie öffentlich ist. Sonst 0
$con_side[?][??][link] - ist der Link zu dieser Seite.

so... das wars erstmal - ich hoffe, alle klarheiten sind beseitigt

Verfasst: So 29. Sep 2002, 00:04
von Björn
Wenn das mal kein Knaller ist !!! Damit dürfte die Performance im Forntend auch nochmal ein wenig gepusht werden.

Eine super ERWEITERUNG :)

Gruß Björn

Verfasst: So 29. Sep 2002, 00:17
von Sven777b
Eine super ERWEITERUNG
hab ich doch geahnt dass ich im falschen Forum bin :oops:

Verfasst: So 29. Sep 2002, 11:57
von Sausi
Sven777b hat geschrieben:
Eine super ERWEITERUNG
hab ich doch geahnt dass ich im falschen Forum bin :oops:
Also, egal, ob dies eine ERWEITERUNG oder Verbesserung oder dergleichen ist: Ich find die Navi klasse, hab sie aber noch ein bisschen modifiziert, um auf "style" verzichten zu können.

Thanks!!

Sausi

kleiner Bug in Svens Superscript!

Verfasst: Do 3. Okt 2002, 12:07
von detlev
Achtung: kleiner Bug in Svens Superscript!
// Seiten einlesen //
$sql = "SELECT A.idcat, A.idside, A.is_start, B.title, B.summary, C.public FROM $cfgTab_cat_side AS A, $cfgTab_side_lang AS B, $cfgTab_cat_lang AS C, $cfgTab_cat AS D WHERE A.idside=B.idside AND A.idcat=C.idcat AND C.idcat=D.idcat AND A.online='1' AND C.visible='1' AND D.idclient='$client'";
ersetzen durch:// Seiten einlesen //
$sql = "SELECT A.idcat, A.idside, A.is_start, B.title, B.summary, C.public FROM $cfgTab_cat_side AS A, $cfgTab_side_lang AS B, $cfgTab_cat_lang AS C, $cfgTab_cat AS D WHERE A.idside=B.idside AND A.idcat=C.idcat AND C.idcat=D.idcat AND B.online='1' AND C.visible='1' AND D.idclient='$client'";

Die Spalte online steht nämlich in der Tabelle $confTab_side_lang
War aber wahrscheinlich nur ein Flüchtigkeitsfehler im ansonsten überzeugend guten Script.
Die Fehlermeldung stehen im errorlog.txt des jeweiligen Clients.

Gruß
Detlev

Verfasst: Fr 4. Okt 2002, 12:55
von jknoblich
Ich sitze gerade wie ein Blöder vor dem Code und versuche zu verstehen, wo ich mir die Seiten auflisten kann.
Hintergrund ist der, dass ich unterhalb der Hauptkategorien(z.B. Home, Service) nur einfache Seiten anlegen will, bzw. der zukünftige Autor nicht die Struktur und damit verbunden, die Templates für jede Kategorie anpassen soll.

Also einfach gesagt, will ich nur die Hauptkategorie aufgelistet sehen und nach Klick sollen die Seiten kommen.

Da komm ich nur nicht so richtig weiter.
Irgendwo müsste da nun noch eine Schleife rein, die via con_side[nr] die aktuellen Seiten ausgibt.

Aber wie mach ich das genau ?

Verfasst: Mo 7. Okt 2002, 17:55
von detlev
Ein weiterer Riesenvorteil von Svens Script, dass auch auf Umsortieren reagiert:

Wenn man mit mehreren Clients innerhalb einer Site arbeitet, denen allen dieselben Layouts zur Verfügung gestellt werden, kann man die Code-Schnippsel aus dem Layout in eine getrennte include-Datei packen und lässt das Script dynamisch auf den aufgerugenen Client reagieren, ohne die
Variable $nav_start festlegen zu müssen:
einfach die Zeile:

$nav_start = '3';
austauschen gegen:

if($parent>0)
$nav_start=$parent;
else
$nav_start=$idcat;

und schon wird automatisch für jeden Client die Navigation ausgehend vom jeweiligen root aufgebaut.
Für größere Sites supergut.

Interessant ist natürlich die Frage, ob denn so gute Scripts in die nächste Version einfliessen, eine frühe Beantwortung dieser Frage nimmt viel Unsicherheit.

Gruß
Detlev

Verfasst: Mo 7. Okt 2002, 18:03
von Eppi
ja :-)

Verfasst: Mo 7. Okt 2002, 20:20
von Sven777b
ich fühle mich geehrt :oops:

Verfasst: Fr 11. Okt 2002, 18:03
von jacke
Hallo Sven habe dein Navi ins front_frame eingebaut( + java skript).

Leider werden keine unterkategorien angezeigt. im main (Menu1) funktioniert es sehr gut. Leider nicht im left_frame woran kann das liegen?

Jacke

Verfasst: Fr 11. Okt 2002, 18:08
von jacke
Vergessen: der Schrott ist unter
www.anlagen-planung.de/contenido/front_frame

zu finden.

Schönen Freitag!

Verfasst: Fr 11. Okt 2002, 19:12
von Sven777b
das liegt daran, dass das Menü anhand der Variable $idcat aufgebaut wird. In deinem Main-Bereich wird diese variable auch übergeben - aber nicht im left_frame.

du müsstest quasi versuchen, dass wenn du den Link "Menü1" anklickst (idcat=12) die idcat an demo_left.php mit übergeben wird. d.h. du musst beide Frames aktualisieren. Es sollte beim linken Frame reichen, einfach das linke Frame auf
left_frame.php?idcat=12
zu aktualisieren. halt jeweils in Abhängigkeit zum aktuellen Link.
Du kannst mir ja mal deine left_frame.php zusenden und ich bau dir das ein (oder hier posten - kann ja net viel sein)

Verfasst: Fr 11. Okt 2002, 20:21
von websugar
habe versucht die neue navigation auf eine andere struktur anzupassen.
hauptnavigation oben und subnavigation links. das geht mit mittlerweile schon sehr auf die nerven, weil ich kein php profi bin. leider schleichen sich dadurch bei mir viele fehler ein, deshalb frag ich einfach nochmal, ob das schon jemand gemacht hat und den code zur verfügung stellen könnte.

denke, daß das auch noch andere gebrauchen könnten...
wär auf jeden fall seeehr dankbar!

Verfasst: Do 17. Okt 2002, 13:06
von jacke
Hallo ihr frame_freaks, hat das inzwischen einer hinbekommen mit der aktualisierung des linken Farmes. Ich hab auch was gefunden. Komme allerdings mit den " und/' nicht klar.
http://javascripte.73x.de/seite58.php

@sven

Wie übergeben aus dem main? Hab k.A.

Der schrott liegt immer noch unter

http://www.anlagen-planung.de/contenido/front_frame/

Bis denn!
Jacke

Verfasst: Do 17. Okt 2002, 19:59
von jacke
Jetzt führe ich schon Selbstgespräche.

Aber vieleicht kann ein schlaueres Hirn mal mit überlegen. In der Demoversion übergibt das top_frame dem leftframe die Kategorie. Jetzt habe ich versucht diesen Schnipsel auf Svens Menu anzupassen imLayout meiner Seite untergebracht, so das beim Laden die aktuelle Variable an das leftframe übergeben wird. so:

<body bgcolor="white" onLoad="moveit('demo_left.php?idcat=$tmp_idcat ')">

geht natürlich nicht!

Aber wenn ich die richtigen Variablen richtig übergebe müsste es doch funktionieren?


www.anlagen-planung.de/contenido/front_frame


schönen Abend noch

Jacke