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 "&nbsp;<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='Отправить сообщение'>&nbsp;&nbsp;"  
 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

Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует