Diskusní fórum v PHP pro každého – zápis témat a příspěvků

9. května 2001

V minulém díle jsme se zaměřili na výpis příspěvků. Dnes se podíváme naopak na zápis nových témat a odpovědí. Většina funkcí, které využijeme při zápisu vychází z návštěvní knihy, takže pokud budete potřebovat podrobnější výklad, přečtěte si poslední článek o návštěvní knize. Celou aplikaci si zde také budete moci stáhnout.

Formulář pro zápis

Formulář se nachází v souboru form.php3. Pro větší přehlednost umístíme formulář do tabulky. Pokud je zinicializována proměnná $id uvedeme jako nadpis tabulky ‚Odpovědět na tento příspěvek‘, jinak ‚Nové téma‘.

<table width="50%" 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="tabulkanadpis">
<?
//jedna se o nove tema nebo odpoved?
if (IsSet($id)):
echo ‚Odpovědět na tento příspěvek‘;
else:
echo ‚Nové téma‘;
endif;
?>
</td></tr>

Nyní přichází na řadu samotný formulář. Povinné položky jsou jméno autora, předmět a text zprávy. Jediným nepovinným údajem je e-mailová adresa autora. Do formulářové pole Předmět vložíme Re: a předmět příspěvku, na který odpovídáme ($topic_name). Ve skrytém poli ‚id‘ bude hodnota proměnné $id.

<tr><td class=tabulka>Vaše jméno: <font color="#FF0000">*</font></a></td><td>
<form action="post.php3" method="post" onSubmit="return zkontroluj(this)">
<input style="WIDTH: 250px" type="text" name="jmeno" size="30" maxlength="50" class="input"></td></tr>
<tr><td class=tabulka>Váš e-mail:</td><td><input style="WIDTH: 250px" type="text" name="email" size="30" maxlength="50" class="input"></td></tr>
<tr><td class=tabulka>Předmět: <font color="#FF0000">*</font></td><td><input style="WIDTH: 250px" type="text" name="predmet" value="<?if (IsSet($id)) echo "Re: $topic_name";?>" size="30" maxlength="50" class="input"></td></tr>
<tr><td valign=top class=tabulka>Text zprávy: <font color="#FF0000">*</font></td><td><textarea style="WIDTH: 350px" cols="40" rows="7" name="zprava" class="input"></textarea></td></tr>
<tr><td colspan="2" align="center"><input type="submit" name="send" value="Odeslat" class="input"></td></tr>
<tr><td colspan="2" class=tabulka><font color="#FF0000">*</font> – povinný údaj</td></tr>
</table></td></tr></table>
<input type="hidden" name="id" value="<?echo $id?>">
</form>

Kontrolu, zda jsou všechny položky správně vyplněné, provedeme pomocí JavaScriptu. Takto bude vypadat kód.

<SCRIPT LANGUAGE="JavaScript"><!–
function zkontroluj(formular)
{
if (formular.jmeno.value=="")
{
alert("Vaše jméno (přezdívku) musíte vyplnit!");
formular.jmeno.focus();
return false;
}
else if (formular.predmet.value=="")
{
alert("Předmět zprávy musíte vyplnit!");
formular.predmet.focus();
return false;
}
else if (formular.zprava.value=="")
{
alert("Text zprávy musíte vyplnit!");
formular.zprava.focus();
return false;
}
else if (formular.email.value!="")
{
re = new RegExp("^[^.]+(\.[^.]+)*@([^.]+[.])+[a-z]{2,3}$");
if (!re.test(formular.email.value))
{
alert("Zadaná adresa není správnou adresou elektronické pošty!");
formular.email.focus();
return false;
}
}
else
return true;
}
// –>
</SCRIPT>

Zápis příspěvku

Zápis realizuje soubor post.php3. Většina operací, které se v průběhu zápisu provádějí, vychází z návštěvní knihy. Proto, pokud budete potřebovat podrobnější výklad, přečtěte si poslední článek o návštěvní knize.

Celá následující část je kromě regulárních výrazů stejná jako u návštěvní knihy. U všech regulárních výrazů přidáme na konec ‚.*‘ (např. ^(www\..+\..{2,3}.*), aby došlo i k detekci odkazů typu www.interval.cz?clanek=251.

//odstraneni nebezpecnych znaku
$jmeno = HTMLSpecialChars($jmeno);
$email = HTMLSpecialChars($email);
$predmet = HTMLSpecialChars($predmet);
$cas = Date("j. " . "m. " . "Y");
$zprava = SubStr($zprava, 0, 1500); //bereme pouze 1500 znaku
$zprava = Trim($zprava); //odstraneni mezer z konce retezce
$zprava = HTMLSpecialChars($zprava); //odstraneni nebezpecnych znaku
$zprava = Str_Replace("\r\n"," <BR> ", $zprava); //nahrazeni koncu radku na tagy <BR>
$znak = 123; //dlouha slova delit po … znacich
$slovo = Split("[[:blank:]]+", $zprava); //rozdeleni textu na slova
for($y=0;$y<Count($slovo);$y++):
$slovo[$y] = Trim($slovo[$y]); //odstraneni mezer na konci slova
if (Strlen($slovo[$y])<=$znak): //nebudeme delit
if (EregI("^(www\..+\..{2,3}.*)", $slovo[$y])): //jedna se odkaz typu www
$odkaz = EregI_Replace("^(www\..+\..{2,3}.*)", "<a href=http://\\1>\\1</a> ", $slovo[$y]);
elseif (EregI("^(http://.+\..{2,3}.*)", $slovo[$y]))://jedna se odkaz typu http://
$odkaz = EregI_Replace("^(http://.+\..{2,3}.*)", "<a href=\\1>\\1</a> ", $slovo[$y]);
else:
$odkaz = $slovo[$y] . " "; //jedna se o normalni slovo
endif;
$celek .= $odkaz; //spojime vsechny slova opet dohromady
else:
$delit = Ceil(StrLen($slovo[$y])/$znak); //delime dlouhe slovo
for($z=0;$z<$delit;$z++):
$cast = Substr($slovo[$y], $z*$znak, $znak);
$celek .= $cast . " – "; //na konec jednotlivych casti pridame pomlcku
endfor;
endif;
endfor;

I následující část je téměř stejná s návštěvní knihou. Fce Str_Replace() byla nahrazena funkcí EregI_Replace(), aby se mohly používat tagy psané jak malými, tak i velkými písmeny.

//povolime tyto tagy <b> <u> <i>
$zprava = EregI_Replace("<b>", "<b>", $celek);
$zprava = EregI_Replace("</b>", "</b>", $zprava);
$zprava = EregI_Replace("<i>", "<i>", $zprava);
$zprava = EregI_Replace("</i>", "</i>", $zprava);
$zprava = EregI_Replace("<u>", "<u>", $zprava);
$zprava = EregI_Replace("</u>", "</u>", $zprava);

Nyní vytvoříme pomocí funkce UniqID unikátní označení příspěvku a všechny údaje uložíme do proměnné $write.

$id_post = UniqID(""); //unikatni oznaceni prispevku
$write = StripSlashes($id_post . "#" . $predmet . "#" . $jmeno . "#" . $cas . "#" . $email . "#" . $zprava);//odstraneni escape sekvenci

Následně zjistíme, do jakého souboru budeme zapisovat, pokud je obsah proměnné $id prázdný, bude to soubor main.topic (hlavní téma), jinak soubor $id.topic. Z minulého článku si ještě připomeňme, co je proměnná $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.

//kam budeme zapisovat (hlavni tema nebo odpoved)
if ($id==““):
$filewrite = "data/main.topic";
else:
$filewrite = "data/$id.topic";
endif;

Poté musíme zjistit, zda-li se jedná o první záznam do souboru. Pokud ano, je proměnná $endwrite rovna proměnné $write. Pokud ne, musíme do proměnné $endwrite přidat ještě nový řádek pomocí escape sekvence \n.

//zjistime, zda se jedna o prvni zaznam do souboru
if (!File_Exists($filewrite)):
$endwrite = $write;
else:
$endwrite = "\n" .$write;
endif;

Na závěr už jen zapíšeme obsah proměnné $endwrite do souboru $filewrite a přesuneme se na hlavní stránku s diskusním fórem.

//zapis noveho prispevku
$fp = FOpen ($filewrite, "a+");
FWrite ($fp, $endwrite);
FClose ($fp);
?>
<html><head>
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=index.php3">
</head></html>

Tímto končí úvodní série článků o diskusním fóru bez použití databáze. Vaše podněty a návrhy na zlepšení očekávám v diskusním fóru pod článkem. Kompletní zdrojové kódy si můžete stáhnout zde. Přeji vám hezký den.

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

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

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 *