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