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.