Ako vytvoriť fórum na webe ?

15.11.2003

0 panak     star



Keďže posledné dni som sa trápil s poslednými technickými úpravami môjho fóra, rozhodol som sa pomôcť týmto článkom všetkým tým, ktorí uvažujú o vtvorení niečoho podobného na svojej stránke. Na začiatok je potrebné si uvedomiť, či vytvorené fórum má slúžiť ako istý druh dotazníka, alebo ma komunikáciu medzi uživateľmi a tvorcom. V tomto návode sa budem zaoberať a navrhnem základnú štruktúru fóra, ktoré je schopné ovládať sa s minimálnymi zásahmi administrátora (tými zásahmi myslím mazanie nevhodných príspevkov a pod.).

Takže aké budú vlastnosti a možnosti budúceho fóra :
   - neustála komunikácia s databázou (v našom prípade MySql)
   - uchovávanie mena prispievateľa, nadpisu, komentára, času a dátumu pridania príspevku
   - možnosť odpovedať na ktorýkoľvek príspevok
   - možnosť vytvoriť viacero módov zobrazovania (napr. úplné alebo len štruktúrálny...)

Keď už vieme, čo všetko má zvládať fórum, môžeme začať s jeho tvorbou. V databáze si vytvoríme tabuľku, ktorá bude uchovávať všetky potrebné informácie, t.j. meno prispievateľa, nadpis, komentár, čas a dátum priradenia a najdôležitejšiu hodnotu z hľadiska štruktúry - id príspevku (poradové číslo).

<?
$vytvor=MySQL_Query("create table forum (id INT, meno varchar(20), topic varchar(40), text TEXT, datum DATE, cas TIME)");
?>

Spojenie z databázou zvládnete určite sami. Tabuľku máme pripravenú. Ďalej si vytvoríme formulár, ktorý nám bude odosielať údaje a vkladať ich do databázy / tabuľky.

<FORM ACTION='index.php
<? echo("&ID=$ID&topic="); echo($ntica["topic"]); echo("&zobraz=$zobraz");
?>' METHOD='post'>
   <INPUT TYPE='text' NAME='meno'>
   <INPUT TYPE='text' NAME='topic' <? if($topic!='')echo("value='Re: $topic'"); ?> >
   <TEXTAREA NAME='text' cols='60' rows='3'></TEXTAREA>
   <INPUT TYPE=submit NAME='submit' VALUE='Ok'>
</FORM>

Treba si uvedomiť, že volaný súbor je ten istý, ako ten, v ktorom sa nachádza zdrojový kód celého fóra. Príspevok sa tak hneď po jeho odoslaní zobrazí do zoznamu príspevkov. Preto je treba ešte pred odosielací formulár vložiť kus kódu, ktorý zach´ytí, že boli poslané údaje z formulára a je ich treba doručiť a vložiť do databázy.

<?
if($submit=='Ok')
    $posli=MySQL_Query("insert into forum values ('".$idecko."', '".$meno."', '".$topic."', '".$text."', current_date,now())");
?>

Všetky premenné, ktoré vkladáme do databázy sú známe, okrem premennej $idecko. Táto premenná uchováva poradie príspevku, ktorý sa pokúšame vložiť. Pokiaľ chceme vytvoriť fórum, v ktorom budeme ignorovať možnosť odpovedania na príspevky, postačí nám ak na začiatku kódu zistíme poradové číslo posledného príspevku, inkrementujeme premennú $idecko a máme o problém postarané.
Pokiaľ však chceme vniesť do príspevkov poriadok, je potrebné s možnosťou odpovedania na príspevky počítať, pričom organizáciu príspevkov bude mať na starosť práve premenná $idecko. Poradie vypisovania príspevkov bude určené podľa p. $idecko vzostupne. Treba zabezpečiť možnosť, že ak odpovieme na príspevok, ktorý sa nachádza napríklad v strede poľa príspevkov, nezaradí sa nami pridávaný príspevok na začiatok (ako najnovší), ale hneď za príspevok, na ktorý odpovedáme.

Zabezpečíme to nasledovne :
   - na začiatku si zistíme poradové číslo posledného pridaného príspevku (bude to to najväčšie)
   - zistíme, či pridávame nový komentár, alebo len odpoveď (túto informáciu nám pošle formulár)
   - ak pridávame nový komentár, bude $idecko = max(id) + 100 (prečo práve 100 vysvetlím neskôr)
   - ak pridávame odpoveď bude $idecko = $idecko_na_ktore_odpovedam - 1

A teraz ako to bude vyzerať reálne v php. Uvažujme o tom, že v prípade odpovedania na príspevok, nám formulár odošle hodnoty premenných $ID a $topic.

<?
// zistenie id posledneho pridaneho prispevku
$vysledok=MySQL_Query("select max(id) from forum");
$vysl=MySQL_Fetch_Array($vysledok);
$maximum=$vysl["max(id)"];

// priradenie id prispevku, ktory chceme pridat
if($ID==0)$idecko=$maximum+100; else $idecko=$ID-1;

// a sem vložíme zapísanie údajov do databázy - viď predošlý kód
?>

Vytvorenie a vkladanie do databázy máme hotové. Už stačí len zabezpečiť načítavanie a vypisovanie údajov. Záznamy budeme čítať z tabuľky databázy a zoraďovať podľa priority nasledovne - podľa id vzostupne, podľa dátumu vzostupne a podľa času vzostupne.

<?
// nacitanie udajov z databazy
$nacitanie=MySQL_Query("select *from forum order by id DESC, datum DESC, cas DESC");

// vypisovanie udajov - napr. jednoducho len pomocou odstavcov
while($ntica==MySQL_Fetch_Array($nacitanie){
   $odsadenie=$sirka=((1000000-$ntica["id"])%100)*7;
   echo("<p style='width:100%;margin-left:$odsadenie']");
   echo($ntica["meno]);
   echo($ntica["topic"]);
   echo($ntica["datum"]);
   echo($ntica["cas"]);
   echo("<a href='index.php?ID="); echo($ntica["id"]);
   echo("&topic="); echo($ntica["topic"]); echo("> odpovedať </a></p>");
}
?>

Štylizáciu a doladenie designu nechám už na vás, keďže každý má svoj vlastný štýl a zbytočne by som len zneprehľadnil kód. Ešte niečo k premennej $odsadenie - odsadí text podľa toho, či sa jedná o príspevok, odpoveď na príspevok alebo odpoveď na odpoveď ... Proste čím hlbšie v strome odpovedí sa nachádzame, tým bude text odsadený viacej.
No a na záver ešte jedno obmedzenie. Maximálna hĺbka podstromu odpovedí je 99. Dá sa to samozrejme s dávkou šikovnosti zmeniť...
Celý zdrojový kód fóra vyzerá asi nasledovne:

<?
// MySql / PHP forum © JoKy 2003
// *************************

// sem pride zabezpecenie spojenia z databazou

// zistenie id posledneho pridaneho prispevku
$vysledok=MySQL_Query("select max(id) from forum");
$vysl=MySQL_Fetch_Array($vysledok);
$maximum=$vysl["max(id)"];

// priradenie id prispevku, ktory chceme pridat
if($ID==0)$idecko=$maximum+100; else $idecko=$ID-1;

if($submit=='Ok')
    $posli=MySQL_Query("insert into forum values ('".$idecko."', '".$meno."', '".$topic."', '".$text."', current_date,now())");

?>

<FORM ACTION='index.php
<? echo("&ID=$ID&topic="); echo($ntica["topic"]); echo("&zobraz=$zobraz");
?>' METHOD='post'>
   <INPUT TYPE='text' NAME='meno']
   <INPUT TYPE='text' NAME='topic' <PHP] if($topic!='')echo("value='Re: $topic'"); ?> >
   <TEXTAREA NAME='text' cols='60' rows='3'></TEXTAREA>
   <INPUT TYPE=submit NAME='submit' VALUE='Ok'>
</FORM>

<?
// nacitanie udajov z databazy
$nacitanie=MySQL_Query("select *from forum order by id DESC, datum DESC, cas DESC");

// vypisovanie udajov - napr. jednoducho len pomocou odstavcov
while($ntica==MySQL_Fetch_Array($nacitanie){
   $odsadenie=$sirka=((1000000-$ntica["id"])%100)*7;
   echo("<p style='width:100%;margin-left:$odsadenie']");
   echo($ntica["meno]);
   echo($ntica["topic"]);
   echo($ntica["datum"]);
   echo($ntica["cas"]);
   echo("<a href='index.php?ID="); echo($ntica["id"]);
   echo("&topic="); echo($ntica["topic"]); echo("> odpovedať </a></p>");
}
?>

Fórum na moje stránke si môžete pozrieť tu.


   Štatistika prístupov cez PHP a MySql - I     späť na zoznam článkov     Vodák sport Bratislava   

Whitewater rafting, kayaking, expeditions, results and photos