Bueno, hace unos meses estuve haciendo una web, en la que necesitaba crear un sistema de noticias, pero sin complicarme mucho la vida con un sistema de administración y usuarios aparte y aprovechando que dicha web contaba con un foro phpbb3 donde se colgaban noticias.
Parte 1: Conexión BBDD
Vamos a trabajar con MySQL, puesto que es el sistema más común. Lo que vamos a hacer es configurar los datos de acceso a la base de datos.
También podemos incluirlo (include, require...) como un archivo de configuración aparte para simplificarnos la tarea si vamos a usar diferentes scripts.
spoiler<?php
# Datos de MySQL
$dbhost = 'localhost'; # Normalmente es localhost, es nuestro servidor MySQL
$dbname = 'tabla_phpbb'; # El nombre de la tabla del foro phpbb3
$dbuser = 'user_phpbb'; # El usuario de acceso
$dbpass = 'pass_phpbb'; # La contraseña de acceso
# Conectamos a la base de datos y a la tabla de phpbb
$enlace = mysql_connect($dbhost, $dbuser, $dbpass) or die('No pudo conectarse: ' . mysql_error());
mysql_select_db($dbname) or die('No pudo seleccionarse la BD.');
Parte 2: Configuración
Mediante unas simples variables vamos a configurar nuestro script. Lo vamos a hacer de esta forma por que así, en unas 3 lineas, podemos configurar y cambiar prácticamente todo el script cuando nos sea preciso.
spoilerLimite de noticias por página
$limite = 5;
ID del foro Noticias
$idforo = 6;
Sacamos la página actual
$pagina = $_GET["pag"];
if (!$pagina) {
$inicio = 0;
$pagina = 1;
}
else {
$inicio = ($pagina - 1) * $limite;
}
Como detalle, la variable que vamos a usar para definir la página que estamos viendo es pag, podemos cambiarla sin problema editando $_GET["pag"];.
Parte 3: Llamada y obtención de datos
Como vamos a usar un sistema de paginado, antes de nada vamos a comprobar cuantas noticias tenemos en el foro, y en cuantas páginas vamos a mostrarlas.
spoilerSacamos el número total de filas en el foro Noticias
$query = 'SELECT * FROM phpbb_topics WHERE forum_id = '.$idforo;
$query = mysql_query($query, $enlace);
$query = mysql_num_rows($query);
Páginas totales que vamos a tener
$total = ceil($query / $limite);
Ahora sacamos los temas según la página actual
$query = 'SELECT * FROM phpbb_topics WHERE forum_id = '.$idforo.' ORDER BY topic_time DESC LIMIT '.$inicio.','.$limite;
$query = mysql_query($query, $enlace);
Parte 4: Bucle y muestra de las noticias
Para mostrar todas las noticias, vamos a usar un bucle, en este caso while, para mostrar las noticias una a una con una misma estructura.
spoiler
# Abrimos el bucle, mostrando las noticias
while ($data = mysql_fetch_array($query)) {
# ID del Post primcipal
$post = $data['topic_first_post_id'];
# Ahora, buscamos el texto de la noticia
$query2 = 'SELECT * FROM phpbb_posts WHERE post_id = '.$post;
$query2 = mysql_query($query2, $enlace);
$post = mysql_fetch_object($query2);
# Variables
$autor = $data['topic_first_poster_name'];
$titulo = $data['topic_title'];
$texto = $post->post_text;
# Variables para enlazar
$forumid = $data['forum_id'];
$topicid = $data['topic_id'];
# Transformamos tags BBCode
preg_match("#\[b:([\w]+)\]#is", $texto, $text);
$tag = $text[1];
$texto = str_replace($tag, '', $texto);
$texto = str_replace(":]", "]", $texto);
$a = array(
"/\[i\](.*?)\[\/i\]/is",
"/\[b\](.*?)\[\/b\]/is",
"/\[u\](.*?)\[\/u\]/is",
"/\[tachado\](.*?)\[\/tachado\]/is",
"/\[url=(.*?)\](.*?)\[\/url\]/is",
"/\[url](.*?)\[\/url\]/is",
"/\[center\](.*?)\[\/center\]/is",
"/\[img=(.*?)\](.*?)\[\/img\]/is",
"/\[img](.*?)\[\/img\]/is",
"/\[color=(.*?)\](.*?)\[\/color\]/is"
);
$b = array(
"<em>$1</em>",
"<strong>$1</strong>",
"<u>$1</u>",
"<strike>$1</strike>",
"<a href=\"$1\" title=\"$2\" target=\"_blank\">$2</a>",
"<a href=\"$1\" target=\"_blank\">$1</a>",
"<center>$1</center>",
"<img src=\"$1\" title=\"$2\" alt=\"$2\" />",
"<img src=\"$1\" alt=\"Imagen\" />",
"<span style=\"color: $1\">$2</span>"
);
$texto = preg_replace($a, $b, $texto);
# Mostramos la noticia
echo '<div style="margin: 10px 0 15px 0;"><div><a href="http://www.dominio.com/foro/viewtopic.php?f='.$forumid.'&t='.$topicid.'" title="Ver en el foro: '.htmlentities($titulo).'" style="font-size: 18px;">'.htmlentities($titulo).'</a></h2></div>';
echo '';
echo '<div>'.nl2br(utf8_encode($texto)).'</div></div>';
}
mysql_free_result($query);
mysql_close($enlace);
La verdad es que phpbb3, por alguna razón que desconozco añade 8 caracteres random a las etiquetas BBCode, algo así [b:w45as6ad] y [/b:w45as6ad]. Por eso echamos mano de las expresiones regulares para borrar esto y crear un nuevo patrón de etiquetas.
Paso 5: Paginación
Ahora mostramos la página actual, las posteriores/anteriores y el total de páginas, para una más fácil navegación en nuestra web.
spoilerMostramos la paginación
echo '<div align="center">';
if ($total > 1){
for ($i=1;$i<=$total;$i++){
if ($pagina == $i)
echo $pagina;
else
echo " <a href='?pag=" . $i . "'>" . $i . "</a> ";
}
}
echo '</div>';
?>
En fin, ya tenemos nuestro básico sistema de noticias basado en phpbb3. Es bastante rudimentario. Podemos añadirle pues el número total de comentarios, las visitas, etc. Además de añadir mas compatibilidad con bbcodes, como por ejemplo inclusión de vídeo y demás cosas.
El código completo, con algún que otro retoque es el siguiente:
spoiler<?php
# Datos de MySQL
$dbhost = 'localhost'; # Normalmente es localhost, es nuestro servidor MySQL
$dbname = 'tabla_phpbb'; # El nombre de la tabla del foro phpbb3
$dbuser = 'user_phpbb'; # El usuario de acceso
$dbpass = 'pass_phpbb'; # La contraseña de acceso
# Conectamos a la base de datos y a la tabla de phpbb
$enlace = mysql_connect($dbhost, $dbuser, $dbpass) or die('No pudo conectarse: ' . mysql_error());
mysql_select_db($dbname) or die('No pudo seleccionarse la BD.');
# Limite de noticias por página
$limite = 5;
# ID del foro Noticias
$idforo = 6;
# Sacamos la página actual
$pagina = $_GET["pag"];
if (!$pagina) {
$inicio = 0;
$pagina = 1;
}
else {
$inicio = ($pagina - 1) * $limite;
}
# Sacamos el número total de filas en el foro Noticias
$query = 'SELECT * FROM phpbb_topics WHERE forum_id = '.$idforo;
$query = mysql_query($query, $enlace);
$query = mysql_num_rows($query);
# Páginas totales que vamos a tener
$total = ceil($query / $limite);
# Ahora sacamos los temas según la página actual
$query = 'SELECT * FROM phpbb_topics WHERE forum_id = '.$idforo.' ORDER BY topic_time DESC LIMIT '.$inicio.','.$limite;
$query = mysql_query($query, $enlace);
# Abrimos el bucle, mostrando las noticias
while ($data = mysql_fetch_array($query)) {
# ID del Post primcipal
$post = $data['topic_first_post_id'];
# Ahora, buscamos el texto de la noticia
$query2 = 'SELECT * FROM phpbb_posts WHERE post_id = '.$post;
$query2 = mysql_query($query2, $enlace);
$post = mysql_fetch_object($query2);
# Variables
$autor = $data['topic_first_poster_name'];
$titulo = $data['topic_title'];
$texto = $post->post_text;
# Variables para enlazar
$forumid = $data['forum_id'];
$topicid = $data['topic_id'];
# Transformamos tags BBCode
preg_match("#\[b:([\w]+)\]#is", $texto, $text);
$tag = $text[1];
$texto = str_replace($tag, '', $texto);
$texto = str_replace(":]", "]", $texto);
$a = array(
"/\[i\](.*?)\[\/i\]/is",
"/\[b\](.*?)\[\/b\]/is",
"/\[u\](.*?)\[\/u\]/is",
"/\[tachado\](.*?)\[\/tachado\]/is",
"/\[url=(.*?)\](.*?)\[\/url\]/is",
"/\[url](.*?)\[\/url\]/is",
"/\[center\](.*?)\[\/center\]/is",
"/\[img=(.*?)\](.*?)\[\/img\]/is",
"/\[img](.*?)\[\/img\]/is",
"/\[color=(.*?)\](.*?)\[\/color\]/is"
);
$b = array(
"<em>$1</em>",
"<strong>$1</strong>",
"<u>$1</u>",
"<strike>$1</strike>",
"<a href=\"$1\" title=\"$2\" target=\"_blank\">$2</a>",
"<a href=\"$1\" target=\"_blank\">$1</a>",
"<center>$1</center>",
"<img src=\"$1\" title=\"$2\" alt=\"$2\" />",
"<img src=\"$1\" alt=\"Imagen\" />",
"<span style=\"color: $1\">$2</span>"
);
$texto = preg_replace($a, $b, $texto);
# Mostramos la noticia
echo '<div style="margin: 10px 0 15px 0;"><div><a href="http://www.dominio.com/foro/viewtopic.php?f='.$forumid.'&t='.$topicid.'" title="Ver en el foro: '.htmlentities($titulo).'" style="font-size: 18px;">'.htmlentities($titulo).'</a></h2></div>';
echo '';
echo '<div>'.nl2br(utf8_encode($texto)).'</div></div>';
}
mysql_free_result($query);
mysql_close($enlace);
# Mostramos la paginación
echo '<div align="center">';
if ($total > 1){
for ($i=1;$i<=$total;$i++){
if ($pagina == $i)
echo $pagina;
else
echo " <a href='?pag=" . $i . "'>" . $i . "</a> ";
}
}
echo '</div>';
?>
Se aceptan todo tipo de sugerencias y sobre todo mejoras en el código.