Hallo zusammen,
Wie einige von euch sicher schon bemerkt haben, bin ich am erstellen eines Navigationsscripts. Ich habe damit sehr grosse probleme, doch bis jetzt kam ich schon relativ weit.
Aus meiner Sicht sollte das Script, in dem Stadium wie es sich jetzt befindet, funktionieren. Doch irgendwie scheint der PHP-Parser da nicht der selben meinung zu sein, den das Script bringt nicht das gewünschte Ergebnis.
Lasst es mich versuchen zu Erklähren...
Was das Script tun soll ist eigentlich relativ einfach beschrieben. Es sind verscheidene Seiten in einer Datenbank gespeichert, die Unterseiten haben. Diese Unterseiten haben evtl. wieder Unterseiten usw.
Also in dieser MySQL-Datenbank, sind alle Seiten gespeichert. Jede Seite hat eine eigene ID, einen Namen usw. Falls die aktuelle Seite die oberste Ebene ist, enthält "top_id" den Wert "-1". Es wird jeweils nur die übergeordnete Seite angegeben(respektive dessen ID).
Beispieldatenbank:
Nun versuche ich den Code zu erklähren...
Ich weis, es wird wohl relativ viel Text geben, doch bitte lasst euch nicht Abschrecken. Ich brauche wirklich eure Hilfe!!!
Um die Verbindung mit der MySQL DB habe ich mich natürlich gekümmert.
Es wird nun eine Schleife eingeleitet die solange durchläuft bis alle Werte der MySQL-Datenbank durch sind:
Es gibt nun eine Variable, namens "oldhis", diese Beinhaltet jeweils die top_id und danach die ID der aktuellen Seite und alle vorherigen(ist ein Array). Diese Variable würde, nachdem die gesamte Schleife durchgelaufen ist, beim obigen DB-Beispiel etwa so aussehen:
Wenn dies nun der erste Aufruf der Schleife ist, was durch das existieren der Variable $oldhis geprüft wird, wird die Variable $oldhis erstellt. Halt mit aktueller top_id und ID. Ausserdem werden die aktuellen Werte ausgegeben, und eine Variable namens tago erhöt. Die Variable tago wird später verwendet und gibt an wie viele Ebenen neu erstellt wurden.
Weiter oben wo jetzt /* ANWEISUNGEN */ steht, kommen jetzt auch solche.
Es wird jetzt überprüft ob sich die aktuelle Seite(in der schleife) immer noch auf der selben ebene befindet. Dies wird gemacht, indem man überprüft ob der zweitletzte wert in $oldhis immernoch der selbe ist wie die aktuelle top_id(zur erinnerung: der array oldhis beinhaltet die top_id und die id, der bisher durchgelaufenen seiten(die seiten sind nach top_id sortiert)). Das habe ich so gelöst(das die ausgabe nun stattfindet ist ja klar):
Jetzt wird zur überprüfung, ob man sich immernoch auf der selben ebene befindet, noch ein else hinzugefügt. Wenn sich die Werte nun nicht mehr auf der selben Ebene befinden, wird eine neue ebene angefangen. Es wird nun überpüft ob die aktuelle top_id dem letzten wert in oldhis entspricht(letzter wert bei Oldis: ID der letzten Seite). Damit die ebene vollständig richtig angefangen wird, wird die Variable "tago" erhöt. In dieser Variable befindet sich ein Wert, der angibt wie viele Ebenen schon geöffnet sind(tags opend). Natürlich wird auch der Array "oldhis" aktuallisiert. Dieser bekommt nun neu dazu, die top_id und die ID der aktuellen Seite.
Die neuen Seite in der Navigation werden natürlich auch ausgegeben.
Ich habe das dann so gemacht:
So, das grundlegende ist schonmal erklährt.
Weiter geht's. Nun möchte ich eben nur gerade eine Ebene weiter hinausblicken können. Also nicht gleich alle Ebenen angezeigt bekommen, sondern nur die nächste. Deswegen beende ich die Schleife, wenn die aktuelle top_id der aktuellen ID entspricht($api = active page id):
Nun, dieses Script funktioniert schon recht gut. Ein Problem stellt sich mir jetzt aber noch: Wenn die ID der aktuellen Seite höher ist als dessen untergeordnete Seite, werden gleich alle Seiten aus der DB angezeigt. Auch für dieses problem glaubte ich eine lösung gefunden zu haben. Ich erstelle mir einen Array, namens "originalid", der die alten ID's beinhaltet und die neuen, die kleiner sind als die, die untergeordnet sind. So habe ich genau 2 neue Variabeln: oid - diese wird bei jedem schleifenaufruf erhöt und gilt als die neue id, originalid - der Array, der alle alten sowie neuen ID's beinhaltet.
Bei jedem Aufruf geschiet nun also folgendes:
Beim ersten schleifenaufruf werden diese Variabeln auch noch definiert:
Nun wird überall, wo entweder $navi->top_id oder $navi->id vorkommt dies durch $originalid[$navi->top_id] respektive $originalid[$navi->id] ersetzt!
So, das wars, nun zum Problem!
Schon jetzt, vielen Dank, das Ihr so weit gelesen habt!!!
Mein gesamter Code sieht so aus:
Nun besteht mein Problem, das ich gerne mit der Variable "originalid" gelöst hatte, immer noch.
Ist die ID der aktuellen Seite höher als die, der unterseite, werden restlos alle Seiten in der Navigation angezeigt. Seien dies Unterseiten der aktuellen Seite oder nicht...
Hat jemand eine Idee wie ich das lösen kann? Ich bin wirklich ab jeder hilfe extrem dankbar!
Vielen Dank im voraus, und auch grossen Dank an die die diesen riesen Roman gelesen haben!!!
MFG
[ASTERIX]
Wie einige von euch sicher schon bemerkt haben, bin ich am erstellen eines Navigationsscripts. Ich habe damit sehr grosse probleme, doch bis jetzt kam ich schon relativ weit.
Aus meiner Sicht sollte das Script, in dem Stadium wie es sich jetzt befindet, funktionieren. Doch irgendwie scheint der PHP-Parser da nicht der selben meinung zu sein, den das Script bringt nicht das gewünschte Ergebnis.
Lasst es mich versuchen zu Erklähren...
Was das Script tun soll ist eigentlich relativ einfach beschrieben. Es sind verscheidene Seiten in einer Datenbank gespeichert, die Unterseiten haben. Diese Unterseiten haben evtl. wieder Unterseiten usw.
Also in dieser MySQL-Datenbank, sind alle Seiten gespeichert. Jede Seite hat eine eigene ID, einen Namen usw. Falls die aktuelle Seite die oberste Ebene ist, enthält "top_id" den Wert "-1". Es wird jeweils nur die übergeordnete Seite angegeben(respektive dessen ID).
Beispieldatenbank:
Code:
ID || TOP_ID || Name || Beschreibung || 1 || -1 || Startseite || Oberste Ebene || 2 || -1 || Über mich || Oberste Ebene || 3 || 2 || Portraits || Unterseite von "Über mich" || 4 || 3 || Ich selbst || Unterseite von "Portraits" ||
Ich weis, es wird wohl relativ viel Text geben, doch bitte lasst euch nicht Abschrecken. Ich brauche wirklich eure Hilfe!!!
Um die Verbindung mit der MySQL DB habe ich mich natürlich gekümmert.
Es wird nun eine Schleife eingeleitet die solange durchläuft bis alle Werte der MySQL-Datenbank durch sind:
PHP-Code:
while($navi = mysql_fetch_object($naviquery)) {
Code:
$odlhis = Array([0] = -1, [1] = 1, [2] = 2, [3] = 3, [4] = 3, [5] = 5)
PHP-Code:
while($navi = mysql_fetch_object($naviquery)) {
if(isset($oldhis)) {
/* ANWEISUNGEN */
} else {
$oldhis = array($navi->top_id, $navi->id);
echo '<li><ul>';
echo '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
$tago++;
}
}
Es wird jetzt überprüft ob sich die aktuelle Seite(in der schleife) immer noch auf der selben ebene befindet. Dies wird gemacht, indem man überprüft ob der zweitletzte wert in $oldhis immernoch der selbe ist wie die aktuelle top_id(zur erinnerung: der array oldhis beinhaltet die top_id und die id, der bisher durchgelaufenen seiten(die seiten sind nach top_id sortiert)). Das habe ich so gelöst(das die ausgabe nun stattfindet ist ja klar):
PHP-Code:
while($navi = mysql_fetch_object($naviquery)) {
if(isset($oldhis)) {
if($originalid[$navi->top_id] == $oldhis[count($oldhis)-2]) {
echo '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
}
} else {
$oldhis = array($navi->top_id, $navi->id);
}
}
Die neuen Seite in der Navigation werden natürlich auch ausgegeben.
Ich habe das dann so gemacht:
PHP-Code:
while($navi = mysql_fetch_object($naviquery)) {
if(isset($oldhis)) {
if($originalid[$navi->top_id] == $oldhis[count($oldhis)-2]) {
echo '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
} else {
if($navi->top_id == $oldhis[count($oldhis)-1]) {
$tago++;
$oldhis[] = $navi->id;
echo '<li><ul>';
echo '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
}
}
} else {
$oldhis = array($navi->top_id, $navi->id);
}
}
Weiter geht's. Nun möchte ich eben nur gerade eine Ebene weiter hinausblicken können. Also nicht gleich alle Ebenen angezeigt bekommen, sondern nur die nächste. Deswegen beende ich die Schleife, wenn die aktuelle top_id der aktuellen ID entspricht($api = active page id):
PHP-Code:
if($oldhis[count($oldhis)-2] == $api) break;
Bei jedem Aufruf geschiet nun also folgendes:
PHP-Code:
$oid++;
$originalid[$navi->id] = $oid;
PHP-Code:
$oid = 1;
$originalid = array($navi->top_id => -1, $navi->id => $oid);
So, das wars, nun zum Problem!
Schon jetzt, vielen Dank, das Ihr so weit gelesen habt!!!
Mein gesamter Code sieht so aus:
PHP-Code:
<?php
$naviqd = 'SELECT * FROM `******` ORDER BY `top_id`';
$naviquery = mysql_query($naviqd);
$tago = 0;
$ownid = 1;
while($navi = mysql_fetch_object($naviquery)) {
if(isset($oldhis)) {
$oid++;
if($oldhis[count($oldhis)-2] == $originalid[$api]) break;
$originalid[$navi->id] = $oid;
if($originalid[$navi->top_id] == $oldhis[count($oldhis)-2]) {
echo '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
} else {
if($originalid[$navi->top_id] == $oldhis[count($oldhis)-1]) {
$tago++;
$oldhis[] = $originalid[$navi->id];
echo '<li><ul>';
echo '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
}
}
} else {
$oid = 1;
$originalid = array($navi->top_id => -1, $navi->id => $oid);
$oldhis = array($navi->top_id, $originalid[$navi->id]);
echo '<li><ul>';
echo '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
$tago++;
}
}
if(isset($oldhis)) { /* Diese Zeilen sind zum schliessen der Tags... */
$i = 1; /* Diese Zeilen sind zum schliessen der Tags... */
while($i <= $tago) { /* Diese Zeilen sind zum schliessen der Tags... */
echo '</ul></li>'; /* Diese Zeilen sind zum schliessen der Tags... */
$i++; /* Diese Zeilen sind zum schliessen der Tags... */
} /* Diese Zeilen sind zum schliessen der Tags... */
} /* Diese Zeilen sind zum schliessen der Tags... */
?>
Ist die ID der aktuellen Seite höher als die, der unterseite, werden restlos alle Seiten in der Navigation angezeigt. Seien dies Unterseiten der aktuellen Seite oder nicht...
Hat jemand eine Idee wie ich das lösen kann? Ich bin wirklich ab jeder hilfe extrem dankbar!
Vielen Dank im voraus, und auch grossen Dank an die die diesen riesen Roman gelesen haben!!!
MFG
[ASTERIX]
Kommentar