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

    0

    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.

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

    Odpovědět