Avatar billede seekasr Nybegynder
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
Avatar billede gadensgaard Nybegynder
05. december 2008 - 18:04 #1
Hvad med bare at trække alle sammen ud og så sortere i dem efterfølgende? (under opbygningen af menuen fx)

Hvilket programmerings sprog bruger du?
Avatar billede avminarm Juniormester
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;
}
Avatar billede gadensgaard Nybegynder
08. december 2008 - 21:41 #3
hah, jeg kiggede bare i programmerings kategorien :P. Undskyld så.
Avatar billede mireigi Novice
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
Avatar billede seekasr Nybegynder
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 :)
Avatar billede mireigi Novice
11. december 2008 - 19:17 #6
Helt i orden seekasr :)
Avatar billede avminarm Juniormester
11. december 2008 - 22:24 #7
;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester