epelpad

El post que buscas se encuentra eliminado, pero este también te puede interesar

Tuto Como Hacer Un Foro

Base de datos MYSQL - Estructura
Aqui esta la estructura propuesta:

CREATE TABLE `foro` (
`id` int(7) NOT NULL auto_increment,
`autor` varchar(200) NOT NULL default '',
`titulo` varchar(200) NOT NULL default '',
`mensaje` text NOT NULL,
`fecha` datetime NOT NULL default '0000-00-00 00:00:00',
`respuestas` int(11) NOT NULL default '0',
`identificador` int(7) NOT NULL default '0',
`ult_respuesta` datetime default NULL,
KEY `id` (`id`)
) TYPE=MyISAM;

Como notan tiene los siguientes campos:
id = Identificador principal, sirve para diferenciar mensajes.
autor = Autor del mensaje.
titulo = El titulo del mensaje.
fecha = Un date time que sirve para identificar a la hora que se hizo.
respuestas = Si este mensaje es el principal de un tema aqui se acumulará el número de respuestas.
identificador = Aqui se guarda el id de la respuesta de un tema, si este mensaje es el primero del tema valdrá 0.
ult_respuesta = Si este mensaje inicia el tema entonces aqui se actualizará valor de acuerdo
con la fecha de la última respuesta que haya recibido. Sirve para poder
mantener un orden en los foros.

Ahora para subir la estructura propuesta en la base de datos, la guardas en un archivo SQL y la subes en el phpmyadmin en la sección "Importar".

Conexión a la base de datos
Acá abajo les mostrare el script de conexión a la base de datos, lo debén guardar como "configuracion.php:

<?php
$bd_host = "server o host donde se encuentra la db";
$bd_usuario = "usuario";
$bd_password = "contraseña";
$bd_base = "nuestra bd";

$con = mysql_connect($bd_host, $bd_usuario, $bd_password);
mysql_select_db($bd_base, $con);
?>

No hay mucha ciencia que digamos en este script e incluso pueden utilizar otro pero les recomiendo este.

Los Temas, Templates, Plantillas, Layouts o como quieran llamarles.

Lo que haremos en este caso es utilizar archivos .html que dentro contendrán solo diseño ( Código HTML ) y en los lugares enlos que deseemos colocar contenido "dinámico", utilizaremos el formato simple
para mostrar el contenido de variables, esto es : <?=$variable?>.

Para "interpretar" un template, primero lo leemos en memoria utilizando la función file() y luego utilizaremos una
simple función a la que le pasaremos como parámetro el template y las variables que hay que reemplazar.

ejemplo.html:

Nombre: <b><?=$nombre?></b><br>
Edad : <b><?=$edad?></b><br>
Domicilio : <?=$domicilio?>
<hr>

ejemplo.php

<?php
function mostrarTemplate($tema, $variables)
{
//var_dump($variables);
extract($variables);
eval("?>".$tema."<?";
}

$agenda = array(
"0" => array("nombre"=>"Marcelo", "edad"=>"25", "domicilio"=>"Veracruz 342",
"1" => array("nombre"=>"Alejandra", "edad"=>"18", "domicilio"=>"Los Olmos 67",
"2" => array("nombre"=>"Micaela", "edad"=>"23", "domicilio"=>"Prof. Mariño 8"
);
$tpl = implode("", file("ejemplo.html";
foreach($agenda as $registro)
{
mostrarTemplate($tpl, $registro);
}
?>

Aquí vemos como, partiendo de los datos que tenemos en
un array, los mostramos basándonos en un simple template. La función mostrarTemplate toma como parámetros el contenido del template y un array asociativo con los
valores a reemplazar. La función de PHP extract() se encarga de pasar estos valores al ámbito en el que se llama la función, en
este caso, el ámbito de la función. Por lo que si tenemos un arreglo del tipo $a = array("clave" => "valor", al ejecutar extract($a), entonces pasaremos a tener
una variable disponible, de nombre $variable y con "valor" como contenido. Luego, la función eval() se encarga del resto, o sea, de ejecutar todo el código (el del Template) que
se le pasa como parámetro.

Página Principal
Ya teniendo la base de datos y saber como funciona nuestro sistema de templates podemos ir creando la pagina donde se mostraran los temas y foros.

index.php:

<?php
require('configuracion.php');
require('funciones.php');
include('header.html');
/* Pedimos todos los temas iniciales (identificador==0)
* y los ordenamos por ult_respuesta */
$sql = "SELECT id, autor, titulo, fecha, respuestas, ult_respuesta ";
$sql.= "FROM foro WHERE identificador=0 ORDER BY ult_respuesta DESC";
$rs = mysql_query($sql, $con);
if(mysql_num_rows($rs)>0)
{
// Leemos el contenido de la plantilla de temas
$template = implode("", file("temas.html";
include('titulos.html');
while($row = mysql_fetch_assoc($rs))
{
$color=($color==""?"#5b69a6":"";
$row["color"] = $color;
mostrarTemplate($template, $row);
}
}
include('footer.html');
?>

Ahora viene la explicación del script:

El primero requiere al archivo "configuracion.php" para conectar con la base de datos.
El segundo requiere un archivo que aún no hemos creado que contendrá funciones importantes del foro.
El tercero incluye al header que será un archivo donde colocarás el logo y links importantes para tu foro.

La funcion de;
$sql = "SELECT id, autor, titulo, fecha, respuestas, ult_respuesta ";
$sql.= "FROM foro WHERE identificador=0 ORDER BY ult_respuesta DESC";
$rs = mysql_query($sql, $con);
if(mysql_num_rows($rs)>0)
{

Ejecuta un jquery en la base de datos que traera todos los temas principales o tambien llamados iniciadores que mostrará los mensajes que tengan el identificador con 0.
Los comentarios a los temas tendrán el identificador con valor de 1 hacia arriba en el orden que vayan publicandose, y el hecho de que tengan el identificador con un valor es para diferenciarlos de los temas principales.
A estos comentarios, le pedimos a nuestra base de datos que los ordene por la ultima fecha de respuesta de manera descendente.
Tendremos los mensajes mas recientes primero pero a los que no les guste esto y quieren que sea como los foros normales nada mas modifiquen:

$sql.= "FROM foro WHERE identificador=0 ORDER BY ult_respuesta DESC";
por: $sql.= "FROM foro WHERE identificador=0 ORDER BY ult_respuesta ASC";

También realizamos una decisión, solo mostraremos los temas de nuestro Foro si la cantidad de filas recuperadas desde la base, son mayores a 0.

Dentro del while principal mostramos los temas

// Leemos el contenido de la plantilla de temas
$template = implode("", file("temas.html";
include('titulos.html');
while($row = mysql_fetch_assoc($rs))
{
$color=($color==""?"#5b69a6":"";
$row["color"] = $color;
mostrarTemplate($template, $row);
}

Aqui trabajamos por primera vez con los templates, temas, plantillas, layouts o como quieran llamarle.
Primero leemos el contenido del template en memoria y lo guardamos dentro de la variable $template.
También incluimos un archivo, que contiene una fila de la tabla de Temas, con los títulos de las celdas.

Y al final solo incluimos el footer para mostrar copyrights, links a contacto, etc.

Formularios de Publicación de un tema y de respuestas

Abajo utilizaremos el mismo formulario para publicar un tema y para enviar una respuesta, esto lo lograremos pasando una variable por el URL, señalando que estamos citando un emnsaje anterior, sacando de la base de datos el mensaje que citaremos, y completando el formularo con esos datos.
Si la variable no está presente, entonces no hacemos nada y mostramos el formulario.

respuesta.php:

<?php
require('funciones.php');
$id = $_GET["id"];
$citar = $_GET["citar"];
$row = array("id" => $id);
if($citar==1)
{
require('configuracion.php');
$sql = "SELECT titulo, mensaje, identificador AS id ";
$sql.= "FROM foro WHERE id='$id'";
$rs = mysql_query($sql, $con);
if(mysql_num_rows($rs)==1) $row = mysql_fetch_assoc($rs);
$row["titulo"] = "Re: ".$row["titulo"];
$row["mensaje"] = "".$row["mensaje"]."[/citar]";
if($row["id"]==0) $row["id"]=$id;
}
$template = implode("", file('formulario.html'));
include('header.html');
mostrarTemplate($template, $row);
include('footer.html');
?>

En el script vemos como primero capturamos de la URL, las variables $id y $citar, y si ésta última es igual a 1, entonces consultamos en la base de datos toda la información del tema que estamos citando, para agregarlo en el arreglo $row, que luego será pasado al template. Noten como al titulo del mensaje, le anteponemos la cadena "Re:", indicando que es una respuesta, y como al cuerpo del mensaje, si estamos citando, lo rodeamos por un tag y [/citar]. Esto lo veremos más adelante.

formulario.html:


<table width="90%" border="0" cellspacing="2" cellpadding="2">
<form name="f" action="agregar.php" method="post">
<input type="hidden" name="identificador" value="<?=$id?>">
<tr>
<td width="30%" align="right">Autor </td>
<td><input type="text" name="autor"></td>
</tr>
<tr>
<td width="30%" align="right">Titulo</td>
<td><input type="text" name="titulo" value="<?=$titulo?>"></td>
</tr>
<tr>
<td width="30%" align="right">Mensaje</td>
<td><textarea name="mensaje" cols="50" rows="5"><?=$mensaje?></textarea></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="Submit" value="Enviar Mensaje"></td>
</tr>
</form>
</table>

Aquí vemos como colocamos las variables dentro de los atributos "value" de los inputs y el textarea. También podemos ver como tenemos un campo escondido, llamado "identificador", que solo tendrá un valor asignado, cuando estemos respondiendo a un mensaje, pero que no existirá cuando sea un mensaje nuevo. Solo queda ver el script que se encarga de grabar el mensaje en la base de datos, agregar.php.

agregar.php:

<?php
require('configuracion.php');
$autor = $_POST["autor"];
$titulo = $_POST["titulo"];
$mensaje = $_POST["mensaje"];
$ident = $_POST["identificador"];

//Hacemos algunas validaciones
if(empty($autor)) $autor = "Anónimo";
if(empty($titulo)) $titulo = "Sin título";
//Evitamos que el usuario ingrese HTML
$mensaje = htmlentities($mensaje);

// Grabamos el mensaje en la base.
$sql = "INSERT INTO foro (autor, titulo, mensaje, identificador, fecha, ult_respuesta) ";
$sql.= "VALUES ('$autor','$titulo','$mensaje','$ident',NOW(),NOW())";
$rs = mysql_query($sql, $con) or die("Error al grabar un mensaje: ".mysql_error);
$ult_id = mysql_insert_id($con);

/* si es un mensaje en respuesta a otro
actualizamos los datos */
if(!empty($ident))
{
$sql = "UPDATE foro SET respuestas=respuestas+1, ult_respuesta=NOW()";
$sql.= " WHERE id = '$ident'";
$rs = mysql_query($sql, $con);
Header("Location: foro.php?id=$ident#$ult_id";
exit();
}
Header("Location: index.php";
?>

En este script, luego de tomar las variables desde el
formulario (con el método POST), primero verificamos que exista un nombre de
autor y el título del mensaje, caso contrario le asignamos un valor por defecto.
También utilizamos la función de PHP htmlentities() para convertir todos los caracteres especiales ( >, <, ", &, etc )
en sus respectivas entidades HTML ( &gt;, &lt;, &quote;, &amp.
Con esto evitamos que un usuario ingrese código HTML en nuestro Foro (con la
respectiva vulnerabilidad que este implica).

A continuación, grabamos el mensaje en la base, y obtenemos, mediante la función mysql_insert_id(), el último id autoincremental que le corresponde a este registro. ¿Para qué? Simple. Si este mensaje que acabamos de grabar es el primero del tema, no necesitamos hacer nada, pero si es un mensaje en respuesta a otro ( esto lo averiguamos preguntando por el valor de $identificador), entonces tenemos que actualizar ese primer mensaje, indicando que tiene una respuesta más, y cambiando la fecha y hora del último mensaje. De esa manera, nos aseguramos que tenemos bien ordenado el foro, con los temas con nuevos mensajes primero. Finalmente, dependiendo del caso, redirigimos al usuario al home del foro, o a la respuesta que acaba de ingresar.

Mostrar Tema

Ya casi tendrán su foro hecho por sus manos, ya que este es el ultimo paso.
Crearemos la pagina que mostrara el tema y las respuestas a el, para ello vemos como en el index llamamos a un script llamado "foro.php" y el pasamos el id del etam que queremos ver.
Luego solo obtenemos de la base el o los temas en los que el id sea igual al que pasamos o en donde el identificador sea igual al dentificador, lo ordenamos por fecha y ¡GÚALA!, tendremos nuestro foro.

post.html:

<table width="90%" border="0" align="center" cellpadding="2" cellspacing="2">
<tr bgcolor="<?=$color?>">
<td width="25%" valign="top">
<b><a name="<?=$id?>"><?=$autor?></a></b><br>
<font size="-2">Enviado el : <?=$enviado?></font>
</td>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><strong><font size="-1">
<?=$titulo?>
</font></strong> </td>
<td width="10%" align="right"> [ <a href="respuesta.php?id=<?=$id?>&citar=1">CITAR</a> ]</td>
</tr>
</table>
<hr align="center" width="100%" size="2" noshade>
<?=$mensaje?></td>
</tr>
<tr>
<td colspan="2" height="5"></td>
</tr>
</table>


Ahora veremos el codigo que utilizaremos para "parsear" la plantilla:

foro.php:

<?php
require('configuracion.php');
require('funciones.php');
$id = $_GET["id"];
if(empty($id)) Header("Location: index.php";

$sql = "SELECT id, autor, titulo, mensaje, ";
$sql.= "DATE_FORMAT(fecha, '%d/%m/%Y %H:%i:%s') as enviado FROM foro ";
$sql.= "WHERE id='$id' OR identificador='$id' ORDER BY fecha ASC";
$rs = mysql_query($sql, $con);
include('header.html');
if(mysql_num_rows($rs)>0)
{
include('titulos_post.html');
$template = implode("", file('post.html'));
while($row = mysql_fetch_assoc($rs))
{
$color=($color==""?"#5b69a6":"";
$row["color"] = $color;
//manipulamos el mensaje
$row["mensaje"] = nl2br($row["mensaje"]);
$row["mensaje"] = parsearTags($row["mensaje"]);
mostrarTemplate($template, $row);
}
}
include('footer.html');
?>

Como siempre, requerimos la conexión a la base de datos, el archivo de funciones y validamos de que exista la variable $id ya que si no existiera nada podríamos hacer y nuestro foro fallaría en el Query.
Hablando del Query, podemos ver como utilizamos la función de mySQL DATE_FORMAT() para convertir el formato por defecto del tipo datetime (‘AAAA-MM-DD hh:mm:ss’) en algo que sea más común para nuestro idioma (‘DD/MM/AAAA hh:mm:ss’).

Lo más destacado en este script que podemos ver, son dos transformaciones que
le hacemos al mensaje, antes de enviarlo al template. Como vemos, primero utilizamos
la función de PHP nl2br(), que convierte
todos los saltos de linea, en tags <br />,
de esa manera, los saltos que un usuario ingrese en el textarea, serán agregados correctamente al mostrar el mensaje.
Luego, vemos como llamamos a la función parsearTags(). ¿Qué hace esta función? Veamos:

funciones.php

<?php
function parsearTags($mensaje)
{
$mensaje = str_replace("", "<blockquote><hr width='100%' size='2'>", $mensaje);
$mensaje = str_replace("[/citar]", "<hr width='100%' size='2'></blockquote>", $mensaje);
return $mensaje;
}
?>

Dentro de esta función, podemos agregar todas las modificaciones que queremos realizarle al mensaje, antes de mostrarlo en el Foro. En el ejemplo, vemos como hemos implementado el uso de un tag propio, .
El mismo, dentro de la función, será reemplazado por el código HTML necesario para destacar el citado de un mensaje, todo esto gracias a la función str_replace() de PHP (más info en el manual). Este es el tag que se agrega automáticamente, y que notamos cuando respondíamos un mensaje.

Esta función, pueden personalizarla de la manera que deseen, agregando todos los tags que quieran, para ofrecerles a sus usuarios la libertad de darle formato a sus mensajes. Podrían, por ejemplo, agregar un nuevo tag, para poner palabras en negritas, o quizás alguna expresión regular que convierta automáticamente cualquier URL presente en el mensaje, en un link. Los límites son los de su imaginación.

8 comentarios - Tuto Como Hacer Un Foro

XiQu3sT
Jajaja! yo leí como hacer un forro
naa que ver..
xixiro
no se puede quitar el subrayado??