Avatar billede soccoro Nybegynder
25. november 2008 - 17:49 Der er 11 kommentarer

Forum med træstruktur

Hej,

jeg står overfor at skal lave et forum med træstruktur, fx:

Overskrift
  Underpunkt
    Endnu et underpunkt
  Underpunkt

Jeg har læst mig igennem en del artikler og indlæg (bl.a. her på siden) og har fået lavet en glimrende start.

Nu mangler jeg dog en måde at indsætte nogle "streger" for at øge overskueligheden, således at strukturen ser således ud:

Overskrift
|_Underpunkt
| |_Endnu et underpunkt
| |_Endnu et underpunkt
| |_Endnu et underpunkt
|_Underpunkt

Er der nogle der kan gennemskue, hvordan det kan laves?

Jeg udlover gerne flere points, hvis det er nødvendigt!
Avatar billede jakobdo Ekspert
25. november 2008 - 19:36 #1
Det gælder jo om at lave noget intelligent.
For Overskrift er der ikke noget specielt med...
Et underpunkt sal altid have |_ foran.
"Udfordringen" er Endnu et underpunkt, for hvis der er en UNDERPUNKT under, så ska ldet jo være: "| |_"
Hvis ikke, så skal det kun være: "  |_"
Avatar billede soccoro Nybegynder
25. november 2008 - 19:52 #2
Ja, det er jeg også kommet frem til.

Men udfordringen kommer også, når der så er et ekstra underpunkt. Så skal det jo være "| | |_"

Det er dét, jeg ikke lige kan gennemskue. Til information, så hentes det ud fra databasen vha. en rekursiv funktion.
Avatar billede jakobdo Ekspert
25. november 2008 - 20:40 #3
En rekursiv funktion er nok ikke godt nok, da den ikke kigger fremad, men jo kun tilbage.
Så du skal nok smide alle data i et array eller noget, og så lave en kontrol som tjekker fremad, for der skal jo kun | |, hvis der er underpunkter under et givent emne.
Avatar billede soccoro Nybegynder
25. november 2008 - 21:23 #4
Hej,

jeg tror ikke umiddelbart jeg forstår din løsning :)

Min kode ser således ud (tyvstjålet fra et andet indlæg her på Eksperten):

    function show_replies($svarpaa=0,$indryk=0,$foerste=0){
        if($foerste)
            $query = " id=$svarpaa ";
        else
            $query = " parent_id=$svarpaa ";
        $query_three = mysql_query("select * from forum where $query order by id asc") or die(mysql_error());
        while($r1=mysql_fetch_array($query_three)){
            $dato = $r1["date"];
            $emne = $r1["name"];
            $id = $r1["id"];
            echo "<tr><td>";
            for($i=0; $i < $indryk; $i++){
                echo "&nbsp;&nbsp;";
            }
            echo $emne . "</td></tr>";
            show_replies($id,$indryk+1);
        }
    }
    echo "<table>";
    echo "<tr><td><b>Svar:</b></td></tr>";
    show_replies();
    echo "</table>";

Kan du evt. give mig et par liniers kode til at starte på? :)
Avatar billede jakobdo Ekspert
25. november 2008 - 21:42 #5
Nej, for jeg har ikke noget kode til det du ønsker.
Jeg prøver bare at tænke lidt højt her. :o)
Avatar billede olebole Juniormester
26. november 2008 - 00:23 #6
<ole>

Hvis du har en tabel med felterne 'id', 'par_id' og 'tekst' - hvor 'par_id' er id'et på den post, den pågældende post knytter sig til ('parent id') - kan du gøre noget à la:

function getHTML($aMenu, $nLevel=0) {
    $aRet = array();
    $sPre = str_repeat("|", $nLevel);
    for ($i=0,$j=count($aMenu[$nLevel]); $i<$j; $i++) {
        $nId = $aMenu[$nLevel][$i]["id"];
        $sTxt = $aMenu[$nLevel][$i]["tekst"];
        $aRet[] = "<div>".$sPre."_".$sTxt."</div>";
        if (is_array($aMenu[$nId])) {
            $aRet[] = getHTML($aMenu, $nId);
        }
    }
    return implode("", $aRet);
}

$sql = "SELECT `id`, `par_id`, `tekst` FROM `TABEL_NAVN`";
$res = mysql_query($sql) or die (mysql_error());
$aList = array();
while ($row=mysql_fetch_assoc($res)) {
    if (!is_array($aList[$row["parid"]])) $aList[$row["parid"]] = array();
    $aList[$row["parid"]][] = $row;
}

print getHTML($aList);

/mvh
</bole>
Avatar billede olebole Juniormester
26. november 2008 - 00:47 #7
Njaahh ... næsten  =)

function getHTML($aMenu, $parid=0, $nLevel=0) {
    $aRet = array();
    $sPre = str_repeat("|", $nLevel);
    for ($i=0,$j=count($aMenu[$parid]); $i<$j; $i++) {
        $nId = $aMenu[$parid][$i]["id"];
        $sTxt = $aMenu[$parid][$i]["tekst"];
        $aRet[] = "<div>".$sPre."_".$sTxt."</div>";
        if (is_array($aMenu[$nId])) {
            $aRet[] = getHTML($aMenu, $nId, $nLevel+1);
        }
    }
    return implode("", $aRet);
}

$sql = "SELECT `id`, `par_id`, `tekst` FROM `menu`";
$res = mysql_query($sql) or die (mysql_error());
$aList = array();
while ($row=mysql_fetch_assoc($res)) {
    if (!is_array($aList[$row["par_id"]])) $aList[$row["par_id"]] = array();
    $aList[$row["par_id"]][] = $row;
}

print getHTML($aList);
Avatar billede soccoro Nybegynder
26. november 2008 - 11:07 #8
Hej Ole,

tak for svaret. Jeg kom lidt tættere på løsningen. Nu ser det dog således ud:

_ Hovedpunkt
  |_ Underpunkt 1
  |  |_ Underpunkt 2
  |  |  |_ Underpunkt 3
  |  |_ Underpunkt 4

Ud for Underpunkt 2, 3 og 4 er de første | i overskud, da det gerne skulle se således ud:

_ Hovedpunkt
  |_ Underpunkt 1
    |_ Underpunkt 2
    |  |_ Underpunkt 3
    |_ Underpunkt 4

Kan du gennemskue en løsning på dette? :)
Avatar billede olebole Juniormester
26. november 2008 - 14:04 #9
Ja, umiddelbart ville jeg mene, deres parent-id er forkert. Da jeg testede koden, mener jeg ikke, jeg fik fejl. Er på job og kan ikke teste ligenu
Avatar billede soccoro Nybegynder
26. november 2008 - 14:46 #10
Jeg kan ikke umiddelbart se, hvordan parent-id skulle være forkert, da det jo bare blive hentet ud af databasen :)

Hvis du får tid til at se på det ved lejlighed, ville jeg være meget taknemmelig. :)
Avatar billede soccoro Nybegynder
18. august 2010 - 18:01 #11
Jeg må vidst hellere få lukket denne tråd ;-)

Nogle, der vil have points?
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