Cách tạo một diễn đàn trên trang web (web forum)
Xem bai viet bang font ABC

PCWorld VN 7/99

    Nếu đã từng duyệt Web, chắc hẳn bạn đã có lần tham gia vào mục diễn đàn trên Internet (nơi các Web Users đăng tải và trao đổi các bài viết, ý kiến của mình với người khác, mục hỏi đáp của CLB VNN1 - mạng VNN là một ví dụ).
Phần bài sau sẽ trình bày cách tạo Web Site thực hiện công việc quản lý một diễn đàn, hy vọng nó có thể giúp ích cho các bạn đang thiết kế trang Web cho mạng intranet trong công ty mình hoặc đang tìm hiểu về trang ASP.

Yêu cầu hệ thống:

Web Server: Microsoft Internet Information Server 4.0 (Windows NT) hoặc Microsoft Personal Web Server 4.0 (Windows 9x)
Hệ CSDL: Microsoft SQL Server 6.5 hoặc Microsoft Access
Web Browser for Client: Microsoft Internet Explorer

Thiết kế dữ liệu:

Thông tin về các bài viết được lưu trữ trong bảng FORUM có cấu trúc như sau (cho SQL Server 6.5):

+ Doc_No: tự động tăng 1 khi thêm một bài viết mới, bài viết ứng với record này sẽ có tên <Doc_No>.html

+ Order_No: là khóa chính, có giá trị mặc nhiên là 'Z' để xử lý trường hợp có hơn một bài viết được gửi cùng lúc. Sau khi được cập nhật, Order_No có dạng gồm một hay nhiều cụm bốn chữ số, số cụm cho biết cấp của bài đó:

Số cụm =1 (cấp 1): bài viết mới

Số cụm =n, n>1 (cấp n): bài trả lời cho bài cấp n-1

+ Cách xây dựng Order_No:

Nếu là bài viết mới: Order_No=Doc_No

Nếu là bài trả lời: Order_No=Order_No của bài được trả lời + Doc_No

Nếu Doc_No không đủ bốn chữ số thì thêm các chữ số 0 vào đầu cho đủ bốn

Với độ rộng Order_No=40, diễn đàn gồm tối đa 9999 bài và số cấp tối đa là 10. Bạn có thể thay đổi độ rộng của Order_No để thay đổi các giới hạn này.

Các thành phần của Web Forum:

1. Một thư mục (Application Directory) chứa các trang .ASP, bên trong tạo thư mục con FORUM để chứa các file bài viết HTML.

2. Khai báo ODBC System DSN chỉ đến Database chứa table FORUM (không cần khai báo ODBC nếu dùng DSN-Less Connection), ở đây dùng DSN có tên là ForumWeb.

3. Các trang .ASP: gồm FORUM.ASP, FORUMDAT.ASP và RUNPOST.ASP.

FORUM.ASP: trang chính của diễn đàn, liệt kê chủ đề mọi bài viết đã được đăng theo đúng thứ tự và vị trí bài viết.

Mỗi chủ đề là một liên kết (link) đến trang Web chứa nội dung của bài viết.

Một liên kết cho phép thêm bài mới.

Hình thức FORUM.ASP trên Web Browser:

DANH MUC CAC BAI DA DANG
Bai viet so 1
Bai viet so 1.1 (Tra loi bai so 1)
Bai viet so 1.2 (Tra loi bai so 1)
Bai viet so 1.2.1 (Tra loi bai so 1.2)

Bai viet so 2
Bai viet so 3
Bai viet so 3.1 (Tra loi bai so 3)
Bai viet so 3.1.1 (Tra loi bai so 3.1)
Bai viet so 3.1.1.1 (Tra loi bai so 3.1.1)
Bai viet so 4
Bai viet so 5

Thêm bài mới
Phần Source code FORUM.ASP:

<html>
<head>
<title>Main Forum</title>
</head>
<body>
<p>
<Font color="#FF0080"><strong><big>danh muc cac bai da dang</big></strong></font>
<%
On Error Resume Next
set conn=server.createobject("ADODB.Connection")
?Mo Data Connection dung DSN ForumWeb, User: sa, Password: sapw
conn.open "ForumWeb","sa","sapw"
Set rs = conn.execute("Select * from Forum") ?Tu dong Sort theo Order_No vi la Primary Key
rs.MoveFirst
do while Not rs.eof
?mlevel: cap cua bai viet
mlevel=int(len(trim(rs("Order_no")))/4)
%>
<br>
<% for i=2 to mlevel %>
<!? Chu de phai lui vao ung voi cap cua no ?>
&nbsp; &nbsp;&nbsp; &nbsp;
<% next %>
?Liên kết đến file HTML chứa nội dung bài viết trong thư mục FORUM
<a href="Forum\<%=rs("Doc_No")%>.html"> <%=rs("Subject")%></a>
<%
rs.MoveNext
Loop
%>
</p>
<p><br>__________ <br>
<a href="ForumDat.asp">Them bai moi</a> </p>
</body>
</html>

Forumdat.asp: Cho phép người viết nhập tiêu đề và nội dung bài viết của mình. Tập tin này được gọi khi người dùng nhấn vào liên kết <Thêm bài mới> của trang Forum.asp hoặc chọn mục <Trả lời> ở các trang bài viết. Phần chính trang Forumdat.asp là một Form nhập gồm các thành phần sau:

* Một đối tượng text để nhập chủ đề bài viết
* Một đối tượng textarea để nhập nội dung bài viết
* Một đối tượng button (nút lệnh) để hoàn tất Form

Phần source code của Forumdat.asp:

<html>
<head>
<title>Forum Data</title>
</head>
<body>
<%
?mOrderNo: Order_No của bài viết gọi ForumDat.ASP, mOrderNo=rỗng nếu là trang mới
mOrderNo=Request("OrdNo")
%>
<form Name="Frm1" method="POST" Action="RunPost.asp?OrdNo=<%=mOrderNo%>">
<p>Chu De:<br>
<input type="text" name="txtSubj" size="62">
<br><br>Noi Dung:<br>
<textarea rows="15" name="txtCont" cols="70"></textarea></p>
<p><input type="submit" value="Gui Bai" name="btnSubmit"></p>
</form>
</body>
</html>

Runpost.asp: Được gọi khi người viết nhấn nút <Gui Bai> ở trang forumdat.asp, nó thực hiện hai công việc sau:
Thêm một record vào table FORUM và cập nhật các trường Order_No và Subject

Tạo tập tin <Doc_No>.html trong thư mục FORUM với nội dung do người viết gửi lên.

Phần source code Runpost.asp:

<html>
<head>
<title>Run Forum Posting Data</title>
</head>
<body>
<%
set
conn=server.createobject("ADODB.Connection")
conn.open "ForumWeb","sa","sapw"
conn.BeginTrans
?Sử dụng Transaction, đảm bảo record được thêm và được cập nhật giá trị Order_No cùng một lúc
on error resume next
do
'Thêm một record mới vào table FORUM và cập nhật trường Subject
'Nếu xảy ra lỗi (một record khác đã được thêm vào nhưng chưa được cập nhật giá trị Order_No)
'thì dừng trong một khoảng thời gian ngẫu nhiên trước khi thực hiện lại
conn.execute "Insert into Forum (Subject) Values (?" & Request.form("txtSubj") & "')"
merr=err
if merr<>0 then
randomize
?Vòng lặp rỗng để chờ trong một khoảng thời gian ngẫu nhiên
for i=1 to int(rnd*10000)
next
end if
loop until merr=0
?Xác định Doc_No của record mới thêm
set rs=conn.execute("Select Doc_No from Forum where Order_No=?Z?")
mdocid=cstr(rs("Doc_No"))
mdocno=mdocid
?Thêm các số 0 vào trước nếu chưa đủ bốn số
for i=1 to (4-len(mdocno))
mdocno="0" & mdocno
next
?Nếu là bài trả lời thì cộng thêm Order_No của bài được trả lời vào trước
if Request("OrdNo")<>"" then
mdocno=Request("OrdNo") & mdocno
end if
set rs=nothing
msql="Update Forum Order_No=?" & mdocno & "? where Doc_no=" & mdocid
conn.execute msql
conn.CommitTrans
Set conn=Nothing
?Xác định đường dẫn đến Application Directory chứa các file .ASP
mpath=Server.MapPath (request.servervariables("PATH_INFO"))
mpos=len(mpath)
do while mid(mpath,mpos,1)<>"\"
mpos=mpos-1
loop
mpath=left(mpath,mpos)
?Tạo file HTML chứa nội dung bài viết trong thư mục FORUM
mfile=mpath & "Forum\" & mdocid & ".html"
set fso=createobject("scripting.filesystemobject")
set fhtml=fso.createtextfile(mfile)
fhtml.writeline("<html>")
fhtml.writeline("<Title>")
fhtml.writeline(Request.Form("txtSubj"))
fhtml.writeline("</Title>")
fhtml.writeline("<Body>")
fhtml.writeline("<p>")
fhtml.writeline(Request.Form("txtCont"))
fhtml.writeline("</p>")
mline="<a Href=""/ForumDat.asp?OrdNo=" & mdocno & """>Tra loi</a>"
fhtml.writeline("<p>")
fhtml.writeline(mline)
fhtml.writeline("</p>")
fhtml.writeline("</Body>")
fhtml.writeline("</html>")
fhtml.close
%>
<Script Language="VBScript">
window.navigate("FORUM.ASP")
</Script>
</body>
</html>

Trên đây là các thành phần cơ bản để tạo một Web Forum. Bạn có thể cải tiến theo yêu cầu của mình như thay đổi số bài và số cấp tối đa, lưu trữ thêm một số yếu tố khác về bài viết (tác giả, ngày giờ), thêm Client Script kiểm tra các thông tin nhập hoặc cải tiến hình thức trình bày của các trang...

Chúc bạn thành công.

Lã Mạnh Cường
Saigon Sky Garden - 20 Lê Thánh Tôn, Q1, TP. HCM - ĐT: 822 0002


PcLeHoan 1996 - 2002
Mirror : http://www.pclehoan.com
Mirror : http://www.lehoanpc.net

Mirror : http://www.ktlehoan.com