FORO PHP Y MYSQL – PARTE 2

Stay hungry, stay foolish

Steve Jobs

En esta parte crearemos la parte visible por el usuario, este post abarca:

  • Estructura de la pagina principal el index y crearemos los archivos header.php y footer.php
  • Crearemos las clases principal, categorías, foros, subforos, temas
  • Conectaremos con la base de datos
  • Y crearemos parte del index

La base de datos a sufrido algunos cambios de la del primer post, ya que se va adecuando y a completando al foro final.

Hasta donde llegaremos el foro quedara así más o menos.

FORO   CODEDRINKS_20140527175325

Creamos la siguiente estructura de directorios:

  • class – guarda las clases creadas
  • css – hojas de estilo
  • img – imagenes
  • js – scripts jquery

Luego creamos nuestro index, header y footer con el siguiente codigo e incluimos el header y el footer en el index


// pondremos los archivos class

include 'header.php'; // incluimos el header.php

// contenido del foro

include 'footer.php'; // incluimos el footer.php

En el archivo header.php empezamos con el código html y hoja de estilos, el encabezado del foro y los enlaces de registro y login


<!DOCTYPE html>
<html lang="es">
<head>
<title>FORO</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" href="css/estilo.css" />

</head>
<body>

footer.php cerramos el html

</body>
</html>

Ya que tenemos la estructura empezaremos con la class principal.php que conecta a la base de datos y define la ruta del sitio


session_start(); // declaramos la session para usarla cuando el usuario use el login
class Principal{
public function Conectar(){

// los datos del servidor
$servidor="localhost";
$user = "root";
$password = "";

$link = mysql_connect($servidor,$user,$password);

if(!$link)
die("Tenemos problemas, regrese en unos minutos: ".mysql_error());

mysql_query("SET NAMES 'utf8'");

$bd = "foro";

if(!mysql_select_db($bd))
die("Tenemos problemas, regrese en unos minutos: ".mysql_error());

return $link;
}

public static function ruta(){
return "http://localhost/foro/";
}

}

Después creamos nuestra clase categorías y la extendemos de la clase principal, en esta parte solo listaremos las categorías en el index para irle dando forma al foro


<?php
require_once 'principal.php';
class Categorias extends Principal{
private $categoria;

public function __construct(){
$this->categoria = array();
}
// Traemos las categorias para el index
public function getCategorias(){
parent::Conectar();
$query = sprintf(
"select
id_forocategoria,
categoria,
descripcion
from
foro_categoria"
);

//echo $query;exit;
$result = mysql_query($query);
if(!$result)
die("Regrese más tarde");
while ($reg = mysql_fetch_assoc($result)) {
$this->categoria[] = $reg;
}
return $this->categoria;
}
}

?>

En el index.php incluimos la clase categorias y las listamos


//Include las clases
require_once 'class/categorias.php';

// declaramos el nuevo objeto

$objC = new Categorias();

// obtenemos las categorias por la función getCategorias y las imprimimos

$categorias = $objC->getCategorias();

// imprimimos
foreach ($categorias as $cat) {

// obtenemos el id de cada categoria para poderlo usar a al hora de imprimir los foros, subforos, temas, visitas, comentarios, etc.
$categoria = $cat["id_forocategoria"];
?>
<div class="caja">
<div class="categorias">

<!-- imprimimos el tituo de la categoria y hacemos un enlace con el mismo nombre para cuando estemos en lo temas y podamos regresar a la categoria dodne estabamos -->
<a name="<?php echo $cat["categoria"]; ?>"></a><?php echo $cat["categoria"]; ?>
</div>

De igual manera creamos los foros contenidos dentro de cada categoría, solo que los foros serán listados por categorías, por lo tanto le pasamos a nuestra función el id_forocategoria que mencione en el código anterior.

<?php
 require_once 'principal.php';
 class Foros extends Principal{
 private $foro;

 public function __construct(){
 $this->foro = array();
 }
 // Traemos los foros para el index por categoria
 public function getForo($categoria){
 parent::Conectar();
 $query = sprintf(
 "select
 id_foro,
 id_forocategoria,
 foro,
 descripcion
 from
 foro_foro
 where
 id_forocategoria = %s;",
 parent::comillas_inteligentes($categoria)
 );

 //echo $query;exit;
 $result = mysql_query($query);
 if(!$result)
 die("Regrese más tarde");
 while ($reg = mysql_fetch_assoc($result)) {
 $this->foro[] = $reg;
 }
 return $this->foro;
 }

Ahora dentro de nuestro foreach imprimimos los foros

  • Creamos nuestro objeto y llamamos a la función getForo pasandole el id de las categorias
  • Aun falta lo de listar la imagen del foro ya que eso lo aremos cuando creemos el administrador del foro, por lo mientras solo muestra una imagen
  • luego creamos nuestro enlace al archivo temas.php el cual listara los temas creados dentro de el foro en cuestión para ello le enviamos el valor del id_foro por GET
  • Por ultimo mostramos el nombre del foro
incluimos la clase foros
require_once 'class/foros.php';

 $objF = new Foros();
 $foros = $objF->getForo($categoria);
 foreach ($foros as $foro) {
 ?>
 <div class="foro">
 <div class="foro_icono">
 <img src="img/note.png">
 </div>
 <div class="foro_titulo">

 <a href="temas.php?foro=<?php echo $foro["id_foro"]; ?>"><?php echo $foro["foro"]; ?></a><br>

Algunos foros tiene subforos para esto crearemos la class subforos y solo los listaremos como una lista y le mandaremos por get al archivo temas los valores para listar los temas del subforo

<?php
 require_once 'principal.php';
 class Subforos extends Principal{
 private $subforo;

 public function __construct(){
 $this->subforo = array();
 }
 // Traemos las categorias para el index
 public function getSubforo($foro){
 parent::Conectar();
 $query = sprintf(
 "select
 id_subforo,
 id_foro,
 subforo,
 descripcion
 from
 foro_subforos
 where
 id_foro = %s;",
 parent::comillas_inteligentes($foro)
 );

 //echo $query;exit;
 $result = mysql_query($query);
 if(!$result)
 die("Regrese más tarde");
 while ($reg = mysql_fetch_assoc($result)) {
 $this->subforo[] = $reg;
 }
 return $this->subforo;
 }

Luego lo listamos abajo de nuestro titulo del foro

<ul>
 <?php
 $objSF = new Subforos();
 $subforos = $objSF->getSubforo($foro["id_foro"]);
 foreach ($subforos as $sforo) {
 ?>
 <li><a href="temas.php?foro=<?php echo $sforo["id_foro"]; ?>&sub=<?php echo $sforo["id_subforo"]; ?>">
 <?php echo $sforo["subforo"]; ?></a>
 </li>
 <?php
 }
 ?>
 </ul>

Para crear nuestro archivo temas.php lo hacemos igual que el index.php


// pondremos los archivos class

include 'header.php'; // incluimos el header.php

// listado de temas

include 'footer.php'; // incluimos el footer.php

En nuestra clase crearemos el listado de temas por foro y el totalde temas para poderlo usar en el el apartado de total de temas y en la paginación.

<?php
 require_once 'principal.php';
 class Temas extends Principal{
 private $temas;
 private $tTemas;

 public function __construct(){
 $this->temas = array();
 }
 // Traemos las categorias para el index
 public function getTemas($foro,$inicio,$cantTemas){
 parent::Conectar();
 $query = sprintf(
 "select
 foro_temas.id_tema,
foro_temas.id_foro,
foro_temas.id_subforo,
foro_temas.titulo,
foro_temas.contenido,
foro_temas.fecha,
foro_temas.activo,
foro_temas.hits,
usuarios.nickname,
foro_temas.id_usuario
FROM
foro_temas
INNER JOIN usuarios ON foro_temas.id_usuario = usuarios.id_usuario
 where id_foro = %s
 order by id_tema desc
 limit %s,%s;",
 parent::comillas_inteligentes($foro),
 parent::comillas_inteligentes($inicio),
 parent::comillas_inteligentes($cantTemas)
 );

 //echo $query;exit;
 $result = mysql_query($query);

 if(!$result)
 die("Regrese más tarde");

 while ($reg = mysql_fetch_assoc($result)) {
 $this->temas[] = $reg;
 }

 return $this->temas;
 }
 //*****************************************************************************
 public function TotalTemas($foro){
 $query = "select count(*) as total from foro_temas where id_foro = '$foro'";
 $result = mysql_query($query,parent::Conectar());

 if ($reg = mysql_fetch_array($result)) {
 $this->tTemas = $reg["total"];
 }

 return $this->tTemas;
 }
 }

?>

En el total de temas por foro solo listamos el valor de la siguiente forma, no hay que olvidar incluir la clase temas

<?php
 $objTemas = new Temas();
 $total = $objTemas->TotalTemas($foro["id_foro"]);
 ?>
 Temas: <?php echo $total; ?><br>

Nuestra pagina de temas quedara de la siguiente manera
FORO   CODEDRINKS_20140527185810

Comencemos con el archivo de temas, lo primero que necesitamos saber es si listaremos un los temas de un foro o un subforo, comencemos.

//Include las clases
require_once 'class/foros.php';
require_once 'class/subforos.php';
require_once 'class/temas.php';

Validamos si existe la variable sub que enviamos por get, si no existe se trata solo de los temas de un foro, de lo contrario solo son los temas de un subforo y solo listaremos de los temas del foro los que pertenecen al subforo

if (isset($_GET['sub'])) {
// los temas pertenecientes al su foro subforo
}else{
// todos los temas del foro
}

Antes de esto definí la cantidad de temas a mostrar

// Total de temas
$cantTemas = "5";

Luego cree el listado con la paginación correspondiente

if (isset($_GET['sub'])) {
 $objF = new Foros();
 $titulo = $objF->foroporid($_GET['foro']);


 $objSF = new Subforos();
 $stitulo = $objSF->subforoporid($_GET['sub']);
 ?>
 <h2>Foro: <?php echo $titulo[0]["foro"]; ?> / SubForo: <?php echo $stitulo[0]["subforo"]; ?></h2>

 <h4>
 <a href="<?php echo Principal::ruta(); ?>">Foros</a> &rarr;
 <a href="<?php echo Principal::ruta(); ?>#<?php echo $titulo[0]["categoria"]; ?>"><?php echo $titulo[0]["categoria"]; ?></a> &rarr;
 <a href="<?php echo Principal::ruta(); ?>temas.php?foro=<?php echo $titulo[0]["id_foro"]; ?>"><?php echo $titulo[0]["foro"]; ?></a> &rarr;
 <?php echo $stitulo[0]["subforo"]; ?>
 </h4>

 <div class="caja">
 <div class="categorias">
 <div class="temas_titulo">Titulo / Autor</div>
 <div class="temas_respuestas">Respuestas / Visitas</div>
 <div class="temas_ultimo">Último mensaje</div>
 </div>
 </div>
 <?php
} else {
 $objF = new Foros();
 $titulo = $objF->foroporid($_GET['foro']);
 ?>
 <h2>Foro: <?php echo $titulo[0]["foro"]; ?></h2>
 <h4>
 <a href="<?php echo Principal::ruta(); ?>">Foros</a> &rarr;
 <a href="<?php echo Principal::ruta(); ?>#<?php echo $titulo[0]["categoria"]; ?>"><?php echo $titulo[0]["categoria"]; ?></a> &rarr;
 <?php echo $titulo[0]["foro"]; ?>
 </h4>
 <?php
 //*****************************************
 $foro = $_GET['foro'];
 $objTemas = new Temas();

 if (isset($_GET["pos"]))
 $inicio = $_GET["pos"];
 else
 $inicio = 0;

 $proxima = $inicio + $cantTemas;

 $datos = $objTemas->getTemas($foro, $inicio, $cantTemas);

 $total = $objTemas->TotalTemas($foro);

 $cantPag = $total / $cantTemas;

 if (isset($_GET["pos"]) and $_GET["pos"] > 0)
 $actual = $_GET["pos"] / $cantTemas + 1;
 else
 $actual = 1;
 //****************************************
 ?>
 <div>
 Temas del <?php echo $i = $inicio+1; ?> al <?php echo $proxima; ?> de <?php echo $total; ?>
 </div>
 <div class="caja">
 <div class="categorias">
 <div class="temas_titulo">Titulo / Autor</div>
 <div class="temas_respuestas">Respuestas / Visitas</div>
 <div class="temas_ultimo">Último mensaje</div>
 </div>

 <?php
 if (sizeof($datos) == 0) {
 echo "No existen registros aún";
 } else {
 //****************
 foreach ($datos as $temas) {
 ?>
 <div class="foro">
 <div class="foro_icono">
 <img src="img/note.png">
 </div>
 <div class="foro_titulo">
 <a href="tema.php?id=<?php echo $temas["id_tema"]; ?>"><?php echo $temas["titulo"]; ?></a><br>
 Iniciado por <a href="user.php?id=<?php echo $temas["id_usuario"]; ?>"><?php echo $temas["nickname"]; ?></a>, <?php echo $temas["fecha"]; ?>
 </div>
 <div class="temas_mensajes">
 Respuestas: 1000<br>
 Visitas: <?php echo $temas["hits"]; ?>
 </div>
 <div class="ultimocomentario">
 user<br>
 fecha
 </div>
 <div style="clear:both; height:1px;font-size:0px; line-height: 0px;"></div>
 </div>
 <?php
 }
 //********* paginacion *******/
 }
 ?>

 </div>
 
 <!-- Fin #paginacion -->
 <div id="paginacion">
 <?php
 if ($inicio == 0) {
 ?>
 <span class="negrita">Anterior</span>
 <?php
 } else {
 ?>
 <a href="?foro=<?php echo $foro; ?>&pos=<?php echo $inicio - $cantTemas; ?>">Anterior</a>
 <?php
 }
 ?>

 <?php
 $a = 0;
 $ultimaPag = 0;

 if ($actual > 6) {
 echo "...";
 }

 for ($i = 1; $i <= $cantPag; $i++) {
 if ($i >= $actual - 5 && $i <= $actual + 5) {
 if ($i == $actual) {
 ?> 
 <span> <?php echo $i; ?> </span>
 <?php
 } else {
 ?>
 <a href="?foro=<?php echo $foro; ?>&pos=<?php echo $a; ?>"> <?php echo $i . " "; ?> </a>
 <?php
 }
 }
 $a+=$cantTemas;
 $ultimaPag++;
 }

 $final = $ultimaPag * $cantTemas;
 $resto = $total - $final;

 if ($final < $total) {
 $ultimaPag++;

 if ($actual == $ultimaPag) {
 ?>
 <span><?php echo $ultimaPag; ?></span>
 <?php
 } else {
 ?>
 <a href="?foro=<?php echo $foro; ?>&pos=<?php echo $final; ?>"><?php echo $ultimaPag; ?></a>
 <?php
 }
 }

 if ($ultimaPag - $actual > 5) {
 echo "...";
 }
 ?>

 <?php
 if ($ultimaPag == $actual) {
 ?>
 <span>Siguiente</span>
 <?php
 } else {
 ?>
 <a href="?foro=<?php echo $foro; ?>&pos=<?php echo $inicio + $cantTemas; ?>">Siguiente</a>
 <?php
 }
 ?>

 </div>
 <!-- Fin #paginacion -->
 <?php
}

Bueno por este post es todo, en el siguiente listaremos los temas del subforo, crearemos la parte nuevo tema, usuarios, comentarios y estadísticas.

Descargar el código fuente.
si no puedes descomprimir usa winrar 5.