Creando nuestro Foro (Cuarta Parte): Los posts
Bueno, ahora la parte mas importante, tenemos que mostrar los posts, la idea es la misma que en los tutoriales anteriores. Primero de todo necesitaremos una "ruta" arriba de todo que nos indique el nombre del tema, así como la categoría de la que deriva, importante para que los usuarios no pierdan la pista de dónde están (obviamente serán links para volver atrás).
Pero vayamos por partes, primero de todo nueva función en el controller, que manejara los temas, al igual que lo hacía con las categorías:
function tema($id = 0)
{
if((int)$id< =0)
{
echo "Error, no existe una tema con esta id.";
}
else
{
$this->load->model("foros_model", "foros");
$this->load->model("usuarios_model", "usuarios");
$vars['query'] = $this->foros->getPosts($id);
$this->load->view("header");
$this->load->view("foros/tema", $vars);
$this->load->view("footer");
}
}
Ahora pasaremos al view, que tiene bastante chicha:
< ?php
echo '<h2><a href="index.php/foros/index">Foros</a> » <a href="index.php/foros/categoria/'.$this->foros->getPostsTemaParam((int)$this->uri->segment(3), "cat_id").'">'.$this->foros->getNombreCategoria($this->foros->getPostsTemaParam((int)$this->uri->segment(3), "cat_id")).'</a>: "'.$this->foros->getPostsTemaParam((int)$this->uri->segment(3), "titulo").'"';
if($query->num_rows() > 0)
{
foreach($query->result() as $row)
{
echo '<h4>'.$this->usuarios->getName($row->usuario_id).' dice:</h4>';
echo '<p>'.$row->cuerpo.'</p>';
}
}
else
{
echo '<p>No hay ninguna tema creado</p>';
}
?>
La primera linea, que es muy larga es para lo que os comentaba al principio. Como véis hago uso repetidamente de una función que he creado en el model, que nos dará toda la información que queramos del tema (titulo, id, categoría a la que pertenece).
Como veis la función es muy simple, jugamos con los parámetros que nos pasan y hacemos que la función sea genérica para nuestros propósitos, así la podemos reutilizar sin necesidad de crear una función especifica para cada cosa.
function getPosts($tema_id = 0)
{
$this->db->where("tema_id", $tema_id);
$this->db->order_by("id", "ASC");
$q = $this->db->get("forum_posts");
return $q;
}
function getPostsTemaParam($id, $param)
{
$this->db->where("id", $id);
$this->db->select($param);
$q = $this->db->get("forum_temas");
$r = $q->row_array();
return $r[$param];
}
Y bueno el trabajo está casi listo, esto ya tiene pinta de foro (cutre y sin estilos, pero eso es lo de menos ahora mismo). Lo que haría falta tanto en temas como en posts es un botón que nos lleve a un formulario para poder crear nuevos temas y nuevos posts. Pero eso es muy sencillo y seguro que todos sabréis hacerlo me imagino, ya que simplemente se trata de insertar información a la base de datos. Esto ya lo hemos visto en un tutorial anterior: Gestor de noticias.
También comentar que para un foro, obviamente necesitáis un sistema de usuarios, así que echadle un vistazo al que ya hicimos hace tiempo: Sistema de Usuarios.
La cosa ha quedado algo así:
----------

----------
Cualquier duda que tengáis podéis dejar un comentario o pasaros por el foro, quizá creéis que debería seguir el tutorial con la parte de añadir comentarios o tenéis alguna sugerencia para algún tema nuevo que os gustaría que hablase.
Creando nuestro Foro (Primera parte): La base de datos
Bueno abro este nuevo taller, para crear un foro en CodeIgniter. Obviamente no será tan completo como aquellos que circulan por Internet (phpBB y sucedaneos), pero si será una sencilla base para que por un lado aprendáis a usar CodeIgniter y por otro lado podáis ampliarlo para adaptarlo a vuestro gusto.
Como siempre empezaremos poco a poco y con buena letra. Lo primero será crear las tablas necesarias para la base de datos. Mantendremos el asunto sencillo y empezaremos con la estructura mas básica de todas.
Vamos a las categorías que tendrá el foro, ahora mismo se me ocurren estos campos
- id
- nombre
- padre
Simple y sencillo. Padre simplemente hará referencia de si es una categoría que dependa de otras o es una principal. Este es el código SQL:
CREATE TABLE IF NOT EXISTS `forum_cat` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nombre` varchar(100) NOT NULL, `padre` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Luego la tabla de posts quedaría con estos campos:
- id
- titulo
- cuerpo
- fecha
- usuario_id
- padre
Tampoco descarto que a mitad de la programación de este foro me de cuenta que falta algún campo, pues tened en cuenta que voy escribiendo esto a medida que lo voy a ir programando. Así quedaría el código SQL:
CREATE TABLE IF NOT EXISTS `forum_posts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `titulo` varchar(100) NOT NULL, `cuerpo` text NOT NULL, `fecha` datetime NOT NULL, `usuario_id` int(11) NOT NULL, `padre` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Y bueno para empezar creo que es todo lo que nos hará falta. Si creéis que me puedo dejar algún campo básico para el funcionamiento, comentad o pasaros por el foro y lo discutimos ;)
El próximo post mas y mejor.
Formulario de contacto (Segunda Parte): Validación
Bueno siguiendo el taller/tutorial del otro dia, voy a proceder con la validación del formulario. Si recordáis, teníamos el formulario creado y usamos la función print_r para ver que recibíamos correctamente las variables. Hoy basicamente lo que haremos es comprobar que esas variables que recibimos son lo que nosotros queremos, es decir vamos a validar que el usuario ha introducido lo que nosotros buscamos.
- Nombre: tiene que ser requerido para enviar el formulario
- Email: tiene que ser requerido y ser un email valido.
- Texto: opcional.
Para empezar, iremos a ver la guía en la documentación de CodeIgniter y veremos como se utiliza la librería: Form Validation. Siguiendo los sencillos pasos del principio tendremos este código en el controlador contacto.php:
Gestor de noticias (Segunda parte): Controladores
Recapitulando, habíamos creado nuestra plantilla y luego la habíamos divido en una cabecera y un pie de página.
En este capitulo crearemos nuestro primer controlador, veremos algún ejemplo de funcionamiento con el típico "Hola Mundo!" y algunos otros detalles.
Para empezar explicaré cómo funciona todo esto de los controladores. Como expliqué en la "primera parte", los controladores son los que coordinan las vistas, el "código" y los modelos. La arquitectura de un controlador es una clase, dónde cada función responderá según nuestra URL, me explico:
http://www.tu-web.com/(index.php)/controlador/función/[variables]
Gestor de noticias (Primera parte): Maquetación
Mientras pensaba cuál sería mi siguiente artículo, se me ocurrió que en vez de un artículo donde yo expongo un tema y vosotros os lo creéis (o no), crear una pequeña aplicación en CodeIgniter paso a paso, de manera que viendo un resultado final de cada explicación se verá y se entenderá todo mucho mejor.
La aplicación será un "típico" gestor de noticias dónde se puedan añadir nuevas entradas, editarlas y borrarlas. Intentaré ir paso a paso ilustrando con ejemplos cada una de las explicaciones y dividiré este pequeño "taller" en unos cuantos posts diferentes, así que la mejor manera es seguir paso a paso y en orden, pero seguro que si alguno busca información concreta seguramente la encontrará en alguno de ellos.
En este primer tema crearemos la estructura en XHTML y CSS que tendrá nuestra aplicación (algo sencillo), y de paso veremos cómo separar el diseño y el código para seguir el modelo MVC que usa CodeIgniter.
