Diseño de páginas web en Bogotá - Bucaramanga.
Páginas web económicas y profesionales.
ITW Servicios.

Codeigniter: form_validation callbacks con HMVC

Escrito por Johan Naranjo el . Posteado en Desarrollo, Software, Tips

Voy a tratar un tema un poco más técnico de lo que acostumbro en este sitio, sólo para ahorrar unas horas de quebradero de cabezas a quien pueda necesitarlo.  Llevo ya un tiempo trabajando con el framework codeigniter de php, el cual entre muchas de sus virtudes tiene el inconveniente de no manejar una estructura de módulos de fábrica.  Afortunadamente contamos con la extensión HMVC que permite implementar justo esa funcionalidad y creo que la gran mayoría de los que utilizamos el framework adoptamos la extensión. Esta extensión es bastante útil y no es muy complicada de implementar, hasta ahora no había tenido problemas utilizándola hasta ahora que por arte de magia algo no me funcionaba bien y realmente tuve que darle demasiadas vueltas porque no entendía la razón. La historia es la siguiente:  estaba yo trabajando en las validaciones de un formulario y por primera vez tuve que hacer uso de una función propia para validar un campo, según la documentación oficial ésto se puede lograr colocando el nombre de la función dentro de las reglas de validación anteponiendo “callback_”, por ejemplo digamos que creamos esta función para validar: [php]public function username_check($str) { if ($str == ‘test’) { $this->form_validation->set_message(‘username_check’, ‘The %s field can not be the word "test"’); return FALSE; } else { return TRUE; } }[/php] La regla de validación quedaría de la siguiente forma: [php]$this->form_validation->set_rules(‘username’, ‘Username’, ‘callback_username_check’);[/php] Muy sencillo de hacer… a menos que estemos trabajando con HMVC, en este caso la función es como si no existiera, mágicamente, no hay errores, no hay advertencias y la validación se la pasa por la galleta.  Después de hacer rituales de exorcismo al computador y darle vueltas durante un buen tiempo al fin encontré este post en el que explican la solución a esta situación y es lo que paso a detallar a continuación. Lo primero es extender la librería form_validation del codeigniter, creando un archivo en el directorio “libraries”  de nuestra aplicación con el nombre “MY_Form_validation.php”  y que contenga el siguiente código: [php]<?php if (!defined(‘BASEPATH’)) exit(‘No direct script access allowed’); class MY_Form_validation extends CI_Form_validation { function run($module = ”, $group = ”) { (is_object($module)) AND $this->CI =&amp; $module; return parent::run($group); } }[/php] Luego quitamos el “public” en la función de validación que creamos y cambiamos la ejecución de la validación de: [php]if ($this->form_validation->run() == FALSE)[/php] a: [php]if ($this->form_validation->run($this) == FALSE)[/php] Y con esto ya nos debería funcionar correctamente nuestra regla de validación.

Etiquetas:, , , , ,

"Trackback" Enlace desde tu web.

Comentarios (3)

  • ironman

    |

    ironman

    Blog ITW Codeigniter: form_validation callbacks con HMVC » Blog ITW

    Responder

  • Santiago

    |

    hola Disculpa yo tengo ese problema ya cree el archivo en la system / libreria MY_Form_validation pero no entendí esto

    Luego quitamos el “PUBLIC” en la función de validación que creamos y cambiamos la ejecución de la validación de: [php]if ($this->form_validation->run() == FALSE)[/php] a: [php]if ($this->form_validation->run($this) == FALSE)[/php] Y con esto ya nos debería funcionar correctamente nuestra regla de validación
    ESTE ES MI CONTROLADOR SI ME PUDIERAS AYUDAR TE LO AGRADECERÍA MUCHO:
    load->model(‘M_usuario’);

    $this->load->model(‘login/users’);
    $this->load->helper(‘url’);
    $this->load->helper(‘form’);
    $this->load->library(‘form_validation’);
    $this->user = @$this->session->userdata(‘logged_user’);

    }

    function usuario(){
    $this->form_validation->set_rules(‘nombre’,’Nombre’,’trim|required|min_length[1]‘);
    $this->form_validation->set_rules(‘username’,’Username’,’trim|required|min_length[4]‘);
    $this->form_validation->set_rules(‘password’,’Password’,’trim|required|min_length[6]‘);
    $this->form_validation->set_message(‘required’,’El Campo: %s, Es Obligatorio’);
    $this->form_validation->set_message(‘required’,’El Campo: %s, Es Obligatorio’);
    $this->form_validation->set_message(‘required’,’El Campo: %s, Es Obligatorio’);

    }

    //http://localhost/sistema/user/admin/add
    public function add() {

    if(!@$this->user) redirect (base_url());
    $datos['title']=’.:: Agregar User ::.’;
    $this->load->view(‘plantilla/header’,$datos);

    if ($this->input->post()) {
    $this->usuario();
    if ($this->form_validation->run() == TRUE){
    $datos_insert = $this->input->post();
    unset($datos_insert['btn_guardar']);
    $id_insertado = $this->M_usuario->add($datos_insert);
    //me redimenciona a el inicio una vez registrado correctamente
    redirect(base_url());
    }else{
    $this->load->view(‘registro’);
    }

    }else{
    $this->load->view(‘registro’);
    }

    $this->load->view(‘plantilla/footer’);

    }

    }

    Responder

  • Santiago

    |

    esta es la parte inicial del constructor donde cargo la libreria
    public function __construct()
    {
    parent::__construct();
    $this->load->model(‘M_usuario’);

    $this->load->model(‘login/users’);
    $this->load->helper(‘url’);
    $this->load->helper(‘form’);
    $this->load->library(‘form_validation’);
    $this->user = @$this->session->userdata(‘logged_user’);

    }

    Responder

Deja un comentario


− ocho = 1