Diskusní fórum v PHP s využitím databáze – zobrazení odpovědí

22. října 2001

V dnešním dílu se dozvíte, jak provést zobrazení daného tématu, včetně všech odpovědí. Uživatel bude mít na výběr ze 2 způsobů zobrazení – buď se zobrazí pouze jedna odpověď a pod ní strom s dalšími odpověďmi, nebo všechny odpovědi najednou.

Zobrazení odpovědí a témat (read.php)

Nejprve zjistíme, zda-li nebyl odeslán formulář s odpovědí. Pokud ano, zpracujeme odpověď souborem post.php, ale o tom bude v řeč až v dalších dílech.

if(IsSet($sent)) require "post.php"; //byl odeslán formulář?
$width=90;
require "db.php"; //otevřeme databázi
require "style.php"; //načteme soubor s konfigurací
require "header.php"; //vložíme hlavičku

Jak už bylo několikrát předesláno, uživatel si bude moci vybrat ze 2 způsobů zobrazení. Úvodní tabulka bude pro oba způsoby stejná. Pokud se odpovědi budou zobrazovat jednotlivě, bude tato tabulka obsahovat hlavní téma nebo některou odpověď. Jestliže se odpovědi zobrazí najednou, bude tato tabulka obsahovat vždy hlavní téma. Proměnná $id_answer označuje id právě zobrazené odpovědi. Pokud však není zinicializována, bude v úvodní tabulce hlavní téma.

if (IsSet($id_answer))        //budeme zobrazovat odpověď
    $db_entry = $id_answer;
else                                       //budeme zobrazovat hlavní téma
    $db_entry = $id;

Na základě předchozí podmínky vybereme z databáze příslušný záznam a do proměnné $subject uložíme předmět zobrazeného příspěvku. Tuto proměnnou použijeme ve formuláři pro odpověď (form.php).

//vybíráme téma nebo odpoveď
$topic = MySQL_Query("SELECT id, author, email, subject, body, date FROM phorum WHERE id = $db_entry") or die($query_error);
$entry = MySQL_Fetch_Array($topic);
$subject = $entry["subject"];

Nyní vytvoříme výše zmíněnou tabulku a pustíme se do vypisování všech údajů.

<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 colspan="2" class="tableheading"><?echo $entry["subject"]?></td></tr>
 <tr><td valign="top" width="80" class="text">

V úvodním článku bylo napsáno, že registrovaný uživatel si bude moci ke svému jménu přidat i malý obrázek. Z databázové tabulky users vybereme odkaz směřující k obrázku uživatele, jehož příspěvek se právě zobrazuje. Pokud odkaz existuje, vložíme do tabulky příslušný obrázek, pokud ne, použijeme obrázek no.gif.

//má autor příspěvku svůj obrázek? pokud ne, použijeme "no.gif"
$link = MySQL_Query("SELECT link FROM users WHERE name = ‚" . $entry["author"] . "’") or die($query_error);
$entry_2 = MySQL_Fetch_Array($link);
if($entry_2["link"]!="")
    echo ‚<img alt="‘ . $entry["author"] . ‚" src="images/‘ . $entry_2["link"] . ‚" align="left">‘;
else
    echo ‚<img alt="no image" src="images/no.gif" align="left">‘;
echo ‚</td>‘;

Následně vypíšeme autora, jeho email (pokud byl zadán), datum uložení příspěvku (práce s datem byla popsána v minulém článku) a samotný text příspěvku.

//autor, email, datum, text
echo ‚<td valign="top" width="100%" class="text">Autor: ‚;
if ($entry["email"]!="") echo ‚<a href="mailto:‘ . $entry["email"] . ‚">‘; //zadal autor příspěvku svůj email?
echo $entry["author"];
if ($entry["email"]!="") echo ‚</a>‘;
echo ‚<br>Datum: ‚;
echo Date("d. m. Y, H:i:s", $entry["date"]);
echo ‚<br><br>‘ .$entry["body"] . ‚</td></tr>‘;

Pokud zobrazujeme všechny odpovědi najednou, musíme přidat ještě odkaz „Odpovědět“, aby uživatelé mohli na daný příspěvek odpovědět. Přidávání odpovědí bude podrobně popsáno v dalších dílech.

//pokud zobrazujeme všechny odpovědi najednou, přidáme ještě odkaz "Odpovědět"
if($view=="all") echo ‚<tr><td colspan="2" align="right" class="text"><br><a href="new.php?id=‘ .$id . ‚&id_answer=‘ .$id . ‚&view=‘ . $view . ‚">Odpovědět</a></td></tr>‘;
?>
</table></td></tr></table>

Nyní si popíšeme oba způsoby zobrazení odpovědí. Nejprve zobrazení odpovědí jednotlivě ($view==“single“). Nejdříve vytvoříme tabulku o 3 sloupečcích – Odpověď, Autor, Datum.

<?if($view=="single"): //odpovědi budeme zobrazovat jednotlivě?>
    <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="tableheading">Odpověď</td>
        <td width="15%" class="tableheading">Autor</td>
        <td width="20%" align="center" class="tableheading">Datum</td>
    </tr>
     <tr bgcolor="white">
        <td class="table"><b>Téma:</b>

Na prvním řádku bude hlavní téma. Pokud je toto téma zobrazené ($id_answer==““), nevytvoříme odkaz, ale pouze ztučníme. Další části již byly komentovány v předchozím článku.

    //HLAVNÍ TÉMA
    //vybíráme hlavní téma
    $topic = MySQL_Query("SELECT author, email, subject, body, date FROM phorum WHERE id = $id") or die($query_error);
    $entry = MySQL_Fetch_Array($topic);
    //pokud zobrazujeme právě toto tema, nevytvoříme odkaz, ale ZTUČNÍME
    if($id_answer=="")
        echo "<b>" . $entry["subject"] . "</b></td>";
    else
        echo ‚<a title="‘. $entry["body"] . ‚"href="read.php?id=‘ . $id . ‚&view=‘ . $view . ‚">‘ . $entry["subject"]. ‚</a></td>‘;
    //AUTOR – pokud zadal autor tématu svůj email, vytvoříme odkaz
    echo ‚<td width="15%" class="table">‘;
    if($id_answer=="") echo "<b>";
    if ($entry["email"]!="") echo ‚<a href="mailto:‘ . $entry["email"] . ‚">‘;
    echo $entry["author"];
    if ($entry["email"]!="") echo ‚</a>‘;
    echo ‚</td>‘;
    //DATUM VLOŽENÍ – počet sekund od 1. 1. 1970 převedeme na srozumitelnější formát
    echo ‚<td width="20%" align="center" class="table">‘;
    if($id_answer=="") echo "<b>";
    echo Date("d. m. Y, H:i:s", $entry["date"]) . ‚</td></tr>‘;

Nyní přichází na řadu nejkomplikovanější část, a to strom odpovědí. Definujeme si funkci function Answers($topic, $level=1), první parametr obsahuje id právě zpracovávaného příspěvku a druhý úroveň odpovědi (např. přímá odpověď na dané téma je v úrovni 1, odpověď na tuto odpověď v úrovni 2, atd.). Princip této funkce je stejný jako u funkce Count_Answers() popsané v minulém díle. Funkce bude procházet všechny přímé i nepřímé odpovědi tak, že bude volat sama sebe.

    //STROM ODPOVĚDÍ
    function Answers($topic, $level=1)    //fce pro zobrazení stromu odpovědí
     {
        global $view, $id, $id_answer, $table_bgcolor, $table_bgcolor_alt;
        static $y = 0;
        //vybíráme odpovědi na téma, seřazeno podle data
        $answer = MySQL_Query("SELECT id, author, email, subject, body, date FROM phorum WHERE thread = $topic ORDER BY date DESC") or die($query_error);

V tabulce budeme střídat barevné pozadí jednotlivých řádků, vypíšeme předmět odpovědi, autora a datum uložení. Na závěr zavoláme tutéž funkci, jako první parametr uvedeme id zpracované odpovědi a v druhém parametru musíme zvýšit úroveň o jedna (jedná se totiž o odpověď na odpověď, tedy úroveň je 2, 3, …). Takto funkce tak projde všechny odpovědi a vypíše je.

        while($entry = MySQL_Fetch_Array($answer)):
            //střídáme barevné pozadí tabulky
            if ($y%2==0)
                echo ‚<tr bgcolor="‘ . $table_bgcolor_alt . ‚">‘;
            else
                echo ‚<tr bgcolor="‘ . $table_bgcolor . ‚">‘;
            $y++;
            //PŘEDMĚT
            echo ‚<td class="table">‘;
            for($x=1;$x<=$level;$x++) echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; //odsadíme odpověď podle úrovně
            echo ‚<img src="line.gif" width="50" height="10" border="0" alt="">‘;
            //pokud zobrazujeme právě tento příspěvek, nevytvoříme odkaz, ale ZTUČNÍME
            if($id_answer==$entry["id"])
                echo "<b>" . $entry["subject"] . "</b>";
            else
                echo ‚<a title="‘ . $entry["body"] . ‚" href="read.php?id=‘ . $id . "&id_answer=" . $entry["id"] . ‚&view=‘ . $view . ‚">‘ . $entry["subject"] . "</a>";
            echo ‚</td>‘;
        
            //AUTOR – pokud zadal autor příspěvku svůj email, vytvoříme odkaz
            echo ‚<td "width=15%" class="table">‘;
            if($id_answer==$entry["id"]) echo "<b>";
            if ($entry["email"]!="") echo ‚<a href="mailto:‘ . $entry["email"] . ‚">‘;
            echo $entry["author"];
            if ($entry["email"]!="") echo ‚</a>‘;
            echo ‚</td>‘;
        
            //DATUM – počet sekund od 1. 1. 1970 převedeme na srozumitelnější formát
            echo ‚<td width="20%" align="center" class="table">‘;
            if($id_answer==$entry["id"]) echo "<b>";
            echo Date("d. m. Y, H:i:s", $entry["date"]);
            echo ‚</td></tr>‘;
            Answers($entry["id"], $level+1); //budeme zjišťovat nepřímé odpovědi
        endwhile;
     }
    Answers($id);     //zobrazení stromu odpovědí
    echo ‚</table></td></tr></table>‘;
    echo ‚<br>‘;
    require "form.php"; //vložíme formulář pro odpověď

Druhou větev podmínky tvoří případ, že zobrazujeme všechny odpovědi najednou. Každou odpověď umístíme do zvláštní tabulky odsazené podle její úrovně o násobek 10 px. Tento způsob zobrazení se bude v mnohém podobat tomu předchozímu. Opět si definujeme funkci Answers($topic, $level=1), kterou projdeme všechny přímé i nepřímé odpovědi. Do tabulky zapíšeme všechny údaje a navíc přidáme odkaz „Odpovědět“, který umožní odpovědět na kteroukoliv odpověď.

else: //zobrazujeme všechny odpovědi najednou
    function Answers($topic, $level=1)    //fce pro zobrazení všech odpovědí najednou
     {
        global $view, $id;
        //vybíráme odpovědi na dané téma, seřazeno podle data
        $answer = MySQL_Query("SELECT id, author, email, subject, body, date FROM phorum WHERE thread = $topic ORDER BY date DESC") or die($query_error);
        while($entry = MySQL_Fetch_Array($answer)):
?>
        <table align="center" width=90%><tr>
        <?for($x=1;$x<=$level;$x++) echo ‚<td width=10><img src="bod.gif" width="10" height="1" border="0" alt=""></td>‘; //odsadíme tabulku podle úrovně odpovědi?>
         <td width="100%">
            <table width="100%" 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 colspan="2" class="tableheading"><?echo $entry["subject"]?></td></tr>
             <tr><td valign="top" width="80" class="text">
            <?
            //má autor příspěvku svůj obrázek? pokud ne, použijeme "no.gif"
            $link = MySQL_Query("SELECT link FROM users WHERE name = ‚" . $entry["author"] . "’") or die($query_error);
            $entry_2 = MySQL_Fetch_Array($link);
            if($entry_2["link"]!="")
                echo ‚<img alt="‘ . $entry["author"] . ‚" src="images/‘ . $entry_2["link"] . ‚" align="left">‘;
            else
                echo ‚<img alt="no image" src="images/no.gif" align="left">‘;
            echo ‚</td>‘;
            //autor, email, datum, text
            echo ‚<td valign="top" width="100%" class="text">Autor: ‚;
            if ($entry["email"]!="") echo ‚<a href="mailto:‘ . $entry["email"] . ‚">‘;    //zadal autor příspěvku svůj email?
            echo $entry["author"];
            if ($entry["email"]!="") echo ‚</a>‘;
            echo ‚<br>Datum: ‚;
            echo Date("d. m. Y, H:i:s", $entry["date"]);
            echo ‚<br><br>‘ .$entry["body"] . ‚</td></tr>‘;
            echo ‚<tr><td colspan="2" align="right" class="text"><br><a href="new.php?id=‘ .$id . ‚&id_answer=‘ . $entry["id"] . ‚&view=‘ . $view . ‚">Odpovědět</a></td></tr>‘;
            echo ‚</table></td></tr></table></td></tr></table><br>‘;
        Answers($entry["id"], $level+1); //budeme zjišťovat nepřímé odpovedi
        endwhile;
     }
    Answers($id);     //zobrazíme odpovedi
    echo ‚</body></html>‘;
endif;
MySQL_Close();    //zavřeme databázi

Tímto tento díl končí, příště se dozvíte, jak přidávat témata a odpovědi.

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *