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. Que bueno saber de más screencast ! felicidades y feliz 2010

  2. Gorka dice:

    No deberias dejar de hacer screencast de CodeIgniter, no digo que no hagas otros sobre CSS,algun framework de javascript,diseño, maquetacion,…lo que quieras, siempre sera bienvenido, pero no abandones a CodeIgniter,el nunca lo haria contigo, ademas quedan muchos temas que no has tratado aun :), felicidades por la web y por los videos de calidad, saludos.

  3. Nicho dice:

    Antes que otra cosa, feliz año nuevo amigo David y que éste sea próspero para tí y tu familia.
    Tus videotutoriales han sido de gran ayuda para mi en el aprendizaje de code igniter y me gustaría que algún días; si no es mucho pedir, pudieras enseñarnos a hacer listas dependientes con code igniter. Espero explicarme a que me refiero, es de ese tipo de listas que cuando seleccionas, por ejemplo una marca de coches aprezca en otra los modelos de coches y al seleccionar el modelo en otra lista aparezca el color disponible para el modelo, espero haberme dado a entender.

  4. Nicho dice:

    acá un ejemplo de lo que te comenté en el post anterior, espero no sea mucho pedir 🙂 http://www.ajaxray.com/Examples/depend-1.3.x.html

  5. David Rojas dice:

    @Nicho Gracias! Pues ando mal de tiempo ahora, y tenía otras cosas en mente para próximos artículos (tengo un videotutorial sobre CSS medio preparado). De todas formas lo que me comentas es más un problema de javascript que de CodeIgniter. La complicación reside en la parte de javascript para ir seleccionando y sustituyendo los valores en los select, las llamadas a CodeIgniter son sólo llamadas a controladores que extraen de la base de datos cada array con la lista correspondiente. Una buena forma de pasar estos datos podría ser usando JSON y después generando el select en javascript a partir de ese array JSON. Investiga por ahí, y no dudes en preguntar si tienes alguna duda 🙂

  6. Nicho dice:

    Muy bie, gracias por tu orientación, ahora mismo estoy viendo como instalar el helper de json para empesar con prubas, estamos en contácto y nuevamente, gracias!!! 🙂

  7. glimachi dice:

    Hola DAvid, me complace que haya personas dedicadas con este framework, Mil Felicitaciones, sigue adelante, son muy buenos materiales y videos, ami en particular me costo mucho introducirme con este framework y fucionarlo con ajax utilizando prototype, pero lo hice jaja,gracias a este y otros tutoriales que postean personas como tu GRaciasss,
    pero me quedo corto con las librerias propias de codeigniter, como no hay muchos ejemplos al respecto en la documentacion, y me parece que son muy buenos
    aportes los que haces. Mi consulta seria si hubiese la posibilidad de manejar frames o marcos con codeigniter, cosa que no lo consegui, por que no maneje adecuadamente creo los load->view(); y base_url(); me salia errores en el index que contiene a los marcos.
    En cuanto a codeigniter, me parecio un buen framework muy organizado (MVC) y entendible a la hora de programar, en serio que es muy bueno.

  8. glimachi dice:

    @Nicho, que tal, disculpa que me entrometa en tu consulta a David, pero por ahi ayudo jaja, ese problema que tienes yo lo tropese, pero lo solucione con prototype (ajax),ya que yo no manejo JSON jijiji,pero igual si necesitas el codigo te lo doy con un ejemplo (ltg_gtl@hotmail.com), en mi caso era sobre tres tablas departamento, provincias y localides, que son catalogos, y tenian que funcionar como el ejemplo que mencionas.

  9. Nicho dice:

    oorale!!! agradeciría iménsamente tu ayuda… te envío correo, gracias de antemano.

  10. David Rojas dice:

    @glimachi El manejo de frames es independiente del framework y lenguaje, es cuestión de tener clara la arquitectura de los frames. No es recomendable usarlos a menos que sea estrictamente necesario de todas formas. Sin ver el código no sé que problema puedes tener, pero será algo que se te ha pasado probablemente. Sobre la duda de Nicho, adelante hombre, aquí estamos para echarnos una mano todos 🙂

  11. glimachi dice:

    Bueno, haber,intentare, mostrar algo de mi frame, que no lo utilice porque no funciono, ya que lo solucione con ajax utilizando prototype,simulando un marco derecho, pero la razon por la que queria, era, por que tengo un generador de roles con menu desplegable, la cual queria que se genera a la izquierda, y no se perdiera para el usuario, que opcion desplego,y asi solo trabajaria en el marco derecho con formularios segun lo que pida del menu, y me seria mas facil recojer esos datos del formulario, con el this->post->(‘id_text’); en el controlador.
    pero como utilice, ajax, tube que mandar por java script todos los texbox que tenia que eran uno 100 mas o menos, es decir hice, doble trabajo, uno recojer por con prototype los 100 texbox, y mandarlos al controlador y de ahi recojerlos recien this->post->(‘id_text’); Espero haberme explicado, pero bueno, creo que mi requerimiento me llevaba a frame, pero lo hice de otra manera que me costo mas tiempo. Espero haberme explicado GRacias.

  12. glimachi dice:

    bueno tengo otra duda, utilice fpdf, para generar reportes, y la libreria lo añadi bien leyendo algunos posts me fue muy bien genere reportes pdf, pero intente hacer lo mismo con la clase que muchos seguro lo conocen: Spreadsheet_Excel_Reader que se utiliza para leer archivos excel, y me fue de patada, por que resulta que esta clase tiene antes un require_once, entonces creo que me va el error, por que no se como llamarlo a ese otro archivo, ya que en el codeigniter, no acepta require, ni include, debido a que todos son obejtos.
    por lo demas yo creo que llama bien a la clase principal, pero cuando se encuentra con el require, me lanza el error.
    El codigo de la clase:

    Spreadsheet_Excel_Reader.php

    require_once ‘oleread.inc’
    ..
    class Spreadsheet_Excel_Reader {
    ..
    }
    David no se si podrias, hacer algun tutorial de como configurar o adjuntar librerias de forma general, o talvez sugerirme porfavor donde me equivoque Gracias de antemano, seguire investigando esta noche en mi casita jijiji, y al compañero @Nicho,te mando mañana tempranito a tu correo, esque ahorita estoy en un cafe internet, jjajaja, ok Gracias por esperar.

  13. David Rojas dice:

    @glimachi El problema quizá te viene por la ruta, en codeigniter cuando incluyes un archivo con require debes usar la variable de entorno APPPATH, que apunta a la ruta Application, así que tendrás que hacer algo así como require_once APPPATH.'carpeta/archivo.inc', siendo carpeta el directorio (dentro de Applicaction) donde vayas a poner el archivo.

  14. glimachi dice:

    Ok, Gracias por contestar David,intentare de esa manera.

  15. glimachi dice:

    Nicho , ya te mande un ejemplo a tu correo, disculpa la demora, y espero que te sea de utilidad

  16. Nicho dice:

    Saludos!!!
    Agradezco desde aquí la buena voluntad de el amigo glimachi, ya que me envió su ejemplo y está muy bueno…gracias!!!

  17. glimachi dice:

    bueno si se puede ayudar, como dicen si la rueda ya esta hecha para que inventarse, me alegra que te sirviera Nicho.
    pero por fin pude incorporar la libreria de Spreadsheet_Excel_Reader, el Problema fue que mi archivo se llamaba no como la clase, ahi estaba el error, bueno me meresco un cocacho, jajaja. pero que se arreglo se arreglo y lee hojas excel, Gracias por los consejos DAvid al investigar el path, me di cuenta que el nombre del archivo no conincidia con la de la clase

  18. Javeir dice:

    Muchas gracias por tus tutoriales la verdad es que son muy buenos y muy entendibles espero que sigas haciendo sobre codeigniter, y me interesaria mucho que hicieras uno de como menejar el JSON pues al parecer es una opcion que te facilita mucho.
    Saludos y sigue así

  19. Hola David,
    he seguido tu manual y me da un error:

    Severity: Notice

    Message: Undefined property: Acceso::$session

    Filename: hooks/acceso.php

    Parece ser que a veces hay problemillas cargando librerías y hooks, he buscado por internet a ver si solucionaba mi problema y nada.
    En librerías si que tengo bien la llamada a session:

    $autoload[‘libraries’] = array(‘database’, ‘session’, ‘form_validation’, ‘basicauth’);

    Tampoco llamando a la libreria session desde acceso.php:
    $this->CI->load->library(«session»);

    Y la verdad es que ya no encuentro ninguna posible solución más.
    ¿Alguna idea?

  20. David Rojas dice:

    @Alberto La verdad es que no sé que problema puedes tener. Evidentemente no te está cargando la librería session. ¿Seguro que en el Acceso.php en la función identificado() tienes puesto $this->CI =&get_instance(); ? es lo único que se me ocurre que se te puede haber escapado, porque el $autoload debe funcionar.

  21. Hola david, gracias por la respuesta tan rápida.
    Pues si si que lo he puesto:

    class Acceso extends Controller {

    function identificado()
    {
    $this->CI=& get_instance();

    $controllersprivados = array(‘user’, ‘admin’);

    if($this->CI->session->userdata(‘logged_in’)==true && $this->CI->router->method ==’login’) redirect(‘admin’);

    if($this->CI->session->userdata(‘logged_in’)!=true && $this->CI->router->method !=’login’ && in_array($this->CI->router->class, $controllersprivados)) redirect(‘user/login’);

    }

    No sé que puede pasar la verdad.

    Gracias de todas formas y enhorabuena por el manual, bastante didáctico.

  22. No hay nada como escribir o enseñar algo para darte cuenta del error…
    La clase Acceso estaba heredando de Controller ;P
    me había sacado eso de la manga y por la cara y ahí estaba el pete.
    Funciona perfectamenet,
    Gracias una vez más.

  23. glimachi dice:

    Hola David Rojas, tengo una duda, respecto al Rendimiento de Codeigniter o eso tiene que ver con las caracteristicas del hardware de donde se alojara, pero desearia saber cuantos o que cantidad de registros se podrian manejar sin problemas,y que no haya desbordes de memoria o algo asi, como todo trabaja con array, y que tal si se me ocurre enviar 6 millones de registros a la vista y me salga algunos errores, o hay alguna forma de hacer pruebas de estres al Codeigniter, para garantizar hasta que maximo de registros puede manejar sin problemas. ho talvez no tenga limites de manejo de registros….??
    Disculpen por ser extensooo..

  24. David Rojas dice:

    @glimachi Todo esto depende de muchas cosas: del hardware, de la configuración de apache-php-mysql. Lo que más te puede limitar es la ram de la máquina. CodeIgniter en sí es un framework muy ligero, el problema no lo vas a tener ahí. Hay una utilidad para hacer benchmarks de Apache llamada AB (es un proyecto del mismo Apache), y con ella te puede dar una idea de cuantas peticiones por segundo puede soportar tu aplicación. Si envías 6 millones de registros a la vista… probablemente hasta el navegador se te quede frito.

  25. glimachi dice:

    Muchas Gracias David por los consejos y las aclaraciones, pues busque en el manual de codeigniter y no encontre nada al respecto,ahora estoy mas seguro que Codeigniter,no me traera, problemas,y probare esa herramienta que mencionas para mejorar mi hardaware si es necesario, segun las peticiones que tenga en el sistema, Gracias Otra vez.

  26. glimachi dice:

    Hola David, tengo una consulta, respecto al uso del active record de codeigniter, respecto al $sql=$this->db->get($tabla,$limite,$inicio); funciona bien haciendo la prueba con postgres y mysql, suponiendo que $limit =10 (mostrar 10 registros), y $inicio=20 (empieza desde el registro 20), pero cuando lo utilizo con sql server 2005, no me muestra el resultado de 10 registros, mas bien me muestra 30 registros, por que sera, o como pudiera arreglar ese inconveniente, esta prueba la hice por que me dijeron que en mi proyecto posiblemente se cambie de gestor, de mysql a postgres y luego a SQl Server 2005.

  27. David Rojas dice:

    @glimachi El problema es que SQL Server no implementa la cláusula LIMIT, entonces en Active Record no funciona tampoco. Tendrás que hacerte el query sql manualmente. Para hacer algo así me suena que en MS SQL es con SELECT TOP ... De todas formas, no recomiendo nada SQL Server, si ya lo tienes en mysql, déjalo así.

  28. glimachi dice:

    Bueno, las pruebas que hicimos en mi trabajo con mysql y postgres, son lentos cuando se hacen consultas anidadas (join,left join etc.) de gran cantidad de datos como unos 4 millones,y bueno , en sqlserver, los resultados daban en unos cuantos segundos con la misma cantidad de datos, en cambio con mysql demoraba al rededor de una hora, o halgo asi, siendo deficiente los reportes y toma de decisiones para los jefes, jijiji

  29. tonyj dice:

    Hola @David! otra vez darte las gracias por aportar tus conocimientos.;)

    Estoy siguiendo tu «saga» de codeigniter jeje, y le estoy pillando gusto a esto 😀

    He seguido todos los screencast y todo está saliendo sin problemas, el único problema es que en las direcciones tengo que agregar el index.php, y me gustaría saber como evitar esto para no tener que ponerlo, en el primer screencast comentaste que se debía tocar el archivo htaccess, pero he estado buscando y no se realmente que he de hacer.

    Ya te invitaré a un café, que la UMH me pilla muy cerca. jejej

    Un saludo!! Gracias por tu aporte 😉

  30. David Rojas dice:

    @tonyj Has visto el screencast anterior a este?: http://www.davidrojas.net/index.php/desarrollo-web/screencast-crud-con-scaffolding-rendimiento-y-unit-testing-en-codeigniter/ En el primer par de minutos explico como quitar el index.php 🙂

  31. Tif dice:

    Antes que nada felicitarte por tu post buenisimo, tengo una duda tal vez me la resuelvas que pasa si solo quiero proteger con la sesión solo ciertas funciones del controlador no todo el controlador con los hook, gracias de antemano espero me puedas ayudar.

    Hasta pronto

  32. David Rojas dice:

    @Tif En el hook, cuando compruebas con la función in_array() si el controlador que estás usando se encuentra en la variable $controllersprivados, en vez de comprobarlo con $this->CI->router->class, debes hacerlo con $this->CI->router->method (que te devuelve la función del controlador que está siendo llamada).

  33. Tif dice:

    Hola de nuevo, gracias por la inmediata respuesta, te paso la voz cuando tenga listo el proyecto :D.

    Y sí, esta funcionando todo según me diste el tip, y te cuento y para todos los que lo necesitan también que estoy haciendo un nuevo arreglo de funciones no privadas por ejm:
    $funciones_no_privadas = array(‘registro’, ‘activar’, etc.); y luego lo que me indicas en el in_array($this->CI->router->method, $funciones_no_privadas) comprobando así que los métodos no sean privados y sean llamados desde sus controladores.

    Gracias de nuevo David por la solución.

  34. glimachi dice:

    Gracias por los aportes David. mi consulta es la siguiente, con respecto a la Seguridad Codeigniter, que tipo de metodos o clases se pueden usar para mejorar la seguridad de acceso, o talvez habra que configurar algunas librerias de las tantas que tiene, esto con el objetibo de que mi sitio no sea atacado. Gracias de antemano por la respuesta.

  35. David Rojas dice:

    @glimachi Échale un vistazo a la documentación oficial al respecto: http://codeigniter.com/user_guide/general/security.html
    Realmente en cuanto al framework se refiere, tienes que tener en cuenta solo activar el global_xss_filtering (creo que lo menciono en alguno de mis videos). Los queries de la base de datos son escapados automáticamente siempre que no los gestiones por tu cuenta y lo hagas según los métodos que te proporciona el framework. El resto ya solo depende de cómo programes tu aplicación.

  36. glimachi dice:

    Muchas Gracias por la Orientación, y por el recuerdo de manejos de consultas sql utilizando Active Records de codeigniter, tomare muy encuenta lo de global_xss_filtering y buscare mas al respecto, Gracias por Todo

  37. glimachi dice:

    Una consulta, David, porfavor, estaba buscando por la web, no encontre nada, esta mi consulta, se puede llamar desde la vista a un controlador, o enviar parametros, y que el controlador devuelva los resultados directamente a la vista, es que necesito generar, combos, dependiendo de un determinado id de producto, y que el controlador me devuelva el combo ya generado con todos los articulos del producto id, eso me serviria de mucho,Gracias de antemano por la respuesta

  38. David Rojas dice:

    @glimachi No, eso no se puede ni se debe hacer nunca, si lo haces así es que estas estructurando mal tu aplicación. Debes generar todos los datos (el id del producto, el combo, etc) en el controlador, y después enviar las variables a la vista. La vista no debe contener nunca lógica del programa, solo la presentación. Si lo que quieres es que el combo se regenere según un producto en el que acabas de hacer click, sin recargar la página, puedes llamar a un controlador para generar ese combo con javascript vía ajax. No puedo decirte más, porque no sé exactamente como tienes organizada tu aplicación.

  39. glimachi dice:

    okey gracias,si ya me ubique, todo lo hare en el controlador no mas, y mandare un array(listado de articulos) por cada producto, hacia la vista,pero yo pense que se podia desde la vista invocar al controlador, que mas o menos queria hacer halgo asi:

    v_productos.php

    $v)
    {
    ?>

    llantas de aro 20
    llantas de aro 21
    llantas de aro 22

  40. David Rojas dice:

    @glimachi He borrado los comentarios que ha salido el código mal. Para pegar código utiliza un servicio como http://pastebin.com/ y pones el enlace aquí 🙂

  41. glimachi dice:

    queria realizar algo asi:

    http://pastebin.com/mwg45Aa9

  42. David Rojas dice:

    @glimachi No puedes llamar a un controlador desde la vista, pero sí puedes llamar a un helper que te hagas. De todas formas, en ese caso no es recomendable, y además es sencillo enviar todas las variables desde el controlador a la vista.

  43. glimachi dice:

    okey Gracias

  44. glimachi dice:

    David, por mas que intente no pude hacer correr mis hojas de estilo que tiene enganchados imagenes mas o menos el codigo es este:
    http://pastebin.com/uVP3AJ5B
    y como tiene una imagen que jala la url del css, no me muestra en la vista cuando empieza a ejecutarse, revise y revise pero la direccion de la imagen es esta images/botright.png, y nada,pero si se ejecuta los estilos de solo texto

  45. David Rojas dice:

    @glimachi Necesitaría ver todo el código, porque con eso no veo en qué ruta tienes situado tu CSS, ni en qué ruta las imágenes. Según eso, debes tener una subcarpeta images donde tienes el fichero css. Si tienes dos directorios, uno para CSS y otro para images, fuera de application, lo que necesitarás poner en la url() del CSS será una ruta del estilo ../images/loquesea.png. Recuerda que las imágenes que se referencian en un fichero CSS son relativas a la ruta donde se encuentra ese fichero CSS.

  46. glimachi dice:

    okey muchas gracias, por la pronta respuesta, habia sido el codigo y ../images, tenias razon, tambien fue que hacia referencia a una clase, pero deberia hacer referencia con un id por que el atributo de mi css,estaba escrito asi:
    #rounded-corner tfoot td.rounded-foot-right
    bueno ahora si , ya esta funcionando, Gracias

  47. glimachi dice:

    tengo otra consulta David,me parece muy bueno lo de restringir a usuarios no conectados mediante hook’s que se activa despues de cargar el constructor, como mostraste en el video tutorial, pero ahora como se realizaria, si ejecuto ajax, el comportamiento es diferente, ya que cuando caduca la session, y ejecuto algun script php mediante ajax, donde deveria salir el script php, me sale mi ventana de logeo , entonces, tengo una ventana de mi proyecto y dentro de mi div esta mi ventana de logo, como podria controlar esa parte del hook con con ajax de jquery para cuando se caduque la session?

  48. David Rojas dice:

    @glimachi Una forma fácil es comprobar en el javascript cuando procesas la respuesta ajax si el resultado que esperas es el correcto, y si no lo es utilizas window.location=»url de login» para redireccionar la web a la pantalla de login.

  49. glimachi dice:

    haaaa, clarooo, parece que hare dos hooks, un que lo llamare desde funciones.js, cada vez que ejecuto un ajax y quiera cargar algo a un div y ese hook me devolvera tru o false, y lo direcionare como indicar con window.location, y si no ejecuto ajax, entonces el otro hook se encargara de enviar al login como en el video tutorial, me parece que funcionara asi, okey Gracias

  50. glimachi dice:

    David tengo una duda,estube leyendo el libro Professional
    CodeIgniter®
    Thomas Myer

    en el cual menciona que las sessiones de codeigniter no son seguras por el manejo de cookies y que puede traer conflictos por su manipulacion, y tambien porque tiene tamaño limite, en cambio aconseja la session nativa de php para mas seguridad, no se que hacer, me dejo con una gran duda si utilizar o no, ya que sus sesiones de codeigniter tienen encripacion y otras cosas mas

Deja un comentario

Time limit is exhausted. Please reload the CAPTCHA.

RSS iTunes podcast Twitter

Categorías

Enlaces

Archivos