Diskusní fórum v PHP pro každého – výpis příspěvků

    0

    V úvodním článku o tvorbě Diskusního fóra v PHP bez použití databáze jsme si ukázali, jak vypsat hlavní diskusní témata. Dnes si řekneme, jak provést zobrazení jednotlivých témat i odpovědí a jak vytvořit strom odpovědí na dané téma.

    Výpis příspěvku

    Zobrazení příspěvku bude provádět soubor read.php3. Nejprve vložíme standardní hlavičku.

    <?
    // vlozi standardni hlavicku
    $width=90;
    include ("header.php3");
    ?>

    Nyní si vysvětlíme význam proměnných $topic, $row, $mainrow, $id.

    $topic – obsahuje jméno souboru, ve kterém se nachází zobrazený příspěvek, např. $topic=main značí soubor s hlavními tématy
    $row – obsahuje číslo řádku v souboru $topic.topic, na kterém se nachází zobrazený příspěvek
    $mainrow – obsahuje číslo řádku v souboru main.topic, na kterém se nachází hlavní téma (pokud tedy zobrazujeme hlavní téma, obsah proměnných $row a $mainrow je stejný)
    $id – obsahuje unikátní označení zobrazeného příspěvku a zároveň i jméno souboru, do kterého se zapíše případná odpověď na zobrazený příspěvek

    Nejprve do proměnné $dat_file načteme obsah souboru s požadovaným příspěvkem. Následně si jednotlivé části příspěvku na řádce $row uložíme do proměnné $entry. Navíc do proměnné $topic_name vložíme předmět příspěvku, což využijeme ve formuláři pro odpověď.

    //soubor, kde je aktualni prispevek
    $dat_file = File("data/$topic.topic");
    $entry = Explode("#", $dat_file[$row]);
    $topic_name = $entry[1];

    Nyní vložíme jednotlivé části příspěvku do tabulky. Jelikož e-mailová adresa je nepovinný údaj, použijeme jednoduchou podmínku if ($entry[4]!="") echo ‚<a href="mailto:‘ . $entry[4] . ‚">‘.

    <table width="90%" border="0" cellspacing="0" cellpadding="1" align="center" bgcolor="Black"><tr><td>
    <table width="100%" border="0" cellspacing="0" cellpadding="3" align="center" bgcolor="white">
    <tr bgcolor="#4A4A4A"><td class=tabulkanadpis><?echo $entry[1]?></td></tr>
    <tr><td class=text>Autor:
    <?
    if ($entry[4]!="") echo ‚<a href="mailto:‘ . $entry[4] . ‚">‘;
    echo $entry[2]
    ?></a></td></tr>
    <tr><td class=text>Datum: <?echo $entry[3]?></td></tr>
    <tr><td class=text><br><?echo $entry[5]?></td></tr>
    </table></td></tr></table>
    <br>

    Výpis odpovědí

    Seznam odpovědí se zobrazí v tabulce o 3 sloupcích – předmět odpovědi, autor a datum vložení. Na prvním řádku bude hlavní téma. Ze souboru main.topic tedy vybereme řádek $mainrow, zpracujeme pomocí funkce Explode() a zapíšeme do tabulky.

    //hlavni tema
    $dat_file = File("data/main.topic");
    $entry = Explode("#", $dat_file[$mainrow]);
    $maintopic = $entry[0];
    ?>
    <table width="90%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="Black"><tr><td>
    <table width="100%" border="0" cellspacing="1" cellpadding="3" align="center">
    <tr bgcolor="#4A4A4A">
    <td class=tabulkanadpis>Odpovědi</td>
    <td width=25% class=tabulkanadpis>Autor</td>
    <td width=10% align=center class=tabulkanadpis>Datum</td>
    </tr>
    <tr bgcolor=white>
    <td class=tabulka><b>Téma:</b> <a href=read.php3?topic=main&<?echo "row=$mainrow&mainrow=$mainrow&id=$entry[0]>$entry[1]"?></a></td>
    <td width=25% class=tabulka><?echo $entry[2]?></td>
    <td width=10% align=center class=tabulka><?echo $entry[3]?></td>
    </tr>

    Zbývá zobrazit ještě strom odpovědí, což provedeme pomocí námi definované funkce Topic($topic, $level, $mainrow), kde první parametr určuje unikátní označení právě zpracovávaného příspěvku, v dalším parametru je úroveň, ve které se nachází daná odpověď a konečně poslední parametr určuje číslo řádku v souboru main.topic, na kterém se nachází hlavní téma.

    Pokud zjistíme, že existuje soubor $topic.topic, jinými slovy, že existuje odpověď na příspěvek s označením $topic, projdeme pomocí cyklu soubor $topic.topic (na každý příspěvek může být libovolný počet odpovědí) a do proměnné $entry načteme obsah odpovědi.

    //vytvarime strom odpovedi
    function Topic($topic, $level, $mainrow)
    {
    if (File_Exists("data/$topic.topic")):
    $dat_file = File("data/$topic.topic");
    for ($i=Count($dat_file)-1;$i>=0;$i–):
    $entry = Explode("#", $dat_file[$i]);

    Nyní můžeme začít zapisovat jednotlivé údaje do tabulky. Pomocí jednoduchého cyklu vytvoříme odsazení příspěvků, přičemž využíváme proměnné $level (např. je-li $level=3, vypíšeme 3*10 mezer –  ). Přidáme ještě obrázek line.gif a odkaz na zobrazení daného příspěvku. Poté, co zapíšeme údaje i do zbývajících sloupců, voláme rekurzivně funkci Topic(). V prvním parametru předáme unikátní označení právě zapsaného příspěvku, v druhém navýšíme hodnotu proměnné $level o 1 úroveň, třetí parametr zůstává stejný.

    <tr bgcolor=white>
    <td class=tabulka>
    <?for($x=1;$x<=$level;$x++) echo "          ";?><img src="line.gif" width="50" height="10" border="0" alt=""><a href=read.php3?<?echo "topic=$topic&row=$i&mainrow=$mainrow&id=$entry[0]>" . $entry[1]?></a></td>
    <td width=25% class=tabulka><?echo $entry[2]?></td>
    <td width=10% align=center class=tabulka><?echo $entry[3]?></td>
    </tr>
    <?
    Topic($entry[0], $level+1, $mainrow);
    endfor;
    endif;
    }
    Topic($maintopic, 1, $mainrow);

    Na závěr ukončíme tabulku a vložíme formulář, umožňující odpovědět na zobrazený příspěvek.

    </table></td></tr></table>
    <?
    //vlozi formular pro odpoved
    include ("form.php3");
    ?>

    V příštím díle si popíšeme výše zmíněný formulář a ukážeme si, jak provést zápis nového příspěvku.

    Starší komentáře ke článku

    Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

    Žádný příspěvek v diskuzi

    Odpovědět