05. december 2008 - 12:55
Der er
6 kommentarer og
1 løsning
Dynamisk side-hieraki gemt i en tabel
Hej
Jeg skal lave et dynamisk side-hieraki på et website, som er lavet helt simpelt:
Siderne gemmes i en enkelt SQL-tabel med ID og PARENT_ID.
Siden er en top-side hvis PARENT_ID er null. Ellers ligger den som under-side til siden, der svarer til PARENT_ID.
Mit problem er hvordan jeg får trukket alle disse værdier ud af databasen i den korrekte rækkefølge. Der vil jo være undersider til undersider - og undersider til dem. Man ved ikke hvor mange niveauer der er - det kan være 2, 5 eller 10.
Hvordan gør jeg det?
På forhånd tak,
seekasr
08. december 2008 - 21:16
#2
gadensgaard>> jeg vil tro PHP ;o)
du kan sortere i sql med ORDER BY og evt. lave en funktion der kalder sig selv når den støder på en undermenu.
jeg bruger denne funktion:
function generateTree($node_id = null, $tab = null) {
// bruges sådan: generateTree(0);
global $prefix;
$sql = "SELECT id, tekst, link, parent FROM ".$prefix."_menu WHERE vis = 'y' ORDER BY parent, id";
$result = mysql_query($sql) or die( mysql_error() );
while( $row = mysql_fetch_assoc($result) ){
$aTree[] = $row;
}
if(is_array($aTree)){
$str = "";
is_null($tab) ? $tab = 0 : $tab++;
foreach ($aTree as $aNode){
if ($aNode['parent'] == $node_id) {
for($t = 0; $t < $tab; $t++){
$str .= " <b>-</b> ";
}
$str .= $aNode['tekst']."<br />";
$str .= generateTree($aNode['id'], $tab);
}
}
}
return $str;
}
08. december 2008 - 22:03
#4
den nemmeste løsninger at have to tabeller:
[Side_Tabel]
ID_____Tekst
og
[Node_Tabel]
Node____Parent____Level
så bruger du
"SELECT Level, Node, Parent FROM Node_Tabel ORDER BY Level, Node, Parent;"
Jeg kender godtnok ikke noget til PHP, men måske andre kan oversætte det hvis du ikke kan?
<%
SET Conn = Server.CreateObject("ADODB.Recordset")
Conn.Open("Din_Connection_String")
SET RS = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT Level, Node, Parent FROM Node_Tabel ORDER BY Level, Node, Parent;"
RS.Open SQL, Conn
IF NOT RS.EOF THEN
DO UNTIL RS.EOF
padding = ""
FOR i = 1 TO RS("Level")
padding = padding & "--"
NEXT
Response.Write(padding & "Level: " & RS("Level") & ", Node: " & RS("Node") & ", Parent: " & RS("Parent") & "<br />")
RS.MoveNext
LOOP
END IF
RS.Close
SET RS = nothing
Conn.Close
SET Conn = nothing
%>
Det her:
Response.Write("Level: " & RS("Level") & ", Node: " & RS("Node") & ", Parent: " & RS("Parent") & "<br />")
skal erstattes af noget logik der fordeler det hele i de korrekte tabeller / divs på siden. Ovenstående vil udskrive det som
Level: #, Node: #, Parent #
--Level: #, Node: #, Parent #
--Level: #, Node: #, Parent #
----Level: #, Node: #, Parent #
----Level: #, Node: #, Parent #
--Level: #, Node: #, Parent #
Level: #, Node: #, Parent #
--Level: #, Node: #, Parent #
----Level: #, Node: #, Parent #
Håber det kan give et lille indblik i hvordan det _kan_ gøres. Der er sikkert bedre måder, men ovenstående har virket for mig på arbejde, omend den måske ikke er gengivet 100% korrekt.
MiReigi
11. december 2008 - 18:34
#5
avminarm's svar var præcis hvad jeg skulle bruge. Takker!
Også tak til MiReigi, men den anden lå lige for - så ville ikke kaste mig ud i at oversætte :)