Pokud provozujete odborněji zaměřený e-zine, diskusní fórum bude pro vás přínosem minimálně ze dvou důvodů. Za prvé, návštěvníci budou moci diskutovat o tématu, na který je e-zine zaměřen, což zvýší atraktivitu vašeho webu. Z toho vyplývá i další pozitivum - návštěvníci nebudou přicházet jen kvůli článkům, ale i kvůli diskusnímu fóru - podívají se, co je nového apod.
Nyní přejděme k samotné tvorbě diskusního fóra. Bude se
skládat z tabulky a čtyř souborů. Začneme tabulkou. Ta se bude jmenovat
prispevky a bude mít následující strukturu (význam jednotlivých polí vysvětlím níže):
| Název pole |
Datový typ |
| idprispevku |
automatické číslo - primární klíč |
| odpoved |
číslo |
| autor |
text |
| email |
text |
| predmet |
text |
| txt |
text |
| datum |
datum/čas |
| pocet |
číslo |
| posledni |
datum/čas |
Diskusní fórum bude fungovat takto: návštěvník vloží příspěvek (pravděpodobně nějakou otázku - tomuto příspěvku říkejme například hlavní) - a na ní budou moci ostatní návštěvníci odpovídat. Funkce pole idprispevku je, myslím,
jasná. Pole odpovedet má následující význam. Pokud návštěvník na nějaký
příspěvek odpovídá, uloží se do něj idprispevku tohoto příspěvku. Při vložení nového
příspěvku (tj. ten hlavní) je do pole odpovedet uložena hodnota nula. Pole autor, email, predmet a txt jsou již vlastní informace o autoru a textu příspěvku. Pole datum označuje datum vložení příspěvku. Poslední dvě pole, pocet a posledni, mají význam jen u
příspěvku hlavního. První z nich udává počet odpovědí na tento
příspěvek a druhé datum vložení poslední z nich.
Databázi máme vyřešenu, teď se zaměříme na soubory ASP. Prvním je soubor default.asp, jenž zobrazí všechny
doposud vložené hlavní příspěvky (obrázek). K odpovědím se
návštěvník dostane po vybrání jednoho z nich. SQL kód, který vybere hlavní
soubory, je následující:
|
SELECT * FROM prispevky WHERE odpoved = 0 ORDER BY posledni DESC
|
Jak vidíte, přípěvky budeme řadit podle pole posledni - tzn., že první bude ten nejaktuálnější.
V této aplikaci nebudeme vytvářet žádnou DSN, místo toho využijeme druhého možného způsobu. Databázi vybereme zadáním její cesty. Má to výhodu v situacích, kdy nemáte možnost vytvořit DSN:
|
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath("forum.mdb")
|
Takto vybereme databázi forum.mdb (databáze MS
ACCESS), která se nachází ve stejné složce jako soubor ASP.
Na této stránce se bude nacházet také formulář na vložení nového příspěvku:
<form action="novy_prispevek.asp" method="post">
<table class="pismo">
<tr><td width="150">Jméno</td><td><input type="text" name="jmeno" maxlength= "50"value="<%= request.querystring("jmeno") %>"></td></tr>
<tr><td width="150">Email</td><td><input type="text" name="email" maxlength= "100"value="<%= request.querystring("email") %>"></td></tr>
<tr><td width="150">Předmět</td><td><input type="text" name="predmet" maxlength="100" value="<%= request.querystring("predmet") %>"></td></tr>
<tr><td>Text příspěvku</td><td><textarea name="txt" cols= "50"rows="10"><%= request.querystring("txt") %></textarea></td></tr>
<input type="hidden" name="novy" value="1">
</table>
<input type="submit" value="Odeslat">
</form>
|
Atribut value="..." u
vstupních polí
najde využití v případě, že návštěvník špatně (či spíše neúplně) vyplní
formulář. Zpracovávající kód jej totiž vrátí a pole, která byla správně vyplněna, již nebude muset vyplňovat znovu. Protože zpracovávající kód pro formulář na odpověď a na vložení odpovědi se nachází v jednom souboru, musí poznat, jestli platí první možnost nebo druhá. Z tohoto důvodu použijeme skrytého pole nova, pomocí kterého tento soubor pozná, že jde o druhou možnost.
Celý zdrojový kód souboru default.asp je pak následující:
<%
Set conn =
Server.CreateObject("ADODB.Connection")
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" & Server.MapPath("forum.mdb")
Set rs =
conn.execute("SELECT * FROM prispevky WHERE odpoved = 0 " &_
"ORDER BY posledni DESC")
%>
<html>
<head>
<title>Forum</title>
<link rel="stylesheet" type="text/css" href="forum.css">
</head>
<body>
<table border="0" width="90%" align="center">
<tr>
<td width="100%" class='hlavicka'> Diskusní fórum</td>
</tr>
</table>
<table border="0" width="90%" align="center" class="pismo">
<%
' Vypsání všech "hlavních" příspěvků...
Do Until rs.eof
response.write "<tr><td width=
'40%'><a href='prispevek.asp?id=" &_
rs("idprispevku") & "'>" & rs("predmet") & "</a></td>"
response.write "<td width='20%'>" & rs("autor") & "</td>"
response.write "<td width='10%'>" & rs("pocet") & "</td>"
response.write "<td align='right' width='20%'>" & rs("posledni") & "</td>"
response.write "</tr>"
rs.MoveNext
Loop
%>
</table>
<br><br>
<a name="novy"></a>
<%
' Pokud je formulář neúplně vyplněn...
If Request.QueryString("chyba")=1 Then %>
<p class="chyba">Chyba! Formulář nebyl správně vyplněn</p>
<% End If %>
<table border="0" width="90%" align="center">
<tr><td width="100%" class='hlavicka'> Přidat příspěvek</td></tr>
<tr>
<td>
<form action="novy_prispevek.asp" method="post">
<table class="pismo">
<tr><td width="150">Jméno</td><td><input type="text" name="jmeno" maxlength= "50"value="<%= request.querystring("jmeno") %>"></td></tr>
<tr><td width="150">Email</td><td><input type="text" name="email" maxlength= "100"value="<%= request.querystring("email") %>"></td></tr>
<tr><td width="150">Předmět</td><td><input type="text" name="predmet" maxlength="100" value="<%= request.querystring("predmet") %>"></td></tr>
<tr><td>Text příspěvku</td><td><textarea name="txt" cols= "50"rows="10"><%= request.querystring("txt") %></textarea></td></tr>
<input type="hidden" name="novy" value="ano">
</table>
<input type="submit" value="Odeslat">
</form>
</td>
</tr>
</table></body>
</html>
<%
conn.close
Set conn = Nothing
Set rs =
Nothing
%>
|
V souborech budeme používat kaskádové styly. Uschováme je v souboru forum.css:
body {
font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
}
.hlavicka {
background : #007000;
color : White;
font-weight : bold;
font-size : small;
}
.pismo {
font-size : 12px;
}
.nadpis {
font-size : 16px;
font-style : normal;
font-weight : bold;
}
.chyba {
text-align : center;
color : red;
}
|
Odkaz u každého příspěvku směřuje na soubor prispevek.asp a předává mu parametr id, který zastupuje ID příspěvku. Nejdříve z databáze vybereme tento hlavní příspěvek a potom odpovědi na něj (řadíme je od nejdříve vloženého):
intID = Request.QueryString("id")
SELECT * FROM prispevky WHERE idprispevku = " & intID
SELECT * FROM prispevky WHERE odpoved = " & intID & " ORDER BY datum
|
Každou odpověď (i hlavní příspěvek) vložíme do rámečku (tabulky), která bude mít tento zdrojový kód:
|
<table border="0" width="90%" align="center" class="pismo"> <tr><td width="100%"
class='hlavicka'>
předmět</td></tr> <tr><td>Autor: <a
href="mailto:email">Autor</a><br>Datum: <
EM> datum <br><br>Text
příspěvku
</td></tr>
<tr><td align="right"><a href='#odpovedet'>Odpovědět</a></td></tr> </table>
|
Samozřejmě nechybí formulář na odpověď k příspěvku. Zpracovávající kód pozná, na který příspěvek se odpovídá, podle parametru odp:
<a name="odpovedet"></a>
<% If Request.QueryString("chyba")=1 Then %>
<p class="chyba">Chyba! Formulář nebyl správně vyplněn</p> <% End If %> ... <form
action=
"novy_prispevek.asp?odp=<%= hlavni("idprispevku") %>" method="post">
<table class="pismo">
<tr><td width="150">Jméno</td><td><input type="text" name="jmeno" maxlength= "50"value="<%= request.querystring("jmeno") %>"></td></tr>
<tr><td width="150">Email</td><td><input type="text" name="email" maxlength= "100"value="<%= request.querystring("email") %>"></td></tr>
<tr><td width="150">Předmět</td><td><input type="text" name="predmet" value="RE: <%= hlavni("predmet") %>" maxlength="100"></td></tr>
<tr><td>Text příspěvku</td><td><textarea name="txt" cols="50" rows="10" ><%= request.querystring("txt") %></textarea></td></tr>
</table>
<input type="submit" value="Odeslat">
</form>
|
Celý zdrojový kód souboru prispevek.asp vypadá takto (obrázek):
<%
If len(Request.QueryString("id"))>0 Then
Set conn = Server.CreateObject("ADODB.Connection")
' Otevření spojení
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath("forum.mdb")
intID =
Request.QueryString("id") Set hlavni =
conn.execute("SELECT * FROM prispevky WHERE idprispevku = " & intID)
Set odp = conn.execute("SELECT * FROM prispevky WHERE odpoved = " & intID & " ORDER BY datum")
%>
<html>
<head> <title>Diskusní fórum - <%=
hlavni("predmet") %></title>
<link rel="stylesheet" type="text/css" href="forum.css">
</head>
<body>
<table border="0" width="90%" align="center" class="pismo">
<tr><td width= "100%"class='hlavicka'> <%= hlavni("predmet") %></td></tr>
<tr><td>Autor: <a href="mailto:<%= hlavni("email") %>"><%= hlavni("autor") %></a><br>Datum: <%= hlavni("datum") %><br><br><%= hlavni("txt") %></td></tr>
<tr><td align="right"><a href='#odpovedet'>Odpovědět</a></td></tr>
</table>
<br>
<%
'Vypsání všech odpovědí...
Do Until odp.eof
response.write "<table border='0' width='90%' align='center' class='pismo'>"
response.write "<tr><td width='100%' class='hlavicka'> " &_
odp("predmet") & "</td></tr>"
response.write "<tr><td>Autor: <a href='mailto:" & odp("email") &_
"'>"
& odp("autor") & "</a><br>Datum: " & odp("datum") & "<br><br>" &_
odp("txt") & "</td></tr>"
response.write "<tr><td align='right'><a href='#odpovedet'>Odpovědět</a></td></tr>"
response.write "</table>"
odp.MoveNext
Loop
%>
<br><br>
<a name="odpovedet"></a>
<% If Request.QueryString("chyba")=1 Then %>
<p class="chyba">Chyba! Formulář nebyl správně vyplněn</p>
<% End If %>
<table border="0" width="90%" align="center">
<tr><td width="100%" class='hlavicka'> Odpovědět</td></tr>
<tr>
<td>
<form action="novy_prispevek.asp?odp=<%= hlavni("idprispevku") %>" method="post">
<table class="pismo">
<tr><td width="150">Jméno</td><td><input type="text" name="jmeno" maxlength= "50"value="<%= request.querystring("jmeno") %>"></td></tr>
<tr><td width="150">Email</td><td><input type="text" name="email" maxlength= "100"value="<%= request.querystring("email") %>"></td></tr>
<tr><td width="150">Předmět</td><td><input type="text" name="predmet" value="RE: <%= hlavni("predmet") %>" maxlength="100"></td></tr>
<tr><td>Text příspěvku</td><td><textarea name="txt" cols="50" rows="10" ><%= request.querystring("txt") %></textarea></td></tr>
</table>
<input type="submit" value="Odeslat">
</form>
</td>
</tr>
</table>
</body>
</html>
<%
conn.close
Set conn = Nothing
Set hlavni = Nothing
Set odp = Nothing
End If
%>
|
Nyní zbývá poslední soubor, novy_prispevek.asp, který vkládá nové příspěvky a odpovědi do databáze:
<%
response.buffer =
true
response.expires = -1000
' Pokud se vkládá nový příspěvek...
If len(request.form("novy"))>0 Then
strJmeno = request.form("jmeno")
strEmail = request.form("email")
If len(strEmail) = 0 Then
strEmail="-"
End If
strPredmet = request.form("predmet")
strTxt = request.form("txt")
' Ověření správnosti dat...
If len(strJmeno)>0 AND len(strPredmet)>0 AND len(strTxt)>5 Then
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath("forum.mdb")
dtmDatum =
now()
' Vložení dat do databáze...
conn.execute("INSERT INTO prispevky(odpoved,autor,email,predmet,txt,datum,pocet,posledni)" & _
" VALUES (0,'" & strJmeno & "','" & strEmail & "','" & strPredmet & "','" & strTxt &_
"','" & dtmDatum & "', 0,'" & dtmDatum & "')")
conn.close
Set conn = Nothing
Set rs =
Nothing
' Pokud jsou data špatně vložená...
Else
response.redirect
"default.asp?jmeno=" & strJmeno & "&email=" & strEmail & "&predmet=" & strPredmet & _
"&txt=" & strTxt & "&chyba=1&#novy"
End If
response.redirect "default.asp"
End If
'*********************************************************
' Pokud se odpovídá...
If len(request.querystring("odp"))>0 Then
strJmeno = request.form("jmeno")
strEmail =
request.form("email")
If len(strEmail) = 0 Then
strEmail="-"
End If
strPredmet = request.form("predmet")
strTxt = request.form("txt")
intOdp = request.querystring("odp")
' Ověření správnosti
dat...
If len(strJmeno)>0 AND len(strPredmet)>0 AND len(strTxt)>0 Then
Set conn =
Server.CreateObject("ADODB.Connection")
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath("forum.mdb")
dtmDatum =
now()
' Vložení odpovědi do databáze...
conn.execute("INSERT INTO prispevky(odpoved,autor,email,predmet,txt,datum) VALUES (" &_
intOdp & ", '" & strJmeno & "','" & strEmail & "','" & strPredmet & "','" & strTxt &_
"','" & dtmDatum & "')")
' Upravení data poslední odpovědi a připočtení jedničky u počtu odpovědí
' u "hlavního" příspěvku...
conn.execute("UPDATE prispevky SET pocet = pocet + 1, posledni = '" & dtmDatum &_
"' WHERE idprispevku = " & intOdp)
conn.close
Set conn = Nothing
Set rs =
Nothing
' Pokud byla odpověď špatně zadaná...
Else
response.redirect
"prispevek.asp?id=" & intOdp & "&jmeno=" & strJmeno & "&email=" &_
strEmail & "&txt=" & strTxt & "&chyba=1&#odpovedet"
End If response.redirect "prispevek.asp?id=" & intOdp
End If
response.redirect "default.asp"
%>
|
Nyní je diskusní fórum již zcela funkční. Zde si můžete stáhnout
zdrojové kódy všech souborů i s databází.
Liška Adam
|