ASP на блюдечке. Часть 10
Просмотр списка сообщений в режиме администрирования (файл Admin-List.asp)
Нам потребуется страничка просмотра списка сообщений, извлекающая сообщения выбранного пользователем форума из таблицы всех сообщений и
организующая показ сообщений иерархически, то есть сдвигая сообщения-ответы вправо, сообщения-ответы на ответы еще правее и т.д.
<!--#include file="common-admin.asp"-->
<%
dim fid,tp,tid
dim rs_fn
dim ParentID,name,email,subject,mes,mesdate,image
dim forumname
Function getForumName(id)
set rs_fn=server.createObject("adodb.recordset")
sql="select forumid,forumname from ForumsTable where forumid="&id
rs_fn.open sql,conn
forumname = rs_fn("forumname")
response.write "<tr><td><b>" & forumname & "<br><br></b></TR></TD>"
rs_fn.close
set rs_fn=nothing
End Function
'Извлечем идентификатор текущего форума
fid = request("fid")
If CInt (session("status")) <> CInt(fid) OR session("status") = "" Then
Response.Redirect "error.htm"
End If
image = "<img src='../images/arr.gif' border=0>"
Call Header()
%>
<script>
function IsDel()
{
if (confirm("Вы уверены, что хотите удалить это сообщение?")) {
return true;
}
else {
return false;
}
}
</script>
<%
sql="select id, thread_id, name, email, subject, mesdate, forumID, thread_parent from MessagesTable "&_
"WHERE (forumid = " & fid & ") and thread_parent=0 order by id desc"
call connect()
rs.open sql,conn
If rs.eof and rs.bof then ' Если сообщений нет
Response.Write "<tr><td>Сообщений нет</tr></td>"
Else ' Показ всех сообщений
Response.Write getForumName(fid)
Do While Not rs.eof
tid = rs("thread_id")
ParentID=rs("id")
name=rs("name")
email=rs("email")
subject=rs("subject")
mesdate=rs("mesdate")
Response.write "<tr><td>"
Response.write image & "<a href='../show.asp?id=" & parentID & _
"&fid="&fid&"&tid="&tid&"'>" & subject & "</a>" & "...." & mesdate & "...." & name & "</a>"
Response.write " <a href='edit-del.asp?action=edit&id=" & parentID & _
"&fid="&fid&"&tid="&tid&"'>(Редактировать </a>" & _
"<a href='edit-del.asp?action=del&id=" & parentID & _
"&fid="&fid&"&tid="&tid&"' onclick='return IsDel()'> | Удалить) </a></tr></td>"
'Покажем дочерние сообщения
Call displayMessages(1,ParentID)
rs.MoveNext
Loop
End If
Call Close()
Response.Write "<tr><td><br>"
Response.Write "<br><br><a href='post.asp?fid=" & fid & "'>Послать сообщение как модератор форума</a>"
Response.Write "</table><br>"
%>
<p><a href="javascript:history.back(-1)">Назад</a> | <a href="../index.asp">Главная страница</a></p>
</body>
</html>
Согласитесь, все довольно просто. Результатом формирования странички списка является набор ссылок на странички просмотра отдельных сообщений (на страничку show.asp, которой в качестве параметра передается строка с идентификатором сообщения), и уровня вложенности: show.asp?id=" & parentID & "&fid="& fid &"&tid=" & tid", то есть точно таким же образом, как мы это описывали в предыдущей части статьи.
Самое главное в этой страничке заключается в выводе дочерних сообщений. Осуществляется это посредством вызова функции displayMessages.
Данная функция осуществляет вывод всех дочерних сообщений, причем в качестве параметров этой функции передаются уровень, с которого необходимо начать вывод дочерний сообщений, а также идентификатор сообщения-родителя.
Редактор сообщения (файл Edit-Del.asp)
Теперь нам (а точнее, нашим модераторам) будет нужен довольно простой редактор сообщений, позволяющий редактировать заголовок сообщения, атрибуты его автора, а также сам текст сообщения:
<%
option explicit
dim fid
dim useraction
dim dsn,sql,conn,rs
dim name,subject,email,id,mesBody
id = request("id")
fid = request("fid")
If CInt(session("status")) <> cint(fid) OR session("status") = "" Then
Response.Redirect "error.htm"
End If
userAction = request("action")
dsn = "DBQ=" & Server.Mappath("../Data/Forum.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};"
'dsn = "Forum"
set conn = server.createObject("adodb.connection")
conn.open dsn
Select Case userAction
Case "update"
id=request.form("id")
name=request.form("name")
subject=request.form("subject")
email=request.form("email")
mesBody = request.form("mesBody")
mesbody = Replace(mesbody, vbCrLf, "<br>")
sql = "update MessagesTable SET mesBody = '"&mesBody &_
"', subject='" & subject&"', name = '" & name &_
"', email = '" & email & "' where id="&id
conn.execute(sql)
conn.close
set conn = nothing
response.redirect "admin-list.asp?fid=" & fid
Case "del"
id = request.querystring("id")
sql = "delete from MessagesTable where id="&id
conn.execute(sql)
conn.close
set conn = nothing
response.redirect "admin-list.asp?fid=" & fid
Case "edit"
sql = "select * from MessagesTable where id="&id
set rs = conn.execute(sql)
name=rs("name")
subject=rs("subject")
email=rs("email")
mesBody=rs("mesBody")
mesbody = Replace(mesbody, "<br>",vbCrLf)
conn.close
set conn = nothing
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>ASP Форум (Редактирование сообщения)</title>
</head>
<body>
<table border=1 width=400>
<tr>
<td colspan=2><b>Редактирование сообщения</b><br></td>
</tr>
<form action="edit-del.asp?action=update" method="post">
<input type=hidden name=id value=<%=id%>>
<input type=hidden name=fid value=<%=fid%>
<tr>
<td>Имя:</td>
<td><input type="text" name="name" size=20 maxlength=20 value='<%= name %>'>
</td>
</tr>
<tr>
<td>Tema:</td>
<td><input type="text" name="subject" size=20 maxlength=20 value='<%= subject %>'>
</td>
</tr>
<tr>
<td>E-mail:</td>
<td><input type="text" name="email" size=20 maxlength=20 value='<%= email %>'>
</td>
</tr>
<tr>
<td>Сообщение:</td>
<td><textarea cols=25 rows=8 name='mesBody' maxlength='20' size=23 wrap="virtual" ><%=mesBody%></textarea>
</td>
</tr>
<tr>
<td colspan=2 align="center">
<input type="submit" value="Update">
</td>
</tr>
</form>
</table>
</body>
</html>
<% End Select %>
Отправка сообщения (файл Post.asp)
На этом этапе нам надлежит сформировать формы посылки сообщения от имени модератора. Единственным отличием от обычной формы посылки сообщения здесь является то, что вместо имени пользователя в соответствующее поле формы отправки по умолчанию будет загружено значение «Модератор». Далее, как и в обычном случае, нам потребуется реализовать проверку корректности заполнения формы, обработку введенных значений и механизм добавления новых сообщений в соответствующую таблицу базы данных.
Извлечем идентификатор текущего форума, сообщения и его уровня вложенности, а затем опросим действия пользователя. Данные, введенные пользователем в качестве тела сообщения, а также его заголовка (темы) и имени пользователя, обработаем с использованием серверного метода Server.HtmlEncode: mesbody = Server.HtmlEncode(mesbody), после чего можем добавлять новую запись в таблицу:
<!--#include file="common-admin.asp"-->
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
<!--Metadata type="typelib" File="c:\program files\common files\system\ado\msado15.dll" -->
</SCRIPT>
<%
dim useraction,fid,action,id,tid,mailme
dim mesbody,name,subject
dim sql_maxid,rs_maxid,maxid
fid = request("fid")
id = request("id")
tid = request("tid")
If CInt(session("status")) <> CInt(fid) OR session("status")="" Then
Response.Redirect "error.htm"
End If
If id="" Then
action="post.asp?action=save"
Else
action="post.asp?action=replay"
End If
userAction = request("action")
Select Case userAction
Case "save"
call connect()
sql="select * from MessagesTable"
RS.Open sql, Conn, 3, adLockOptimistic
mesbody=request.form("message")
name=request.form("name")
name = "**" & name & "**"
subject=request.form("subject")
mailme=request.form("mailme")
rs.addnew
rs("name")=name
rs("subject")=subject
rs("email")=request.form("email")
rs("mesdate")=now()
rs("mesbody")=mesbody
rs("thread_parent")=0
rs("thread_id")=0
rs("forumID")=request.form("fid")
rs("isChecked")=mailme
rs.update
call close()
response.redirect "../list.asp?fid="&fid
End Select
dim requireFldSign
requireFldSign = "<font color='red'>*</font>"
response.write "<HTML><HEAD><link rel='stylesheet' href='style.css'>"
%>
<script language="javascript">
function submitit()
{
var name = document.myform.name.value;
var subject = document.myform.subject.value;
var email = document.myform.email.value;
if (name == "") {
alert("Введите Ваше имя.")
document.myform.name.focus()
return false
}
if (subject == "") {
alert("Введите тему")
document.myform.subject.focus()
return false
}
if (email!="") {
if (email.indexOf('@', 0) == -1 || email.indexOf('.', 0) == -1) {
alert("Некорректный формат электронного адреса");
document.myform.email.focus()
return false
}
}
}
</script>
<%
response.write "<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>"
response.write "<TITLE></TITLE></HEAD><body>"
response.write "<b>Послать сообщение как модератор форума</b><br><br>"
response.write "<table border=0 width=600 cellpadding=0 cellspacing=0>"
response.write "<tr><td width=100></tr></td>"
response.write "<form name='myform' action='" &action & "' method='post' onsubmit='return submitit()'>"
response.write "<input type=hidden name='fid' value='"&fid&"'>"
response.write "<input type=hidden name='id' value='"&id&"'>"
response.write "<input type=hidden name='tid' value='"&tid&"'>"
response.write "<tr><td width=100>"
response.write requireFldSign & "Имя:</td><td><input type='text' name='name' maxlength='20' size=23 value='Модератор'></tr></td>"
response.write "<tr><td>"
response.write "E-mail:</td><td><input type='text' name='email' maxlength='28' size=23></tr></td>"
response.write "<tr><td>"
response.write requireFldSign & "Тема:</td><td><input type='text' name='subject' maxlength='25' size=23></tr></td>"
response.write "<tr><td valign=top>"
response.write "Сообщение:</td><td><textarea cols=25 rows=8 name='message' maxlength='20' size=23 wrap='virtual'></textarea></tr></td>"
response.write "<tr><td colspan=2><br>"
response.write "<input type='checkbox' name='mailme' value='1'>"
response.write "Отправить электронное уведомление об ответах</tr></td>"
response.write "<tr><td colspan=2><br>"
response.write "<input type='submit' name='submit' value='Отправить сообщение'> "
response.write "<input type='reset' name='reset' value='Сброс'>"
response.write "</form>"
response.write "</tr></td></table></body></html>"
response.write "<table border=0 width=600 cellpadding=0 cellspacing=0><tr><td>"
Call Footer()
Response.Write "</tr></td></table>"
%>
По своей сути эта страничка очень похожа на аналогичную страничку посылки сообщения, рассмотренную нами выше.
Заключение
Наконец, нам осталось разместить все исходники наших страниц в папке с именем Administration, и тогда наша форум-система будет окончательно готова к использованию.
КомпьютерПресс 6'2001








