V diskusním fóru z minulého dílu byly všechny příspěvky
na jednom místě, i když byly každé z jiného oboru. Proto
dnes toto fórum vylepšíme a přidáme podporu témat. To znamená, že návštěvník na
hlavní stránce diskusního fóra bude mít na výběr z několika témat (pokud by to byl server o programování, tak např. ASP, PHP, C++,...).
To si vyžádá několik změn jak v databázi, tak i v souborech ASP. V databázi budeme muset vytvořit novou tabulku fora a v ní tři pole - idfora, forum a popis. Pole forum bude uchovávat název fóra a pole popis jeho popis. Aby se rozpoznalo, jaký příspěvek patří k jakému diskusnímu fóru, přidáme v tabulce prispevky pole idfora.
Fórum bude nyní pracovat následovně: Návštěvník otevře soubor default.asp, kde, na rozdíl od minulého dílu,
budou vypsány odkazy na jednotlivá témata. Po výběru jednoho z nich bude přesměrován na soubor forum.asp, kam se přesune obsah souboru
default.asp popsaný v
minulém díle.
Jednotlivé příspěvky bude zobrazovat
soubor prispevek.asp.
Vytvoření souboru default.asp
není složité. Záznamy z databáze - názvy fór - vypíše do tabulky (obrázek):
...
Set rs =
conn.execute("SELECT * FROM fora")
...
<%
Do Until rs.eof
response.write "<tr><td><a href='forum.asp?id=" & rs("idfora") & "' class='nadpis'>"
response.write rs("forum") & "</a></td></tr>"
response.write "<tr><td width='70%' colspan='3'><ul>" & rs("popis") & "</ul></td></tr>"
rs.MoveNext
Loop
%>
|
Celý zdrojový kód vypadá následovně:
<%
response.buffer =
true
response.expires = -1000
Set conn = Server.CreateObject("ADODB.Connection")
' Otevření spojení
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath("forum.mdb")
Set rs =
conn.execute("SELECT * FROM fora")
%>
<html>
<head>
<title>Untitled</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'><b> Diskusní fóra</b></td>
</tr>
</table>
<table border="0" width="90%" align="center" class='pismo'>
<%
Do Until rs.eof
response.write"<tr><td><a href='forum.asp?id=" & rs("idfora") & "' class='nadpis'>"
response.write rs("forum") & "</a></td></tr>"
response.write "<tr><td width='70%' colspan='3'><ul>" & rs("popis") & "</ul></td></tr>"
rs.MoveNext
Loop
%>
</table>
</body>
</html>
<%
conn.close
Set conn =
Nothing
Set rs =
Nothing
%>
|
Odkazy směřují na stránku forum.asp a předávají jí parametr id, který představuje ID tématu - fóra.
Soubor forum.asp bude téměř
identický jako soubor default.asp v minulém dílu. Prvním ze dvou rozdílů je, že se budou vybírat jen příspěvky z daného tématu:
intID = Request.QueryString("id")
Set rs = conn.execute("SELECT * FROM prispevky WHERE idfora = " & intID & " AND odpoved = 0 ORDER BY posledni DESC")
|
Dále budeme muset přidat k formuláři na nový
příspěvek skryté pole forum , podle kterého bude soubor novy_prispevek.asp poznávat, jaké číslo má doplnit do pole idfora:
|
<input type="hidden" name= "forum"value="<%= intID %>">
|
Celý soubor forum.asp vypadá takto:
<% 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 forum =
conn.execute("SELECT forum FROM fora WHERE idfora = " & intID)
Set rs = conn.execute("SELECT * FROM prispevky WHERE idfora = " & intID & " AND odpoved = 0 ORDER BY posledni DESC")
%>
<html>
<head>
<title>Forum</title>
<link rel="STYLESHEET" type="text/css" href="forum.css">
</head>
<body>
<% 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'> Diskusní fórum - <%= forum("forum") %></td>
</tr>
</table>
<table border="0" width="90%" align="center" class="pismo">
<%
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>
<table border="0" width="90%" align="center">
<tr><td width="100%" class='hlavicka'> Přidat příspěvek</td></tr>
<tr>
<td>
<a name="novy"></a>
<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">
<input type="hidden" name= "forum"value= "<%= intID %>">
</table>
<input type="submit" value="Odeslat">
</form>
</td>
</tr>
</table></body>
</html>
<%
conn.close
Set conn = Nothing
Set forum =
Nothing
Set rs = Nothing
End If
%>
|
Při vkládání nového příspěvku v souboru
novy_prispevek.asp se bude navíc ukládat hodnota do pole idfora, kterou soubor získá z již zmíněného skrytého pole.
Dále pak bude nutné návštěvníka přesměrovat na stránku forum.asp
(místo default.asp v minulém díle):
intIDfora = request.form("forum")
...
conn.execute("INSERT INTO prispevky(idfora,odpoved,...) VALUES (" & intIDfora & ",0...)")
...
response.redirect "forum.asp?id=" & intIDfora
|
Soubor novy_prispevek.asp po změnách:
<%
response.buffer =
true
response.expires = -1000
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")
intIDfora = request.form("forum")
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()
conn.execute("INSERT INTO prispevky(idfora,odpoved,autor,email,predmet,txt,datum," & _
"pocet,posledni) VALUES (" & intIDfora & ",0,'" & strJmeno & "','" & strEmail & "','"_ & strPredmet & "','"_ & strTxt & "','" & dtmDatum & "', 0,'" & dtmDatum & "')")
conn.close
Set conn = Nothing
Set rs =
Nothing
Else
response.redirect "forum.asp?id=" & intIdfora & "&jmeno=" & strJmeno &_
"&email=" & strEmail & "&txt=" & strTxt & "&chyba=1&#novy"
End If
response.redirect "forum.asp?id=" & intIDfora
'********************************************************************************
ElseIf 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")
If len(strJmeno)>0 AND len(strEmail)>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()
conn.execute("INSERT INTO prispevky(odpoved,autor,email,predmet,txt,datum) VALUES (" _ & intOdp & ", '" & strJmeno & "','" & strEmail & "','" & strPredmet & "','" & strTxt &_
"','" & dtmDatum & "')")
conn.execute("UPDATE prispevky SET pocet = pocet + 1, posledni = '" & dtmDatum & _
"' WHERE idprispevku = " & intOdp)
conn.close
Set conn =
Nothing
Set rs = Nothing
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"
%>
|
Soubory forum.css a prispevek.asp
zůstávají beze změn.
Zde si můžete stáhnout všechny zdrojové
kódy. V příštím díle diskusní fórum zase dále vylepšíme.
Liška Adam
|