Videotutorial: Hooks y creación de librerías con Codeigniter

codeigniter_screencast_hookA petición popular he creado un último screencast sobre CodeIgniter. En él os voy a enseñar un par de conceptos importantes para extender la funcionalidad del framework: los hooks y la creación de librerias. Como ejemplo crearé un sistema muy simple de autenticación, con una librería que contendrá una función para hacer login y otra para logout, y un hook que se disparará cada vez que se ejecute cualquier controlador. Los hooks son una utilidad que nos permite llamar a una función en determinadas fases de la ejecución del framework, por ejemplo antes o después de ejecutar cualquier controlador, el constructor de éste, etc.

Podéis encontrar el resto de screencasts en la página de videotutoriales, o suscribiros al podcast de iTunes.

Descargar ficheros con el código del ejemplo.

Ver screencast (duración: 24:02)

» Advertencia: El audio está un poco desincronizado con el vídeo. En algunas partes apenas se nota, pero en otras sí, sobre todo por el final. De todas formas creo que se entienden bastante bien los conceptos, y como es un video largo no he creído necesario volverlo a grabar.

Y con este sí finalizo la serie de videos sobre CodeIgniter. Mi próximo screencast será sobre algo relacionado con CSS y frontend, así que os recomiendo que os sigáis pasando por aquí a todos los que estéis interesados en todos los aspectos del desarrollo web en general y no sólo en la programación pura de backend.

79 comentarios para “Videotutorial: Hooks y creación de librerías con Codeigniter”

  1. David Rojas dice:

    @glimachi He leído varias discusiones sobre eso. En mi opinión son lo suficientemente seguras, de todas formas puedes usar la librería http://codeigniter.com/wiki/Native_session/ que actúa como wrapper para usar todo lo que traen las sesiones de CodeIgniter con sesiones PHP nativas (aunque tiene sus cosas raras para configurarla). No creo que merezca la pena, yo utilizo las sesiones de CodeIgniter tal cual.

  2. adelangel dice:

    Segui al pie de la letra cada movimiento de el Videotutorial: Hooks y creación de librerías con Codeigniter

    y no me funciono, la mera verdad se me hace excelente el ejemplo que presentas y viendo detenidamente todos y cada uno de los pasos que seguiste no logro hacer que funcione, existe algun paso que hallas saltado?

  3. glimachi dice:

    Hola David,la consulta que tengo, es si codeigniter, tiene alguna forma, de bloquear el doble submit o el F5 que se realiza, en un formulario,o hacer que la persona no vaya atras con el explorador, y si lo hace que sea con los botones del sistema, y no con el del explorador, con el objetivo de evitar dobles envios de datos e inserciones a la base de datos. y si no tiene, hay alguna forma de hacer esto.

  4. David Rojas dice:

    @glimachi No trae nada para evitar dobles envíos. Pero puedes hacer algo así tú mismo. Lo que suele hacerse en este caso es en cada form generar dinámicamente un token único y meterlo en un campo oculto. Cuando haces el submit se comprueba si existe una variable de sesión con este token, y si no se crea. Si se volviera a enviar, la variable de sesión existiría, entonces puedes mostar un mensaje de error o lo que creas conveniente. Antes de mostrar el mensaje de éxito borras la variable de sesión, cuando hayas hecho el procesamiento necesario. No tengo ningún código de ejemplo, pero espero que veas por donde va la cosa y puedas implementarlo tú mismo.

    @adelangel ¿Has visto los demás tutoriales? Si no recuerdo mal es posible que usara como base el código del primer video. ¿Qué error te muestra?

  5. glimachi dice:

    Si gracias David, comprendido, ya cache, ahora , si que venga cualquier formulario.

  6. adelangel dice:

    Hola David, antes de todo mil gracias por la pronta respuesta,

    Si, de hecho e visto la mayoria de los viodeotutoriales, y no me muestra error alguno, lo que pasa es que no se detiene a revisar en el archivo Acceso.php, es decir, se salta el paso de revision si esta logueado y me abre de todas formas el controller home.

    de hecho implemente el codigo que tienes disponible para la comunidad, solo cambie los campos por los mios en la base de datos, es decir, usuario es para mi «cuenta», y password para mi es «clave», estos cambios los realize en los archivos basicauth.php, user.php, login_view.php.

    Cabe mensionar que estoy trabajando sobre windows xp y me instale alli el AppServ2.5.9.exe

    Agradezco de antemano la ayuda al presente.

  7. glimachi dice:

    hola David, y Gracias por contestar todas la dudas, que tenemos, estube empezando a probar la clase Upload,con el siguiente ejemplo: http://pastebin.com/eGiKpXcC y resulta que ignoraba el nombre definido por mi, en el array config, y siempre me lo sobia con el nombre que tenia el archivo que estaba subiendo, y no asi , el que yo lo colocaba, y analizando la clase añadi un if, alcodigo,y con eso funciona de maravilla tanto la encriptacion si elijo esa opcion y tambien si le manda un nombre, o de lo contrario me lo coloca, el nombre del archivo por defecto, La consulta, es que si es una falla, de esa clase o Yo no mande bien la configuracion en el Array, o se configura de otra manera para que agarre el nombre, aunque me base en el manual, y menciona que deberia relizarse asi.

  8. Juan Morfin dice:

    hola que tal david, muy buen material, me estoy actualizando con tus videotutoriales. tendras un ejemplo donde utilices update, delete, insert con ajax y utilido sistema de logeo

  9. David Rojas dice:

    @glimachi El error que veo a simple vista es que en la variable $config['file_name'] no debes incluir la extensión del archivo, la pone sola (la misma del archivo que subiste).

    @Juan Morfin Me temo que no tengo ningún ejemplo para compartir, tengo algo así implementado en la última aplicación que he hecho, pero no puedo distribuir el código (ya que a pesar de programar el proyecto entero yo solo, el código es propiedad de mis jefes). De todas formas si tienes alguna duda pregunta. En este tipo de sistemas, con CI la parte php se hace muy fácil, es en la parte de javascript para hacer el ajax donde te tocará invertir más tiempo (depende de lo que quieras hacer y cómo).

    @adelangel No sé cual puede ser el problema, revisa bien el código, porque el ejemplo funciona. Inserta echos en el acceso.php para ver si descubres qué está pasando (la forma más antigua y rápida de depurar).

  10. glimachi dice:

    Hola que tal David,Muchas Gracias por las respuestas, y el material que hay en este sitio, me ayudo un monton, La consulta, es si a parte de reportes pdf que genero para facturacion, existe otro metodo mas rapido por que demora un poco en cargar el pdf y generarlo, a parte de las hojas de estilo que se desconfigura para distintos navegadores e impresoras, ya que mi sistema , es para un intranet, pero la facturacion es donde es constante, o halgo para mejorar el rendimiento de php en cuanto a velocidad, si se debe a eso..! Gracias.

  11. David Rojas dice:

    @glimachi No creo que consigas mejorar el rendimiento de la generación de pdf, es algo que requiere bastante procesamiento.

  12. glimachi dice:

    Gracias David por la respuesta pronta,bueno tendre que buscar otros metodos, incluso por ahi lei que podriamos hacer con la interaccion de flash y php, simulando escritorio.

  13. adelangel dice:

    Antes de todo una megadisculpa por no postear antes que ya quedo solucionado, tenia un problema en el una linea de codigo, gracias por los ejemplos David, la verdad me han ayudado mucho, tengo una pregunta, yo genero los PDF’s con la libreria (class.ezpdf.php) pero como puedo hacer para integrarlo a CI y que funcione la insercion de imagenes, puesto que encontre este sitio http://abzenteno.blogspot.com/2009/12/generar-pdf-con-la-ayuda-de-ezpdf-en.html
    y todo funciona de pelos, pero no funciona la insercion de imagenes. Alguna idea u otra forma de integrar las imagenes, de antemano agradezco la atencion al presente.

  14. edco_41 dice:

    Hola David disculpa la molestia pero tengo un problemita y queria ver si me podias ayudar? bueno necesito manejar perfiles en mi aplicacion para unos niveles de seguridad y viendo tu ejemplo se aplica bien a mi necesidad pero necesito manipular la variable perfil (Perfil 1, Perfil 2, Perfil 3) para administrarla dentro de mi aplicacion! ejemplo

    campo de la B.D= id|Usuario|Password|Perfil
    el usuario ingresa usuario y pasword y se necesita retornar el perfil! como tomo en lalibreria baicauth esta variable perfil para utilizarla dentro de la aplicacion?

  15. David Rojas dice:

    @edco_41 Bueno, es sencillo, añades ese campo perfil en la BD, y guardas el perfil en una variable de sesión durante la función login() de la librería basicauth igual que hacemos con las variables logged_in, usuario e id, por ejemplo $this->CI->session->set_userdata(array('logged_in' => true, 'usuario' => $usuario, 'id' => $query->row()->id, 'perfil' => $query->row()->perfil));. Después extraes el valor cuando lo necesites con $this->CI->session->userdata('perfil'), como hacemos con las demás variables.

  16. edco_41 dice:

    Muchas gracias! David Gracias por tu aporte! mucho exito!

  17. M4RK3S dice:

    Hola David. Una pregunta corta y directa: cómo se pasan datos a un controlador desde otro controlador? No me vale por URL porque lo que quiero pasar es un email y una contraseña que irán encriptados.

    Gracias de antemano y un saludo.

  18. David Rojas dice:

    @M4RK3S No sé exactamente qué quieres hacer , pero puedes guardar esos datos en variables de sesión por ejemplo.

  19. Ronald Blanco dice:

    Hola David estube mirando los videos q subiste, y están buenisimos, nada q envidiar a los q están en inglés!!
    Ahora bien, sabes asi como varios q comentaron yo tambien tengo problemas con los PDFs, he estado usando la libreria ezpdf para CI todo va de maravilla, excepto las imágenes, no sabes de cuanta ayuda seria q el próximo video tuyo sea sobre los reportes
    Desde ya te quedo muy agradecido… Felicidades!!!

  20. sigifredo rios vasquez dice:

    hola buenas noches, estoy trabajando un proyecto basado en codeigniter, el cual valida un usuario (Bd), el cual tiene varias vistas y un controlador por cada vista,mi pregunta es si puedo redireccionar de un controlador a otro y enviar datos? me produce un error al parecer no puedo enviar arrays asociativas entre controladores?
    o tener varios controladores no es una estructura apropiada para un desarrollo?
    gracias por su respuesta

  21. yense dice:

    Hola amigo bueno tengo un problema con la lib session

    me muestra este error

    An Error Was Encountered
    In order to use the Session class you are required to set an encryption key in your config file.

    como lo puedo solucionar este problema

  22. Juan Pablo Videla dice:

    David: me ocurrió el mismo error que publica «yense», pero es un error que ocurre con la versión 2.0.2 de CodeIgniter. Si se descarga la versión 1.7.3 eso no ocurre.
    Podrá ser algo que hay que modificar en la configuración y que en la versión anterior ya viene seteado de alguna manera distinta???

    Por cierto, excelente la explicación de los 5 videos.

    Saludos

  23. dhamaso dice:

    Hola, un saludo desde México, oye he construido una página(front end/back end) con la ayuda de este video tutorial, he metido los controllers privados a un folder:

    application/controllers/admin/
    y los controllers publicos estan en: application/controllers/

    El problema esta en que tengo(por burro y por no fijarme antes):
    application/controllers/admin/categoria.php y
    application/controllers/categoria.php si te das cuenta los dos controllers se llaman igual, entonces cuando trato de acceder a
    application/controllers/categoria me redirecciona a el login, por que el hook detecta que categoria es un controller privado.

    eso se puede solucionar?
    o tengo que cambiarle el nombre a mis cotrollers ?

  24. dhamaso dice:

    posdata olvida los de .php al final (es la fea costumbre XD)

  25. Carlos dice:

    Hola David, genial tus entradas, me han ayudado mucho.
    Especialmente esta me sirve para la página que estoy haciendo, para no tener accesible el cms sin antes loguear, pero tengo un problema en el hook, y es que cuando pongo:

    $controllersprivados = array(‘home’,’usuarios’);

    me capa tanto el controlador que hay en /controllers/front/home como el que hay en /controllers/cms/home, y no me funciona poner algo como

    $controllersprivados = array(‘cms/home’,’usuarios’);

    para que solo tenga en cuenta el que tengo en cms. Hay realmente una forma de hacerlo, o tengo que renombrar los controladores del cms para que no coincidan con los de front, que es la parte publica?

  26. Carlos dice:

    Vaya, tengo el mismo problema que @ dhamaso. Has resuelto el problema sin cambiar los nombres de los controladores?

  27. Lucho dice:

    David excelentes tus videos tutoriales. Gracias por compartirlos. Quisiera preguntarte algo. Yo genero una lista de clientes despues de una consulta a mi base de datos, quiero que luego de mostrar los datos en la vista, esa misma lista si doy clic en un boton guardar, se guarde en otra tabla de mi base. Que metodo me recomiendas utilizar? He estado pensando en guardar el resultado temporalmente en una tabla, que dices tu? Gracias de antemano por tu respuesta.

  28. dhamaso dice:

    hey carlos yo solucione el problema asi:

    // preguntamos si estamos dentro de un subdirectorio y ese subdirectorio es admin
    if( !empty( $this->CI->router->directory ) && $this->CI->router->directory == «admin/»){
    redirect(‘user/login’);
    }

    No se si sea la mejor forma pero ami me funciono

  29. Julio dice:

    Muchas gracias, me funciono de maravilla, saludos

Deja un comentario

Time limit is exhausted. Please reload the CAPTCHA.

RSS iTunes podcast Twitter

Categorías

Enlaces

Archivos