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