Gestor de noticias (Cuarta parte): Formularios y validación
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.
Así que empezaremos creando un formulario con dos campos: título y cuerpo de la noticia. Para ello crearemos una nueva vista (view).
Una vez hecho crearemos una nueva función en nuestro controlador (noticias.php) que lo llamaremos “nueva”. Esta función la usaremos tanto para validar los datos del formulario como para añadir estos datos a la base de datos.
CodeIgniter nos proporciona una clase para validar los formularios de una manera muy sencilla (Validation Class). Para empezar añadiremos en nuestra vista del formulario unas pequeñas variables para que la validación funcione perfectamente.
<fieldset>
<p>< ?=$this->validation->error_string?></p>
<legend>Nueva noticia</legend>
<form method="post" action="index.php/noticias/nueva">
<label for="titulo">Titulo</label>
<input type="text" name="titulo" id="titulo" value="<?=$this-/>validation->titulo?>" />
<br />
<label for="cuerpo">Cuerpo</label>
<textarea name="cuerpo" cols="30" rows="8" id="cuerpo">< ?=$this->validation->cuerpo?></textarea>
<br />
<label for="submit"></label>
<input type="submit" id="submit" value="Enviar" />
</form>
</fieldset>
Para empezar (<?=$this->validation->error_string?>) lo que hará es mostrar los errores al validar el formulario.
Luego hay que poner en los valores por defecto del formulario esto (<?=$this->validation->name_del_campo?>) que lo que hará es que en caso de que algún elemento del formulario no valide, los que si que estén correctos no se borrarán al volver a la página. Esto es muy útil para formularios largos para no tener que reescribir todo de nuevo.
Cómo podéis ver el formulario se llamará a sí mismo, ya que como hemos dicho la misma función servirá tanto para mostrar el formulario, validarlo y añadir a la base de datos.
function nueva()
{
$this->load->library('validation');
$reglas['titulo'] = "required";
$reglas['cuerpo'] = "required";
$this->validation->set_rules($reglas);
$campos['titulo'] = "Titulo";
$campos['cuerpo'] = "Cuerpo de la noticia";
$this->validation->set_fields($campos);
if(!$this->validation->run())
{
//Se ejecutara este codigo si es la primera vez que mostramos el formulario
//o que los datos del formulario mandados no superan la validacion
$this->load->view('cabecera');
$this->load->view('noticias/nueva');
$this->load->view('pie');
}
else
{
//Cuando los datos sean correctos ejecutaremos esto de aqui
$this->db->insert('noticias', $_POST);
redirect('noticias/index');
}
}
Todas las funciones en las que usemos la clase de validacion tendran esta forma.
Primero definimos un array con cada nombre de campo del formulario (que corresponda con el atributo “name”). Aquí es donde definiremos nuestras reglas de validación. En la guía de CodeIgniter sobre esta clase os explican todas las reglas que hay e incluso cómo poder crear tus propias funciones de validación (algún día escribiré algo más concreto sobre esta clase). Al final pasamos el array a esta función ( $this->validation->set_rules($reglas);)
Luego haremos algo parecido a lo de las reglas, pero en este caso lo que haremos es definir el nombre “bueno” de cada campo. Ya que en caso de no ponerlo, si diera un error diría algo así como “El campo <atributo_name> no cumple <x requisito>”. Y lo pasamos todo por ( $this->validation->set_fields($campos);)
Luego tenemos ($this->validation->run()) que nos devolverá TRUE si ha pasado la validación, y FALSE si no la pasa o es la primera vez que vemos el formulario.
En caso de que la validación funcione, añadiremos fácilmente a la base de datos con esta función ( $this->db->insert(‘noticias’, $_POST);). Esta función sólo nos servirá si los campos del formulario coinciden en “name” con los nombres de las columnas de nuestra base de datos.
Bueno quizá pensáis que es mucho código para un formulario de 2 campos. Pero realmente cuando se hacen más largo esto acaba siendo lo mas rápido. A parte del tema de extensión con esto estaremos seguros que los formularios se rellenen con lo que queremos y así evitar XSS o SQL Injection.

Wow, muchas gracias, es lo que andaba buscando, porque quiero hacer una suerte de CMS para un blog que tengo, y viendo lo difícil que es personalizar WP, me decidí a aventurarme. Empecé a código limpio pero veo que es mucho trabajo, y CodeIgniter se ve muy flexible y fácil de usar.
Gracias por los tutoriales :D
En mi servidor utilizo code igniter, he realizado la cuarta parte de blog tutorial para gestión de noticias y hay una función que me arroja error es redirection()…
la función es redirect() y tienes la explicación en el user_guide aquí: http://codeigniter.com/user_guide/helpers/url_helper.html (al final)
para que funcione redirect() hay que cargarlo antes con
$this->load->helper(‘url’);
Hola.
Estoy siguendo este tutorial, pero tengo dudas con los formularios y he ido a bajar el codigo. Avisarte que no funciona el link.
En la linea #6 del formulario,
en lugar de:
value=”validation->titulo?>”
value=”validation->titulo?>”
Bueno, no se vio en el comentario, pero hay un slash de mas alli
hola!! he estado siguiendo tu taller me parece genial pero tengo un pequeño problemita no me muestra el sistema como tal tengo todo el codigo ero al momento de verificar la aplicacion en el navegador solo me sale el mensaje de que codeigniter esta instalado de forma correcta. ojala puedas orientarme soy nueva en la programacion y estoy tratando de hacer un proyecto del que depende una importante nota en mi carrera please!!!! help me!!
ah otra cosita no me deja descargar los codigos del taller desde esta seccion…. :(
espero tener respuestas de tu parte
xoxo
Buenas, el problema que pareces tener es porque te carga por defecto el controlador “wellcome”, eso se define en “config/routes.php”, en todo caso si accedes en index.php/noticias/index deberias verlo en ejecución.
Lo del código, lamento que no se pueda bajar, puesto que tuve “unos problemas” y tuve que borrar muchas cosas.
En todo caso el código que hay es correcto.
gracias lagarto!! ya cambie el route del mensaje y si funcionosolo que no se porque motivo no quiere agarrar el css… :S
que lastima que no se pueda disponer del codigo ayuda mucho a personas aprendices como yo jeje
xoxo ;)
Hola, con respesto a este mismo tema de validacion de formularios,al hacer referencia a la siguiente variable
validation->name_del_campo?>
dentro de un formulario no me sale ningun valor, despues de una validacion que devuelve FALSE, en mi controlador de ante mano tengo
$campos['name_del_campo']= ‘Algun valor’;
$this->validation->set_fields($campos);
Alguien tiene idea de por que puede pasar??
Hola que tal? he visto tu tutorial y esta muy bueno me ha despejado algunas dudas, soy programador php, y aunque en mi trabajo utilizamos un framework hecho por nosotros para trabajar con oracle he visto que es muy sencillo la utilizacion del codeigniter… pero tengo un problema con la funcion redirect!
tengo especificada la direccion de mi host en el config y todo…
pero al momento de redireccionar me sale que
Call to undefined function redirect() in C:\AppServ\www\codeigniter\system\application\controllers\noticias.php on line 40
justo la linea 40 es donde hago el redirect(‘noticias/index’);