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.
Bueno, ahora ya teníamos el listado de categorías funcionando, así que profundizaremos un nivel mas, los temas. Para que nos entendamos veamos que profundidades tendremos en el foro:
Foro > Categorías > Temas > Posts
Empezando a programar me di cuenta que harían falta unos retoques en la base de datos, pues necesito una tabla para los "temas" que no había creado. Como el tutorial lo voy haciendo poco a poco a medida que lo hago, también me doy cuenta de errores y cosas que me olvido, y como ya os avisé, la base de datos siempre hay que adaptarla.
Veamos la nueva tabla "forum_temas", de momento tendrá estos campos (y de paso una fila de ejemplo):

Como suponéis, cat_id hará referencia a la id de la categoría.
Luego también necesitaremos unos cambios en la tabla "forum_posts", pues añadiendo la anterior hay algunos campos que ya no necesitamos.

Hemos incorporado el tema_id, sustituyendo a padre, para que quede mas claro hacía donde es la referencia. También hemos quitado el titulo, porque ya lo lleva la tabla anterior.
Ahora ya pasamos a la programación en PHP y CodeIgniter.
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
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.
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:
Bueno tal y comenté, hace días abrí el foro para que todos los usuarios con dudas y sugerencias pudieran participar activamente en el blog. Ayer el usuario jarruego me comentó que podría hacer un pequeño tutorial de cómo hacer un modulo que es básico y común en la mayoría de webs: un formulario de contacto. Nos servirá para introducir a aquellos que sean nuevos en esto con un sencillo ejemplo.
Para esta pequeña aplicación utilizaré la última versión de CodeIgniter (que hay por el momento) que es la 2.0.0.
Un formulario de contacto nos ayudará a que cualquier persona interesada en nuestra web, ya sea un negocio, portafolio o cualquier otra cosa. Se puede ampliar tanto como queráis pero como esto es un tutorial haremos los campos mas básicos: nombre, email, mensaje.
Voy a dividir este tutorial en 2 o quizá 3 posta, empezaré con el código básico, tanto HTML como PHP (en CodeIgniter). Luego seguiré con la libreria de validación para poder comprobar que han entrado los campos correctamente. Acabaré usando la librería para mandar emails fácilmente, así nos llegará al correo este formulario básico de contacto en CodeIgniter.
Primero de todo empezaremos creando el código HTML para el formulario. Usaré etiquetas que no se suelen usar pero que deberíais hacerlo, como fieldset, legend y label, eso ayudará a la visibilidad y usabilidad del mismo. Cabe decir que no voy a "diseñar", así que lo dejaré tal cual salga aunque todos sabemos que el html sin css es feo, pero ahora lo que nos interesa es el código php.
Los 'Helpers' de CodeIgniter son básicamente pequeñas librerías con 4 o 5 funciones que nos dan funcionalidades que nos ayudan con los problemas típicos al crear webs. A medida que vayamos experimentando y avanzando con la programación de una web nos encontraremos con que necesitamos añadir nuevas funcionalidades a los helpers existentes o a veces modificar las que ya están hechas.
Podemos pensar en ir a la carpeta "system" ahí buscar el helper y modificarlo. Si, se puede hacer pero es una manera muy "guarra" de proceder, básicamente por dos razones:
- Nos actualizan el CodeIgniter y coincide que modifican ese helper, vamos a tener un problema.
- Queremos reutilizar código, es muy engorroso ir haciendo copy&paste de funciones de algunos helpers.
Aprovechando la aplicación que estamos creando del Gestor de Noticias, voy a intentar satisfacer algunas peticiones de algunos usuarios que me preguntan cómo hacer un buscador en CodeIgniter (aunque en PHP es lo mismo ya que para esto apenas uso nada de CodeIgniter).
Antes de empezar la explicación aclarar que lo que lo que estoy haciendo es un buscador muy simple y funcional, el hacer un buscador tiene muchos caminos y complicaciones extras pero no entraré en ello, al menos hoy, así que si estáis buscando cómo hacer un buscador completo y complejo este no es vuestro articulo, aquí vamos a tratarlo desde un punto de vista de iniciación.
Primero de todo necesitaremos crear unos índices FULLTEXT en nuestra base de datos para que podamos realizar bien la búsqueda con la sintaxis MATCH...AGAINST, para ello lo haremos con este código SQL:
ALTER TABLE `noticias` ADD FULLTEXT(`titulo`, `cuerpo`);
El otro día, en la tercera parte de estos tutoriales os enseñé lo que era el scaffolding y como nos servía para testear rápidamente nuestra aplicaciones, pero realmente no sirve como una herramienta de administración, así que para ello deberemos crear un formulario que nos permita añadir nuevas noticias a la web.
Para ello necesitaremos:
- Formulario para añadir los datos
- Código que nos valide que los datos del formulario son correctos
- Código que nos añada lo que recogemos del "1" a la base de datos.
Bueno me gustaría presentaros a mi amigo CodeIgniter, se trata de un framework en PHP muy sencillo de usar pero que a la vez tiene un gran potencial. Os lo recomiendo sobretodo para aquellos de vosotros que estáis trabajando sobre servidores virtuales (por lo de las configuraciones) o que queráis empezar a conocer cómo funciona todo este mundo desconocido del MVC.
Me gustaría hacer una breve explicación sobre lo que es el MVC. Seguro que hay un montón de artículos sobre ello pero normalmente hablan sobre términos muy genéricos e incluso a veces algo crípticos, así que intentare explicarlo de la manera mas sencilla que se me ocurra, y basándome en que lo que queremos trabajar es con PHP.