martes, 28 de agosto de 2012

CodeIgniter: Guardando el contenido de nuestro formulario


Buenas a todos, en este nuevo post voy a continuar con CodeIgniter, pero en esta oportunidad vamos a guardar el contenido del formulario creado en el post anterior.

Para recordar un poco lo que hicimos en el post antes mencionado, creamos un formulario con tres campos: nombre, usuario y clave. Y el submit del formulario redirecciona a prueba/guardar, que como vimos, es el controlador prueba, la función guardar.

Ahora vamos a hacer unos cambios en configuración para que las actividades de este post puedan funcionar.

Primero nos vamos al archivo config/autoload.php, y en el vamos a buscar la posición en el arreglo de nombre libreries, y en el vamos a colocar array('form_validation','database','session').

Con esto estamos cargando la librería para validar nuestro formulario, guardar sesiones y poder conectarnos a base de datos.

Luego, nos vamos a config/config.php, y buscamos la posición en el arreglo de nombre global_xss_filtering, y cambiamos su valor de false a true; y $config['encryption_key'] = 'prueba', en donde prueba puede ser cualquier valor. En internet se pueden encontrar diferentes paginas que te generan esta clave, una que usado en oportunidades y me ha funcionado, es http://jeffreybarke.net/tools/codeigniter-encryption-key-generator/.

Con estos pequeños cambios, por ahora, estamos bien.

Como vamos a guardar en base de datos, necesitamos tener una, por lo tanto, creamos una base de datos llamada blog (pueden usar cualquier nombre), y en ella ejecutan el siguiente script:

CREATE TABLE `usuarios` (
  `id_usuarios` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(45) NOT NULL,
  `clave` varchar(45) NOT NULL,
  PRIMARY KEY (`id_usuarios`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Adicionalmente, necesitamos un usuario que tenga permisos sobre esta base de datos, yo me cree un usuario llamado blog, con clave 123456 y con permisos de select, insert, update y delete.

Ahora bien, una vez que hemos creado la base de datos y hemos hechos los cambios de configuración, procedemos a crear la función guardar, la cual se va a encargar de validar que los datos que llegan están correctos, y de ser así son almacenados en BD.

Este es el código de la función:

public function guardar(){
       
        $datos['titulo'] = "Prueba en CodeIgniter"; // titulo de la pagina
       
        $this->form_validation->set_rules('txtnombre','Nombre','trim|required');
        $this->form_validation->set_rules('txtusuario','Usuario','trim|required');
        $this->form_validation->set_rules('txtclave','Clave','trim|required|md5');
       
        if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('formulario_view',$datos);
        }else{
            $this->load->model('db_model');
           
            $sql = "Insert into blog.usuarios values (default,'" . $this->input->post('txtnombre') . "','" . $this->input->post('txtusuario') . "','" . $this->input->post('txtclave') . "')";
            $return = $this->db_model->ejecutar($sql);
            if($return){
                $this->session->set_userdata('mensaje','El usuario fue agregado correctamente');
                redirect('prueba/formulario');
            }else $datos['error'] = "Ocurrió un error al insertar el usuario en el sistema";
            $this->load->view('formulario_view',$datos);
        }
       
    }

Vamos a analizar un poco el código.

Con set_rules, establecemos las reglas de validación, en nuestro caso le estoy diciendo que el campo txtnombre, en caso de que exista un error, se llama Nombre, y voy a validar, que sea obligatorio y quitando los espacios en blanco al comienzo y al final. En el caso de clave es igual, pero le agrego que aparte de validar lo convierta a md5.

Un dato importante, el idioma por defecto de CodeIgniter es el ingles, es decir, todos los mensajes, eso incluye los de error, son en ingles; por lo tanto, si queremos que los mensajes de error que produzca el form_validation, sean en español (o en otro idioma), podremos hacerlo de cualquiera de estas dos formas ( son las que conozco, no se si existen otras):

  • La primera es colocando después o antes de nuestras rules (es indiferente)
$this->form_validation->set_message('required','El campo %s es requerido');
('required' es la regla a la que le estamos creando un mensaje; y el %s es para que sea sustituido por el nombre del campo; el segundo parámetro colocado en el rules)

  • La segunda forma, es descargando el paquete "Download all" de https://github.com/EllisLab/CodeIgniter/wiki/Language-Translation. Dentro del archivo descargado, esta una carpeta de nombre "es", la cual vamos a colocar en system/language, y vamos a renombrar por spanish. Una vez hecho esto, vamos a config.php, y cambiamos nuestro idioma a español $config['language']    = 'spanish'.
 Aplicando cualquiera de las formas, vamos a tener los mensajes de error, del form_validation, en español.

Luego de aplicar las reglas, preguntamos por el resultado de la validación, esto lo hacemos con  $this->form_validation->run() == FALSE, de ser correcto en que hubo un error (en el caso de cuando inicia la pagina, no hay error pero igual ingresa por aquí), redirigimos a la vista formulario_view para que muestre los errores; en caso contrario almacenamos en BD, esto lo hacemos cargando el modelo "db_model", el cual va estar colocado en la carpeta model, y en nuestro ejemplo se va a llamar db_model.php, y tiene el siguiente código:

class Db_model extends CI_Model{
   
    public function __construct()
    {
        $this->load->database();
    }
    public function ejecutar($sql){        $query = $this->db->query($sql);
        return $query;
    }
   
   
}

En caso de que falle la inserción en BD ($this->db_model->ejecutar($sql)) , guardamos un mensaje de error y llamamos a la vista para que lo muestre. De estar todo correcto, guardamos en una variable de sesión un mensaje, e invocamos al controlador formulario (el cual creamos en el post anterior) pero ahora le vamos a agregar las siguientes lineas antes de invocar a la vista
             $mensaje = $this->session->userdata('mensaje');
             if($mensaje != '') $datos['exito'] = $mensaje;
             $this->session->sess_destroy();
Con esto guardamos el mensaje antes escrito en la sesión, y despues la destruimos.

Por ultimo, nos falta agregarle las siguientes lineas a la vista formulario_view, antes de hacer el form_open
            echo validation_errors('<div id="error">','</div>');
            if(isset($exito))
                echo "<div id=\"exito\">" . $exito . "</div>";
            if(isset($error))
                echo "<div id=\"error\">" . $error . "</div>";

 Con esto, hemos almacenado en BD el contenido de nuestro formulario.



Para poder obtener mas información de form_validation, podemos visitar la página
http://codeigniter.com/user_guide/libraries/form_validation.html

Y en español http://books.openlibra.com/pdf/CodeIgniter_Guia_Usuario_2_0.pdf (en la página 152 habla de form_validation)

No hay comentarios:

Publicar un comentario