Creando nuestro Foro (Tercera parte): Los temas
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.
Creando nuestro Foro (Segunda parte): Las categorías
Bueno ha llegado el momento de ponerse a programar en CodeIgniter, pues ya tenemos las bases de datos creadas. Para empezar pondremos algunos valores en la base de datos, en la tabla de categorías, por ejemplo estas:

Os podéis fijar, tal y como os comenté en el post anterior como funciona el tema del "padre", simplemente hace referencia a la ID a la cual pertenece. En este caso tenemos la categoría padre (definida por padre=0) "General" y sus hijos son "Noticias" y "Off-topic", de todas maneras luego lo veréis mas claro.
Ahora necesitaremos las 3 partes fundamentales del modelo MVC que son: la vista, el controlador y el modelo, asi que lo vamos a crear.
- El controlador: controllers/foros.php
- El modelo: models/foros_models.php
- Las vistas irán dentro de la carpeta views/foros, y crearemos index.php
Una vez tenemos creados estos 3 archivos empezaremos a hilar un poco todo para empezar a mostrar las categorías. Empezaremos por el modelo, es el que nos ayudara a comunicarnos con la base de datos, el código será este de momento:
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 (Tercera parte): Enviando emails
Bueno esta es la ultima parte de este sencillo tutorial, seguimos con la creación de un formulario de contacto en CodeIgniter, basicamente lo que vamos a hacer ahora es utilizar la libreria Email Class.
Como tenemos las variables de "nombre, "email" y "texto" simplemente tendremos que introducirlas en las funciones correspondientes, algo así como:
< ?php
if(!defined('BASEPATH'))
exit('No direct script access allowed');
class Contacto extends CI_Controller
{
function __construct()
{
parent::__construct();
}
function index()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('nombre', 'Nombre', 'trim|required|xss_clean');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');
$this->form_validation->set_rules('texto', 'Texto', 'xss_clean');
if($this->form_validation->run())
{
//print_r($_POST);
$this->load->library('email');
$this->email->from('webmaster@noquieroprogramar.com', 'Lagarto');
$this->email->to($_POST['email']);
$this->email->subject('Contacto de tu web');
$this->email->message($_POST['nombre']. ", se ha puesto en contacto contigo y te ha dicho: ".$_POST['texto']);
$this->email->send();
echo $this->email->print_debugger();
}
else
{
$this->load->view('contacto');
}
}
}
?>
Veréis como he dejado la función "debug" para que comprobéis que todo ha ido correctamente, obviamente esto no lo tendríais que incluir en vuestra aplicación sino un "redirect" hacía alguna página que ponga "Has enviado correctamente el formulario" o algo parecido.
Aquí la prueba:

A partir de aquí, lo podéis complicar como queráis, pero esta es la base mas simple para empezar a trabajar.
Para cualquier duda que tengáis sobre esto u otra cosa no olvidéis pasaros por el foro. (tenéis en enlace por la derecha y arriba de la web).
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:
Formulario de contacto (Primera Parte): Código básico
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.
Ha salido CodeIgniter 2.0.0 !!!
Bueno después de mucho tiempo y muchos interrogantes por la situación por la que pasa CodeIgniter, ayer anunciaron de forma oficial la versión 2.0! La verdad que hay muchisimos cambios que os animo a que los descubráis en la documentación, pero aquí van algunos:
- Al fin ya no soportan PHP4, ahora PHP5 es un requisito.
- Mejora de seguridad en formularios
- Ahora han creado "Drivers", que básicamente engloba base de datos, javascript, etc..
- Plugins han desaparecido en detrimento de los Helpers
- Han añadido una gran utilidad para poder crear fácilmente tu pagina de error 404
- Han arreglado muchísimos bugs.
Bueno os animo a todos los lectores que os actualicéis a la ultima versión. Además nos han dejado unas pistas de lo que nos deparará sus futuras actualizaciones.
- Harán la documentación mas del estilo PHP, para que participen los usuarios.
- Quieren crear un sistema de Authentication (login y todo eso) genérico ya que es algo muy basico que todas las webs necesitan. (os recuerdo que aquí hicimos un tutorial para crear uno).
- Mejoras en el active-record para poder trabajar mejor con los "models".
Fuente: codeigniter.com
XtraUpload, un “Megaupload” en CodeIgniter
Vía Webmastelibre me entero de que existe un software gratuito creado en CodeIgniter que nos permite fácilmente crear nuestro propio sistema de "uploads" de archivos, que ahora están de moda los típicos "Rapidshare", "MegaUpload", etc..
Si mas no es interesante echarle un vistazo a estas herramientas, ya que así podemos ver como están hechas las aplicaciones reales puesto que aquí normalmente trabajamos sobre tutoriales de ejemplos simples de aplicaciones.
XtraUpload, que asi se llama la aplición está escrito en PHP usando, como ya hemos dicho, el Framework de CodeIgniter. Tiene todas las caracteristicas que te esperarías para este tipo de paginas:
- Control de usuarios, tanto gratuitos como "Premium".
- Usuarios Premium tienen opciones interesantes adicionales.
- Puedes especificar tipos de fichero, tamaños y en general configurar la aplicación a tu gusto.
- Permite pagos con PayPal y otros.
Lo interesante tambien de estas aplicaciones es indagar un poco en el codigo y ver como hacen determinadas cosas, como utilizan ciertas librerias, tanto de CodeIgniter como creadas por ellos mismos. Yo os recomiendo que echeis un vistazo de:
- Como está hecho todo el tema de verificación de usuarios (login, etc..)
- Todo lo referente a las descargas de archivos, control deMB bajados, y otras caracteristicas
- Como hacen para conectar con las pasarelas de pagos de PayPal, 2CheckOut, MoneyBrokers, StormPay y eGold.
- Upload, como lo gestionan, como lo controlan, etc.
- Como funcionan con los templates y themes.
Yo la verdad que le he pegado un vistazo y he encontrado muchas cosas interesantes, y esta es otra manera de aprender.
EDITADO: el proyecto ha sido descontinuado, pero colgaron el código en google code: enlace.
Usando ‘Hooks’ en CodeIgniter
Muchas veces nos encontraremos, al programar nuestras aplicaciones, que necesitamos realizar una tarea en todas las paginas por igual, en un mismo momento. Hay una solución para eso, muy muy mala, que es hacer un copy&paste del código en todas las paginas (si.. si.. quien no ha hecho eso alguna vez...).
Por suerte CodeIgniter nos trae de la mano una buena herramienta llamada 'Hooks' o ganchos, que simplemente nos permite hacer eso, ejecutar determinadas funciones en un determinado momento.
El "determinado momento", básicamente puede ser:
- pre_system: al principio de la ejecución del sistema, sin haber cargado básicamente nada.
- pre_controller: ejecutar antes de cargar el controlador, una vez cargadas las librerías y todo el systema básico.
- post_controller_constructor: justo se ejecutar tras el constructor del controlador pero antes de cualquier función.
- post_controller: se ejecutará una vez lo haya hecho el controlador.
- display_override: esto es para sobrescribir la función que nos muestra la pagina finalizada en el navegador.
- cache_override: lo mismo pero para la función de cache, nos permite sobreescrivirla.
- scaffolding_override: para crear nuestro propio scaffolding.
- post_system: ejecutará el código al final de todos los procedimientos.
En la user_guide de Codeigniter podréis encontrar esta información más extendida.
Bien, para que quede más claro, vamos a ver un ejemplo. En este caso supondremos que estamos trabajando en una página web multilenguaje. Y queremos crear un 'hook' que nos lea una variable de sesión que contiene el idioma que hay seleccionada y con eso nos cargue el idioma especificado (para los que no sepáis como funciona la "language class", echarle un vistazo en la guía).
Extender Helpers en CodeIgniter
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.
