[POR
PABLO FAHNLE (Webmaster de solotuweb.com)]
Aquí tienes
un foro listo para usar en tu web, es una versión reducida de los foros
de SoloTuWeb, hecho completamente por nosotros...
Bueno, primero te invito a que creemos las bases de datos, necesitamos una FOROS,
donde se almacenan todos los foros disponibles, otra mensajes, donde se almacenan
todos los mensajes, y otra respuestas, y adivinaste, donde se almacenan todas
las respuestas... Tendremos que hacer algo así:
Figura 1: diseño de la tabla FOROS
Figura 2: diseño de la tabla Mensajes
Figura 3: diseño de la tabla Respuestas
Pero ¿cómo funciona esto?, muy fácil, cada vez que el usuario
quiere elegir un foro, se listan los foros en la tabla foros, y cuando se elige
uno de ello se listan todos los mensajes que tengan en su campo ForoPadre el
ID del foro, cuando se quiere ver un mensaje, se muestra el mensaje, y todas
las respuestas que tengan como MensajePadre el ID del mensaje..
¿Fácil no?, pero para que sea aún más fácil,
comentamos todas las líneas en ASP diciéndote lo que hacían
una por una...
Además de ver los códigos aquí, puedes descargar los foros
a tu PC..
<FOROS.ASP>
<%
'CONEXION CON LA BASE DE DATOS (Pueden ver detalladamente
como hacerlo en ASP>>Trucos)
Dim cnn
Dim str
Dim rs
Dim SQL
DBName = "driver={Microsoft Access Driver (*.mdb)};dbq=C:\Inetpub\wwwroot\foros\foro.mdb"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open DBName
Set rs = CreateObject("ADODB.Recordset")
rs.ActiveConnection = cnn
'Funcion Sacartag:
'a esta función la utilizamos así:
'Sacartag(valor), esta función sirve para sacar un tag, por ejemplo,
<b>Hola<b>, si mostramos esto, en vez de verse como los estas viendo
tu, se vería en negrita, esta función es para que ignore el comando,
ya que convierte los caracteres < y > de modo tal que lo pueda mostrar
en la página...
Function Sacartag(bloque)
str = Server.HTMLEncode(bloque)
str = Replace(str, vbCrLf, "<BR>" & vbCrLf, 1, -1, 1)
Sacartag = str
End Function
%>
<html>
<head>
<title>Foros</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body
bgcolor="#FFFFFF" text="#000000">
<div align="center"><font face="Verdana, Arial, Helvetica,
sans-serif" size="6"><i><b><font color="#003300">Foros
>></font></b></i></font></div>
<div align="center"><br>
<font face="Verdana, Arial, Helvetica, sans-serif" size="2">
<%if request.querystring("verforo") <> "" then
' Si recibió en parámetro verforo, es decir
si es foro.asp?verforo=algo que entonces haga:
dim foro
foro = request.querystring("verforo") 'le asignamos
el valor a una variable para que nos sea más cómodo trabajar
SQL = "Select IDMensaje, Titulo, Respuestas, Autor, ForoPadre, Fecha from
Mensajes where ForoPadre = " & foro' Armamos
la cadena SQL, de modo tal que tome los campos necesarios para mostrar todos
los mensajes que hay que pertenezcan a el foro que tenemos identificado en la
variable foro
rs.open SQL 'ejecutamos la cadena SQL
%>
<br>
</font>
<table width="568" border="0" cellpadding=" ">
<tr>
<td width="114" bgcolor="#999999" height="9">
<div align="center"><b><font size="2" face="Verdana"
color=#FFFFFF>Autor</font></b></div>
</td>
<td width="287" bgcolor="#999999" height="9">
<div align="center"><b><font face="Verdana"
size="2" color="#FFFFFF">Titulo</font></b></div>
</td>
<td width="90" bgcolor="#999999" height="9">
<div align="center"><b><font size="2" face="Verdana"
color=#FFFFFF>Respuestas</font></b></div>
</td>
<td width="67" bgcolor="#999999" height="9">
<div align="center"><b><font face="Verdana"
size="2" color="#FFFFFF">Fecha</font></b></div>
</td>
</tr>
<%
if not rs.eof then 'si el recordset no está vacío,
es decir, si encontró mensajes
while not rs.eof' que haga esto hasta que termine de mostrar
todos los mensajes%>
<tr>
<td width="114" bgcolor="#F0F0F0"><font size="2"
face="Verdana"><%=Sacartag(rs("Autor"))%></font></td>
<td width="287" bgcolor="#F0F0F0"><font size="2"
face="Verdana"><a href="vermensaje.asp?id=<%=rs("IDMensaje")%>"><%=Sacartag(rs("Titulo"))%></a></font></td>
<td width="90" bgcolor="#F0F0F0">
<div align="center"><font size="2" face="Verdana"><%=Sacartag(rs("Respuestas"))%></font></div>
</td>
<td width="67" bgcolor="#F0F0F0"><font size="2"
face="Verdana"><%=Sacartag(rs("Fecha"))%></font></td>
</tr>
<%rs.movenext' ir al próximo mensaje
wend 'termina el while, es decir, vuelve a comprobar la
condición del while que es rs.eof, si tien mensajes, los sigue mostrando,
sino, continua
else' sino (acuerdense de que responde al if donde preguntabamos
si había encontrado algún mensaje). Si no tiene mensajes, hará
lo sgte%>
<tr>
<td colspan="4" height="5">
<div align="center"><font face="Verdana, Arial, Helvetica,
sans-serif" size="2">No
hay mensajes en este foro</font></div>
</td>
</tr>
<%end if' finaliza el if%>
</table>
<font face="Verdana, Arial, Helvetica, sans-serif" size="2"><a
href="escribir.asp?id=<%=foro%>"><br>
Escribe un mensaje en este foro!</a><br>
<br>
<br>
<br>
<%
rs.close' cierra el objeto recodset
end if' termina el if, dónde la condición
era si recibiamos el parametro verforo%>
Elige un foro<br>
<%
'ahora tenemos que mostrar los foros
SQL = "Select * from foros" ' selecciona todos
los campos y todos los registros de los foros
rs.open SQL' abre el recodset
%>
<br>
<%while not rs.eof' mientras que no se acaben los foros
para mostrar, hagamos esto%>
<table>
<tr>
<td bgcolor=#444444>
<table width="425" border="0" cellpadding=" "
bgcolor=#FFFFFF>
<tr>
<td width="343" bgcolor="#F0F0F0"><a href="foro.asp?verforo=<%=rs("IDForo")%>"><%=rs("Nombre")%></a></td>
<td width="36" bgcolor="#F0F0F0"><%=rs("Mensajes")%></td>
</tr>
<tr bgcolor="#F0F0F0">
<td colspan="3"><font size="2"><i><%=rs("Descripcion")%></i></font></td>
</tr>
</table>
</td>
</tr>
</table>
<br>
<%rs.movenext' mueve al sgte registro (el próximo
foro)
wend' vuelve a comprobar la condición del while
%>
</font></div>
</body>
</html>
Bueno, en esta página hemos mostrado como mostrar
todos los foros y sus mensajes, usando los parámetros
<VERMENSAJE.ASP>
<%
'CONEXION CON LA BASE DE DATOS
Dim cnn
Dim str
Dim rs
Dim SQL
DBName = "driver={Microsoft Access Driver (*.mdb)};dbq=C:\Inetpub\wwwroot\foros\foro.mdb"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open DBName
Set rs = CreateObject("ADODB.Recordset")
rs.ActiveConnection = cnn
'Funcion Sacartag:
'a esta función la utilizamos así:
'Sacartag(valor), esta función sirve para sacar un tag, por ejemplo,
<b>Hola<b>, si mostramos esto, en vez de verse como los estas viendo
tu, se vería en negrita, esta función es para que ignore el comando,
ya que convierte los caracteres < y > de modo tal que lo pueda mostrar
en la página...
Function Sacartag(bloque)
str = Server.HTMLEncode(bloque)
str = Replace(str, vbCrLf, "<BR>" & vbCrLf, 1, -1, 1)
Sacartag = str
End Function
%>
<html>
<head>
<title>Ver mensaje</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body
bgcolor="#FFFFFF" text="#000000">
<div align="center"><font size="6"><i>Ver
mensaje<br><%
' acá recibimos un parámetro request.querystring("id")
que nos muestra el ID del mensaje que queremos mostrar
SQL = "Select * from Mensajes where IDMensaje = " & request.querystring("id")'
seleccionamos todos los campos del registro que tenga como campo ID = a request.querystring("id")
rs.open SQL' abrimos el recordset
dim forop
forop = rs("ForoPadre")' guardamos el ID del
foro al que pertenece, para después dar la posibilidad de volver a ese
foro
%> </i></font></div>
<div align="center"><br>
<table><tr><td bgcolor=#444444><table width="462"
border="0" cellpadding=" " bgcolor=#FFFFFF>
<tr>
<td bgcolor="#f9f9f9"><font face="Verdana, Arial, Helvetica,
sans-serif" size="2">Autor:
<%=Sacartag(rs("Autor"))%> <%if rs("AutorEmail")
<> "" then' si el autor puso su email,
entonces mostrarlo%> (<a href="mailto:<%=rs("AutorEmail")%>"><%=Sacartag(rs("AutorEmail"))%></a>)<%end
if%></font></td>
</tr>
<tr>
<td bgcolor="#f9f9f9">
<div align="center"><font face="Verdana, Arial, Helvetica,
sans-serif" size="2"><b><%=rs("Titulo")%>
- <%=rs("Fecha")%></b></font></div>
</td>
</tr>
<tr>
<td bgcolor="#f9f9f9"><font face="Verdana, Arial, Helvetica,
sans-serif" size="2"><i><%=rs("Mensaje")%></i></font></td>
</tr>
</table></td></tr></table><%rs.close'
cierra el recordset%>
<br>
<font size="4"><b><i>Respuestas a este mensaje:<br>
</i></b></font>
<div align="center"><font size="6"><i>
<%
SQL = "Select * from Respuestas where MensajePadre = " & request.querystring("id")'
seleccionar todos los campos del registro que tenga como valor en el campo MensajePadre,
request.querystring("id"), que es el ID del mensaje que se está
mostrando
rs.open SQL' abrimos el recordset
if not rs.eof then' si no está vacío, es
decir, si encontró alguna respuesta para el mensaje
%>
</i></font></div>
<div align="center">
<%while not rs.eof' hasta que no termine de pasar todos
las respuestas%>
<br>
<table>
<tr>
<td bgcolor=#444444>
<table width="462" border="0" cellpadding=" "
bgcolor=#FFFFFF>
<tr>
<td bgcolor="#f9f9f9"><font face="Verdana, Arial, Helvetica,
sans-serif" size="2">Autor:
<%=Sacartag(rs("Autor"))%>
<%if rs("AutorEmail") <> "" then%>
(<a href="mailto:<%=rs("AutorEmail")%>"><%=Sacartag(rs("AutorEmail"))%></a>)
<%end if%>
- <%=rs("Fecha")%></font></td>
</tr>
<tr>
<td bgcolor="#f9f9f9"><font face="Verdana, Arial, Helvetica,
sans-serif" size="2"><i><%=rs("Mensaje")%></i></font></td>
</tr>
</table>
</td>
</tr>
</table><%rs.movenext' que pase a la próxima
respuesta
wend' que se fije en la condición del while, que
si quedan respuestas por mostrar, que lo haga, pero sino, que siga adelante
%>
</div>
</div>
<%else'
sino (sino encontró ninguna respuesta)%>
<div align="center"><i><font face="Verdana, Arial,
Helvetica, sans-serif" size="3">
No hay ninguna respuesta a este mensaje, se el primero en responderla</font></i>
<%end if' termina el if
rs.close' cerramos el recordset%>
<br>
<br>
</div>
<div align="right"><a href="foro.asp?verforo=<%=forop%>"><i><font
size="4">Volver
al foro</font></i></a><br>
<br>
<i> <font face="Verdana, Arial, Helvetica, sans-serif" size="4">
<center>
Responde a este mensaje:<br>
</center>
</font></i> </div>
<form name="" method="post" action="guardarr.asp">
<div align="center"><i><font face="Verdana, Arial,
Helvetica, sans-serif" size="4"><br>
</font></i>
<table>
<tr>
<td bgcolor=#444444>
<table width="462" border="0" cellpadding=" "
bgcolor=#FFFFFF>
<tr>
<td bgcolor="#f9f9f9"><font size="2" face="Verdana,
Arial, Helvetica, sans-serif">Tu
nombre:
<input type="text" name="Nombre">
</font></td>
</tr>
<tr>
<td bgcolor="#f9f9f9"><font face="Verdana, Arial, Helvetica,
sans-serif" size="2">Tu
E-Mail:
<input type="text" name="Email">
(opcional)
<input type="hidden" name="Mensajep" value="<%=request.querystring("id")%>">
</font></td>
</tr>
<tr>
<td bgcolor="#f9f9f9">
<div align="center"><font face="Verdana, Arial, Helvetica,
sans-serif" size="2">Mensaje:<br>
<textarea name="Mensaje" cols="50" rows="5"></textarea>
</font></div>
</td>
</tr>
<tr>
<td bgcolor="#f9f9f9">
<div align="center">
<input type="submit" name="Submit" value="Responder!">
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</form>
<div align="center"><i><font face="Verdana, Arial,
Helvetica, sans-serif" size="4">
</font></i></div>
</body>
</html>
Bueno, ahora te
mostramos escribir.asp, que no tiene ningún código en ASP, porque
es sólo un formulario hecho en HTML...
<ESCRIBIR.ASP>
<html>
<head>
<title>Escribir mensaje</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body
bgcolor="#FFFFFF" text="#000000">
<div align="center"><font face="Verdana, Arial, Helvetica,
sans-serif" size="4"><i>Escribir
Mensaje</i></font><br>
<form name="form1" method="post" action="guardar.asp">
<table>
<tr>
<td bgcolor=#444444>
<table width="462" border="0" cellpadding=" "
bgcolor=#FFFFFF>
<tr>
<td bgcolor="#f9f9f9"><font size="2" face="Verdana,
Arial, Helvetica, sans-serif">Tu
nombre:
<input type="text" name="Nombre">
</font></td>
</tr>
<tr>
<td bgcolor="#f9f9f9"><font face="Verdana, Arial, Helvetica,
sans-serif" size="2">Tu
E-Mail:
<input type="text" name="Email">
(opcional) </font></td>
</tr>
<tr>
<td bgcolor="#f9f9f9"><font size="2" face="Verdana,
Arial, Helvetica, sans-serif">Asunto:
<input type="text" name="Title">
<input type="hidden" name="ForoPadre" value="<%=request.querystring("id")%>">
</font></td>
</tr>
<tr>
<td bgcolor="#f9f9f9">
<div align="center"><font face="Verdana, Arial, Helvetica,
sans-serif" size="2">Mensaje:<br>
<textarea name="Mensaje" cols="50" rows="5"></textarea>
</font></div>
</td>
</tr>
<tr>
<td bgcolor="#f9f9f9">
<div align="center">
<input type="submit" name="Submit" value="Responder!">
</div>
</td>
</tr>
</table>
</td>
</tr>
</table> </form>
</div>
</body>
</html>
Como ven, es un
simple formulario de envío de datos, pero ahora veamos en guardar.asp,
como guarda los datos que fueron escritos en este formulario ..
<GUARDAR.ASP>
<%
'CONEXION CON LA BASE DE DATOS
Dim cnn
Dim str
Dim rs
Dim SQL
DBName = "driver={Microsoft Access Driver (*.mdb)};dbq=C:\Inetpub\wwwroot\foros\foro.mdb"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open DBName
Set rs = CreateObject("ADODB.Recordset")
rs.ActiveConnection = cnn
%><html>
<head>
<title>Guardar mensaje</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body
bgcolor="#FFFFFF" text="#000000">
<div align="center"> <i><font face="Verdana, Arial,
Helvetica, sans-serif" size="3">
<%if request.form("Nombre") <> "" and request.form("Title")
<> "" and request.form("Mensaje") <> ""
then' si recibe todos estos valores
SQL = "Select * from Mensajes"' carga la tabla
mensajes
rs.open SQL, cnn, 2, 2' abrimos el recordset, pero le
añadimos el cnn, 2, 2 porque con esto nos estamos dando permiso para
modificar la base de datos
rs.addnew' agregamos un nuevo registro
rs.fields("Autor") = request.form("Nombre")'
que el nuevo registro en su campo autor tenga el valor que se recibió
como autor
rs.fields("Titulo") = request.form("Title")'
idem para titulo
rs.fields("Mensaje") = request.form("Mensaje")'idem
para el cuerpo del mensaje
if request.form("Email") <> "" then rs.fields("AutorEmail")
= request.form("Email")' si se recibió
el valor con el email del autor, entonces que al nuevo registro le ponga la
dirección de email
rs.fields("Fecha") = day(date) & "/" & month(date)
& "/" & year(date)' que en campo fecha
le ponga el dia de la fecha, seguido de /, más el mes, otro /, y el año
rs.fields("ForoPadre") = request.form("ForoPadre")'
que le ponga el ID del foro al que pertenece
rs.fields("Respuestas") = 0' respuestas = 0
rs.update' que actualiza la base de datos
rs.close' que cierre el registro
'bueno, ahora tenemos que sumar uno al valor del campo
del foro que tiene el numero de mensajes
SQL = "Select IDForo, Mensajes from foros where IDForo =" & request.form("ForoPadre")'
que seleccione el foro que tenga como id el foro padre, este id lo obtenemos
por un objeto formulario que tenemos en la página para escribir mensaje
rs.open SQL, cnn, 2, 2' abrimos el recordset, usamos cnn,
2, 2 para poder modificarlo
rs.fields("Mensajes") = rs.fields("Mensajes") + 1'
sumamos uno
rs.update' actualizamos
rs.close' cerramos el recordset
%>
Tu mensaje ha sido guardado<br>
<br>
Gracias por confiar en nosotros<br>
<%else' sino se han recibido los valores necesarios
para fuardar el mensaje%>
No se recibió la totalidad de información requerida
<%end if' termina el if%>
</font></i><font face="Verdana, Arial, Helvetica, sans-serif"
size="3"><br>
<br>
<a href="foro.asp">Volver al foro</a></font></div>
</body>
</html>
Bien, veremos como
guardar una respuesta, donde el formulario estaba en vermensaje.asp, si prefieres
tener una página dedicada al formulario de respuesta lo puedes hacer,
yo lo incluyo allí para que el visitante sienta ganas de responderlo,
aparte es más sencillo... Bueno, veamos como guardar la respuesta...
<GUARDARR.ASP>
<%
'CONEXION CON LA BASE DE DATOS
Dim cnn
Dim str
Dim rs
Dim SQL
DBName = "driver={Microsoft Access Driver (*.mdb)};dbq=C:\Inetpub\wwwroot\foros\foro.mdb"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open DBName
Set rs = CreateObject("ADODB.Recordset")
rs.ActiveConnection = cnn
%><html>
<head>
<title>Guardar mensaje</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body
bgcolor="#FFFFFF" text="#000000">
<div align="center"> <i><font face="Verdana, Arial,
Helvetica, sans-serif" size="3">
<%if request.form("Nombre") <> "" and request.form("Mensaje")
<> "" then' si se recibe todo lo necesario
para guardar el mensaje
SQL = "Select * from Respuestas"' cargar respuestas
rs.open SQL, cnn, 2, 2' abrir el recorset con cnn, 2,
2 para poder modificarlo
rs.addnew' agregamos un nuevo registro
rs.fields("MensajePadre") = request.form("Mensajep")'
que en el nuevo registro, en el campo MensajePadre, poner el valor correspondiente,
el valor recibido
rs.fields("Autor") = request.form("Nombre")'
idem para nombre
rs.fields("Mensaje") = request.form("Mensaje")'
idem para mensaje
if request.form("Email") <> "" then rs.fields("AutorEmail")
= request.form("Email")' si se recibió
el valor con el email del autor, entonces que al nuevo registro le ponga la
dirección de email
rs.fields("Fecha") = day(date) & "/" & month(date)
& "/" & year(date)' que en campo fecha
le ponga el dia de la fecha, seguido de /, más el mes, otro /, y el año
rs.update'actualizamos
rs.close'cerramos el recordset
'ahora tenemos que incrementar el numero de respuestas
del mensaje padre
SQL = "Select IDMensaje, Respuestas from Mensajes where IDMensaje ="
& request.form("Mensajep")' seleccionar
los mensajes que tengan como id request.form("Mensajep"), que es un
objeto hidden en la página donde se escribe la respuesta que contiene
el id del mensaje al que le estamos dando una respusta.
rs.open SQL, cnn, 2, 2' abrimos el registro con cnn, 2,
2 para modificarlo
rs.fields("Respuestas") = rs.fields("Respuestas") + 1'
incrementamos las respuestas
rs.update'actualizamos
rs.close' cerramos el recordset
%>
Tu mensaje ha sido guardado<br>
<br>
Gracias por confiar en nosotros<br>
<%else' sino se recibió toda la información%>
No se recibió la totalidad de información requerida
<%end if' termina el if%>
</font></i><font face="Verdana, Arial, Helvetica, sans-serif"
size="3"><br>
<br>
<a href="foro.asp">Volver al foro</a></font></div>
</body>
</html>
Bueno, ahora se
pueden bajar el .zip para probarlo ustedes mismos, pero antes:
Para instalarlos en tu PC, copia todos los archivos a C:\inetpub\wwwroot\foros
Si quieres ponerlo en cualquier otra carpeta, deberás modificar las conexiones
a la base de datos, es muy simple, sólo modifica la siguiente línea
en los archivos
foro.asp, guardar.asp, guardarr.asp y vermensaje.asp:
DBName = "driver={Microsoft Access Driver (*.mdb)};dbq=C:\Inetpub\wwwroot\foros\foro.mdb"
lo que deberás cambiar es C:\Inetpub\wwwroot\foros\foro.mdb por el camino
que tenga la
base de datos..
Bueno, eso fué todo..
Hasta la próxima
Pablo Fahnle
Este código está disponible en formato ZIP para que lo descargues a tu PC
<< Volver
|