Está en: » Blog »

HMVC – Sistema modular en codeIgniter

HMVC – Sistema modular en codeIgniter

codeIgniter

HMVC es un “plugin” que nos permite pogramar módulos bajo el framework codeigniter.

En un principio, la librería nos permite tener para cada módulo los controladores, modelos, vistas y librerías que necesitemos. Es una librería realmente potente ya que incluso nos permite cargar la salida de una función de un controlador en otro controlador.

Página y archivo de descarga:
http://codeigniter.com/wiki/Modular_Extensions_-_HMVC/

Instalación:

Copiamos todos los archivos (Controller.php, Modules.php y MY_Router.php) en la ruta application/libraries.

Una vez copiados dichos archivos, creamos una carpeta llamada modules dentro de application y en su interior crearemos los módulos necesarios. Cada módulo deberá tener varias carpetas: config, controllers, models, libraries y views.

Lógicamente, dentro de controllers, meteremos los controladores, así como en las respectivas carpetas.

Funcionamiento básico:

Si el nombre y clase del controlador tiene el mismo nombre que la carpeta del módulo, este se llamará automáticamente cuando accedamos sólo especificando el nombre del módulo (ej: http://miaplicacion/modulo ó http://miaplicacion/modulo/funcion). En caso contrario, para acceder a dicho controlador lo haríamos así: http://miaplicacion/modulo/clase/funcion

La carpeta config sólo nos servirá (de momento) para:

  • autoload.php: funcionamiento como el de codeigniter. Nos servirá para cargar automáticamente las librerías, modelos… necesarios para el módulo.
  • routes.php: funcionamiento como el de codeigniter. Nos servirá para hacer la configuración de rutas y redirecciones para dicho módulo.

Cuando llamamos a una librería, modelo o vista, por defecto se busca dentro de la carpeta del módulo y si no se encuentra las busca en application y si tampoco las encuenta busca ya en último lugar en system.

Métodos básicos de funcionamiento:

El funcionamiento de cada módulo es como si fuese una aplicación diferente para cada uno.

Podemos recojer la salida del controlador/vista de otro módulo y guardarla o mostrarla según nos convenga (sólo para la versión php5). Sería como llamar a una vista pasándole como tercer parámetro TRUE.

$retorno = modules::run('modulo/controlador/funcion/', $parametro1, $parametro2, $parametro...);

Podemos cargar también un controlador como si fuese una librería:

$this->load->module('modulo/controlador', $parametro1, $parametro2, $parametro...);
$retorno = $this->controlador->funcion();

Aunque lo carguemos como una librería, el controlador cargado seguirá llamando a sus modelos, vistas y demás como si fuese independiente.

Para modelos, vistas y librerías, el funcionamiento es tal cual a codeigniter y podemos acceder a otros módulos anteponiendo el nombre del módulo al archivo:

$this->load->model('modulo/modelo_model');

En la página de la librería podemos encontrar algunos módulos ya desarrollados como una galería fotográfica, captcha, etc…

Discussion

  1. julian dice:

    Hola, muy interesante. Podrías comentarme a ver si esto de usar módulos sirve por ejemplo en el caso donde tengo un cuadro de login, y quiero que ese cuadro aparezca en el sidebar de una página? O por ejemplo si quisiera tener un cuadro de Carrito de Compra y hacerlo aparecer siempre en determinada posición de las páginas? Estoy vbien rumeado o no?

  2. Tu ejemplo y pregunta me ha dejado un poco descolocado.
    No sé exáctamente si entiendo tu pregunta así que intentaré resumir un poco para qué sería esto.
    Para empezar, es php, lo cual es un lenguaje de programación de servidor.
    CodeIgniter es un framework para php y poco tiene que ver con formularios de HTML.

    Dicho esto, HMVC es una librería que nos aporta la funcionalidad de la programación modular en el framework codeIgniter (programación php en el lado del servidor).

    Esta librería nos permite hacer partes independientes de una aplicación, de forma que al unirlas, nos queda la aplicación funcional.

    Por ejemplo, un módulo podría ser una galería fotográfica.
    Imaginemos que tenemos un módulo de galería fotográfica que se llama galeria. Al entrar a http://miaplicacion.com/galeria estaríamos accediendo a la programación de dicho módulo. Osease, una función de ese módulo se ejecutaría y por ejemplo, leería las fotografías guardadas en una base de datos, comprobaría si están guardadas en el servidor y las maquetaría en html para enviárselo al navegador y que este las muestre.

    Espero haberte aclarado el dilema…
    Saludos

  3. Mariano dice:

    Miguel muchas gracias por compartir, el artículo está muy bueno. Lo encontré en el momento justo ya que planeo migrar mi aplicación para comenzar a utilizar una estructura modularizada.
    Saludos!

  4. Perico dice:

    Muy interesante la informacion

  5. Jashk dice:

    Excelente tutorial, ya me había iniciado en el manejo de la extensión, pero tenia algunos problema con la llamada a módulos.

  6. DooBie dice:

    Hola, hace unos dias que leí tu artículo y me puse ha probar “esto” de los modulos.
    Al principio se me antojo muy sencillo y rapido de ir ampliando una aplicación, pero me he encontrado con un problema que no doy con la solución.

    Tengo creados varios modulos, con controladores y vistas, pero sin ningun modulo específico para esos modulos. Ahora, queria crear un model para un modulo en concreto, y me dije ‘Pues lo pongo en la carpeta application/modules/moduloxxx/model/modulo_model.php’ y lo cargo como siempre ‘$this->load->model(‘Modulo_model’)’ Pero me salta siempre el error de No encuentra el fichero.
    En cambio, si lo muevo al directorio ‘application/models’ SI me lo carga sin problemas.

    Alguna idea?

    Muchas gracias, y buen articulo, por si no lo habia dicho :)

  7. @DooBie
    Has probado con..
    $this->load->model(‘modulo/modelo_model’);
    ??

    donde modulo es el nombre del módulo y modelo_model es el nombre del modelo.

  8. Nicho dice:

    Interesante, pero hay algo que me gustaría que alguien me ayudara. ¿cómo puedo hacer para integrar otros scripts en code igniter?, por ejemplo, yo uso http://mibew.org/ como sistema de ayuda en linea. ¿cómo se integran ese tipo de aplicaciones CI? Sin CI sólo se instalan en una carpeta, pero no entiendo como hacer esto en CI ¿alguien sabe como?

  9. Puedes hacerlo de muchas maneras. La más fácil y sencilla es seguir haciéndolo tal y como lo haces hasta ahora. Osease, lo metes en una carpeta y punto.

    Alguna que otra vez que he usado algún sistema integrado más grande y complejo que un simple script, en vez de meterlo con codeigniter, para evitar problemas hice un subdominio donde lo instalé y andando. Esto ya es decisión de cada uno.

    El integrarlo de una mejor forma suele conllevar un trabajo extra. Por ejemplo, lo podríamos integrar como un módulo con esta librería, pero habría que destripar gran parte del programa para implementar las vistas modelos y controladores en sus respectivos sitios, algo que no sería muy viable. Se podría hacer más liviano metiéndolo todo como si fuesen librerías de ese módulo y creando un controlador básico que reciba parámetros y se los pase, pero sería algo más “chapucero”.

    En definitiva, te recomiendo que sigas usándolos como si no tuvieses codeIgniter cuando se trata de proyectos algo más grandes de unas simples librerías y que están en constante cambio/desarrollo.

    Saludos…

Deje su comentario

Previsualización de comentario
  1. Anónimo dice:





Pings para esta entrada