HMVC: Una introducción y aplicación
Spanish (Español) translation by CYC (you can also view the original English article)
Este tutorial es una introducción al patrón Hierarchical Model View Controller (HMVC) y cómo se aplica al desarrollo de aplicaciones web. Para este tutorial, utilizaré los ejemplos provistos del CodeIgniter de la serie Scratch y demostraré cómo HMVC puede ser una modificación valiosa para tu proceso de desarrollo. Esta introducción supone que comprendes el patrón Modelo, Vista, Controlador (MVC). Te sugerimos que leas nuestra introducción a MVC para familiarizarte con el tema antes de abordar este tutorial.
¿Qué es HMVC?
HMVC es una evolución del patrón MVC utilizado para la mayoría de las aplicaciones web en la actualidad. Surgió como una respuesta a los problemas de viabilidad aparentes dentro de las aplicaciones que usaban MVC. La solución presentada en el sitio web de JavaWorld, julio de 2000, propuso que el modelo estándar, la vista y la tríada del controlador se superpongan en una "jerarquía de capas MCV padre-hijo". La imagen a continuación ilustra cómo funciona esto:

Cada tríada funciona independientemente una de la otra. Una tríada puede solicitar acceso a otra tríada a través de sus controladores. Ambos puntos permiten que la aplicación se distribuya en varias ubicaciones, si es necesario. Además, la estratificación de triadas de MVC permite un desarrollo de aplicaciones más profundo y robusto. Esto nos lleva a varias ventajas que nos llevan a nuestro siguiente punto.
¿Por qué deberías usar HMVC?
Principales ventajas de implementar el patrón HMVC en tu ciclo de desarrollo:
- Modularización: Reducción de dependencias entre las partes dispares de la aplicación.
- Organización: Tener una carpeta para cada una de las triadas relevantes hace que la carga de trabajo sea más ligera.
- Reutilización: Por la naturaleza del diseño, es fácil reutilizar casi cada pieza de código.
- Extenibilidad: Hace que la aplicación sea más extensible sin sacrificar la facilidad de mantenimiento.
Estas ventajas te permitirán obtener a M.O.R.E de tu aplicación con menos dolores de cabeza.
Configurando HMVC en CodeIgniter
Para agregar más profundidad a la serie CodeIgniter desde Scratch, veremos ejemplos de hoy en CodeIgniter. Nos guiaremos a través de los pasos necesarios para que CodeIgniter funcione con HMVC. Una vez que hayamos terminado con eso, daremos un par de ejemplos. ¡Vamos a empezar!
Prefacio
Para ejecutar aplicaciones web, necesitas un servidor web en tu computadora si no estás trabajando de forma remota. Aquí hay recomendaciones con enlaces a instrucciones de instalación:
- Windows: XAMPP 1.7.3 - Instrucciones de instalación
- Mac: Enciende tu "Web Sharing Personal" - Instrucciones de instalación
Paso 1. Descarga e instala CodeIgniter
Ve a codeigniter.com y haz clic en el enlace "Descargar CodeIgniter". Si sabes cómo instalarlo y deseas saltear este paso, haz clic aquí

Extrae el contenido del archivo zip en la raíz del documento del servidor web.
Cambia el nombre de la carpeta "CodeIgniter _1.7.2" a "hmvc Example".
Mueve la carpeta "hmvcExample/system/application" a "hmvcExample/application". Esta es una práctica común con CodeIgniter. El propósito de hacer esto es separar la aplicación del núcleo del framework. Ahora deberíamos tener un directorio que se parece a la imagen a continuación:

Abre "hmvcExample/application/config/config.php" en tu editor de elección.
Edita la url base del sitio para que coincida con la ubicación de tu instalación. En mi caso yo cambiaría
1 |
$config['base_url'] = "http://example.com/"; |
dentro
1 |
$config['base_url'] = "http://localhost/hmvcExample/"; |
Guarda tus cambios y cierra "hmvcExample/application/config/config.php"
Prueba que tenemos una versión funcional de CodeIgniter. Abre tu navegador y verifica tu "http://yourhost/hmvcExample/".
Deberías ser recibido con la pantalla "Bienvenido a CodeIgniter" a continuación:

¡Eso es todo! Haz descargado e instalado con éxito CodeIgniter. Ahora pasaremos a hacer que funcione con la extensión HMVC.
Paso 2. Descargar e instalar la extensión HMVC
Descarga la versión 5.2 de la extensión modular de CodeIgniter Wiki.

En el contenido del archivo zip hay tres archivos php:

Mueve estos tres archivos a la carpeta "hmvcExample/application/libraries/".

Vuelve a verificar tu navegador. Aún deberías ver la pantalla Bienvenido a CodeIgniter.
Es hora de agregar los módulos. Crea la siguiente estructura de directorio "application/modules/welcome/controllers/".
Mueva "application/controllers/welcome.php" a "application/modules/welcome/controllers/welcome.php".

Vuelve a verificar tu navegador. Aún deberías ver la pantalla Bienvenido a CodeIgniter.
Crea la carpeta "application/modules/welcome/views/"
Mueve "application/views/welcome_message.php" a "application/modules/welcome/views/welcome_message.php".

Haz una verificación final en tu navegador. Aún deberías ver la pantalla de Bienvenida de CodeIgniter.
¡Eso es todo! Modular Extensions está instalado correctamente.
Ejemplo de módulo de inicio de sesión
Ahora que tenemos nuestra instancia habilitada para HMVC de CodeIgniter, demostraré algunos ejemplos cortos. Para nuestro primer ejemplo, te mostraré cómo puedes aplicar restricciones de acceso de usuario a páginas o módulos completos.
Descarga y descomprime CodeIgniter de los archivos fuente de Scratch Day 6 en tu servidor web. Deberías terminar con una carpeta llamada "ci_day6/" junto con nuestro "hmvcExample/"
Crea el módulo "login" en nuestro directorio "hmvcExample/application". Debería terminar luciendo así
1 |
hmvcExample/application/modules/login/controllers/ |
2 |
hmvcExample/application/modules/login/models/ |
3 |
hmvcExample/application/modules/login/views/ |
Crea el módulo "site" en nuestro directorio "hmvcExample/application". Debería terminar luciendo así
1 |
hmvcExample/application/modules/site/controllers/ |
2 |
hmvcExample/application/modules/site/models/ |
3 |
hmvcExample/application/modules/site/views/ |
CONSEJO: Cuando trabajo con módulos, conservo una carpeta llamada RENAME con los tres controladores, modelos y vistas de carpetas vacías. Esto me ahorra un poco de tiempo cada vez que deseo crear un nuevo modelo.
Ahora copiamos los archivos del módulo de inicio de sesión desde "ci_day6/" a nuestro "hmvcExample/".
1 |
ci_day6/application/controllers/login.php |
2 |
ci_day6/application/models/membership_model.php |
3 |
ci_day6/application/views/login_form.php |
4 |
ci_day6/application/views/signup_form.php |
5 |
ci_day6/application/views/signup_successful.php |
Copia/mueve cada uno de los archivos anteriores como se detalla a continuación
1 |
hmvcExample/application/modules/login/controllers/login.php |
2 |
hmvcExample/application/modules/login/models/membership_model.php |
3 |
hmvcExample/application/modules/login/views/login_form.php |
4 |
hmvcExample/application/modules/login/views/signup_form.php |
5 |
hmvcExample/application/modules/login/views/signup_successful.php |
A continuación, copiamos los archivos del módulo site de "ci_day6/" a nuestro "hmvcExample/".
1 |
ci_day6/application/controllers/site.php |
2 |
ci_day6/application/views/logged_in_area.php |
Copia/mueve cada uno de los archivos anteriores como se detalla a continuación
1 |
hmvcExample/application/modules/site/controllers/site.php |
2 |
hmvcExample/application/modules/site/views/logged_in_area.php |
Los últimos archivos para copiar son las vistas globales y los archivos CSS y de imágenes. El asterisco (*) indica la carpeta y todos sus contenidos, incluidas las subcarpetas
1 |
ci_day6/css/* |
2 |
ci_day6/img/* |
3 |
ci_day6/application/views/includes/* |
Copia cada una de las carpetas anteriores y todo su contenido como se detalla a continuación
1 |
hmvcExample/css/* |
2 |
hmvcExample/img/* |
3 |
hmvcExample/application/views/includes/* |
Abre "hmvcExample/application/config/autoload.php" y edítalo para que se vea así:
1 |
$autoload['libraries'] = array('database', 'session'); // Need to Autoload DB and Session |
2 |
|
3 |
|
4 |
/*
|
5 |
| -------------------------------------------------------------------
|
6 |
| Auto-load Helper Files
|
7 |
| -------------------------------------------------------------------
|
8 |
| Prototype:
|
9 |
|
|
10 |
| $autoload['helper'] = array('url', 'file');
|
11 |
*/
|
12 |
|
13 |
$autoload['helper'] = array('url', 'form'); // Need to autoload url and form. |
Si aún no lo has hecho desde el paso uno, abre "hmvcExample/application/config/config.php" y edítalo para que la url base se establezca en tu ubicación adecuada.
1 |
$config['base_url'] = "http://localhost/hmvcExample/"; // web address. WARNING keep trailing / |
Abre "hmvcExample/application/config/database.php" y agrega los enlaces apropiados a tu base de datos.
1 |
$db['default']['hostname'] = "localhost"; // location of DB server |
2 |
$db['default']['username'] = "YOUR USERNAME HERE"; // username you use to connect |
3 |
$db['default']['password'] = "YOUR PASSWORD HERE"; // associated password |
4 |
$db['default']['database'] = "ci_series"; // The database you want to use |
Abre tu navegador para probar que la página de inicio de sesión muestra "http://localhost/hmvcExample/index.php/login"

Ahora para hacer esta función de inicio de sesión, necesitamos crear la tabla de la base de datos de membresía. Para esto, necesitamos crear una tabla en tu PHPMyAdmin.
Selecciona o crea tu base de datos "ci_series".
En la pestaña sQL, pega el siguiente código en el área de texto y haz clic en ir
1 |
CREATE TABLE `ci_series`.`membership` ( |
2 |
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , |
3 |
`first_name` VARCHAR( 32 ) NOT NULL , |
4 |
`last_name` VARCHAR( 32 ) NOT NULL , |
5 |
`email_address` VARCHAR( 64 ) NOT NULL , |
6 |
`username` VARCHAR( 32 ) NOT NULL , |
7 |
`password` VARCHAR( 32 ) NOT NULL |
8 |
) ENGINE = MYISAM ; |

Con la tabla membership creada, hacemos clic en el enlace Crear cuenta en la página de inicio de sesión y agregamos un usuario a la base de datos.
Inicia sesión como usuario y confirma que te encuentras en "site/members_area" del sitio. Debería verse similar a la imagen a continuación:

Haz clic en el enlace "cerrar sesión" e intenta regresar manualmente al área de miembros. verás que ya no tienes permiso para hacerlo.

Así que tenemos nuestras triadas agrupadas, pero todavía no estamos en el modo HMVC. En el controlador del sitio, encontramos una función llamada is_logged_in().
1 |
function is_logged_in() |
2 |
{
|
3 |
$is_logged_in = $this->session->userdata('is_logged_in'); |
4 |
if(!isset($is_logged_in) || $is_logged_in != true) |
5 |
{
|
6 |
echo 'You don\'t have permission to access this page. <a href="../login">Login</a>'; |
7 |
die(); |
8 |
}
|
9 |
}
|
Esta es una función relacionada con el inicio de sesión. En el modo MVC, esto es necesario porque 'site' no puede acceder al inicio de sesión. Con HMVC podemos solucionar esto.
Corta la función is_logged_in() fuera de "applications/modules/site/controllers/site.php"
Guarda site.php sin la función is_logged_in().
Abre "applications/modules/login/controllers/login.php".
Pega la función is_logged_in() en la clase.
Guarda login.php
Abre "applications/modules/site/controllers/site.php".
1 |
function __construct() |
2 |
{
|
3 |
parent::Controller(); |
4 |
$this->is_logged_in(); |
5 |
}
|
En la función __Construct(), hacemos la llamada HMVC a la función is_logged_in() de inicio de sesión, como se ve a continuación:
1 |
function __construct() |
2 |
{
|
3 |
parent::Controller(); |
4 |
// Format: modules::run('module/controller/action', $param1, $param2, .., $paramN);
|
5 |
modules::run('login/is_logged_in'); |
6 |
}
|
MVC 101 Completo
¡Ahí tienes! Hemos alterado con éxito el código de day six code en formato HMVC. El módulo de sitio ahora solicita la verificación de inicio de sesión en lugar de tener que usar la suya propia. Aunque externamente no observamos ninguna diferencia, el diseño del sitio ha sido cambiado fundamentalmente. Todas las funciones de inicio de sesión están ahora en el lugar al que pertenecen: dentro de la tríada de inicio de sesión. Esto puede parecer mucho trabajo con una pequeña recompensa, pero no es así. Cualquier cambio de inicio de sesión se puede hacer una vez. La estructura interna de la tríada se puede editar sin tener que cambiar toda la aplicación en respuesta. La replicación de código para otros controladores ya no es necesaria. Por último, pero no menos importante, todo el código relacionado está en una ubicación práctica. Este pequeño paso puede no ENCANTARTE, pero cuando profundizamos en aplicaciones más grandes y complejas, el M.O.R.E. aparente será cuán efectivo es el patrón HMVC.
Ejemplo de sección de miembros
Ahora vamos a descubrir más poder de HMVC. Acabamos de demostrar cómo llamar un módulo desde un controlador. Hay otros lugares donde puedes hacer eso también. HMVC fue construido con la interfaz de usuario (UI) en mente. Llegamos a llamar a los módulos desde nuestros puntos de vista como resultado. Aquí es donde realmente puede brillar el poder de HMVC.
Cuando llames a HMVC desde una vista, usarás los mismos modules::run().. Solo hay un requisito al hacer esto. El resultado obtenido de la llamada debe ser un fragmento de html y no una vista completa. Esto se debe a que ya estamos dentro de una vista en el momento en que llamamos a la función de ejecución. Veremos esto en acción en la página mientras editamos las vistas del módulo del sitio.
Paso 1. Editar el controlador de inicio de sesión
Vamos a crear un bloque que aparece en la parte superior de cada página con el nombre de nuestro usuario, los enlaces importantes y la opción de cierre de sesión. Los widgets de este tipo son comunes en los sitios de hoy. La imagen a continuación ilustra el resultado final.

Abre "applications/modules/login/controllers/login.php".
1 |
function cp() |
2 |
{
|
3 |
if( $this->session->userdata('username') ) |
4 |
{
|
5 |
// load the model for this controller
|
6 |
$this->load->model('membership_model'); |
7 |
// Get User Details from Database
|
8 |
$user = $this->membership_model->get_member_details(); |
9 |
if( !$user ) |
10 |
{
|
11 |
// No user found
|
12 |
return false; |
13 |
}
|
14 |
else
|
15 |
{
|
16 |
// display our widget
|
17 |
$this->load->view('user_widget', $user); |
18 |
}
|
19 |
}
|
20 |
else
|
21 |
{
|
22 |
// There is no session so we return nothing
|
23 |
return false; |
24 |
}
|
25 |
}
|
Pega/escribe el código de arriba en el controlador de inicio de sesión.
cp() recibe información de la función membership_model, get_member_details(), que creamos en el siguiente paso. Si se encuentra un usuario, mostraremos el fragmento de vista detallado en el paso tres. A partir de ahí deberíamos obtener el bloque deseado ilustrado arriba.
Guarda los cambios que hiciste en login.php
Paso 2. Editar el modelo de membresía
Notarás que llamamos get_member_details() desde membership_model. Esta función obtiene nuestra información de usuario de la base de datos y se accederá desde algunas fuentes diferentes. Vamos a trabajar en eso ahora.
Abre "applications/modules/login/models/membership_model.php".
1 |
function get_member_details($id=false) |
2 |
{
|
3 |
if( !$id ) |
4 |
{
|
5 |
// Set Active Record where to the current session's username
|
6 |
if( $this->session->userdata('username') ) |
7 |
{
|
8 |
$this->db->where('username', $this->session->userdata('username')); |
9 |
}
|
10 |
else
|
11 |
{
|
12 |
// Return a non logged in person from accessing member profile dashboard
|
13 |
return false; |
14 |
}
|
15 |
}
|
16 |
else
|
17 |
{
|
18 |
// get the user by id
|
19 |
$this->db->where('id', $id); |
20 |
}
|
21 |
// Find all records that match this query
|
22 |
$query = $this->db->get('membership'); |
23 |
// In this case because we don't have a check set for unique username
|
24 |
// we will return the last user created with selected username.
|
25 |
if($query->num_rows() > 0) |
26 |
{
|
27 |
// Get the last row if there are more than one
|
28 |
$row = $query->last_row(); |
29 |
// Assign the row to our return array
|
30 |
$data['id'] = $row->id; |
31 |
$data['first_name'] = $row->first_name; |
32 |
$data['last_name'] = $row->last_name; |
33 |
// Return the user found
|
34 |
return $data; |
35 |
}
|
36 |
else
|
37 |
{
|
38 |
// No results found
|
39 |
return false; |
40 |
}
|
¡Comenta tu código! Es una mejor práctica y ayudará a otros a entender lo que escribiste.
Línea 01: La llamada de función tiene una variable predeterminada $id. Esto nos permite una opción de encontrar un usuario por ID en lugar de por nombre de usuario. Esto se hizo opcional al establecerlo en falso en la declaración.
El resto de la función es directa y bien comentada. Consultamos la tabla membership para un usuario a través de un nombre de usuario o ID. El resultado se guarda en la matriz $data y se devuelve. Todos los demás resultados devuelven falso.
Guarda los cambios que realizaste en membership_model.php
Paso 3. Crear vista de widget de usuario
La tercera y última pieza del widget que estamos creando es el fragmento xhtml, que podemos colocar en cualquier otra vista. Esto es llamado por la función cp() del controlador de inicio de sesión que acabamos de escribir.
Abre "applications/modules/login/views/user_widget.php".
1 |
<code style="font-family: Monaco, Verdana, Sans-serif; |
2 |
font-size: 12px;
|
3 |
background-color: #f9f9f9;
|
4 |
border: 1px solid #D0D0D0;
|
5 |
color: #002166;
|
6 |
display: block;
|
7 |
margin: 14px 0 14px 0;
|
8 |
padding: 12px 10px 12px 10px;"> |
9 |
<?php echo $first_name.' '.$last_name; ?> · |
10 |
<?php echo anchor('site/members_area', 'Dashboard'); ?> | |
11 |
<?php echo anchor('site/profile/'.$id, 'Profile'); ?> | |
12 |
<?php echo anchor('site/messages/'.$id, 'Messages'); ?> | |
13 |
<?php echo anchor('login/logout', 'Logout'); ?> |
14 |
</code>
|
Nota: No es una buena práctica usar el estilo en línea. Opté por poner esta instancia de estilo en línea por el bien de permanecer en el tema.
Este bloque de código con estilo toma la información pasada desde la función cp(). Generamos los enlaces utilizando la función anchor() del helper de CodeIgniter. Se puede encontrar más información sobre la guía del usuario en codeigniter.com.
Después de trabajar en esos tres archivos, probaremos la página "login/cp". Deberíamos ver algo como la imagen de abajo. Nota: Debes iniciar sesión para verlo. Asegúrate de hacerlo antes de consultar la página o no verás nada.

Paso 4. Editar el controlador Site
Los enlaces en el fragmento de perfil y mensajes devolverán un error por el momento. Esto está bien porque aún no hemos creado esas funciones. Hagámoslo ahora.
Abre "applications/modules/site/controllers/site.php".
1 |
<?php
|
2 |
class Site extends Controller |
3 |
{
|
4 |
function __construct() |
5 |
{
|
6 |
parent::Controller(); |
7 |
}
|
8 |
|
9 |
function members_area() |
10 |
{
|
11 |
modules::run('login/is_logged_in'); |
12 |
$this->load->view('logged_in_area'); |
13 |
}
|
__construct()
A los fines de este ejemplo, eliminaremos el...
1 |
modules::run('login/is_logged_in'); |
... de la función para que podamos hacer partes específicas privadas y tener otras partes públicas.
members_area()
Queremos que solo los usuarios que hayan iniciado sesión accedan al área de panel de miembros. Por lo tanto usaremos la función HMVC modules:run y llamaremos a la verificación is_logged_in desde el controlador de inicio de sesión. A continuación, cargamos el archivo de vista logged_in_area que se editará más abajo en la página.
1 |
function messages() |
2 |
{
|
3 |
modules::run('login/is_logged_in'); |
4 |
$this->load->model('login/membership_model'); |
5 |
$user = $this->membership_model->get_member_details($this->uri->segment(3)); |
6 |
if( !$user ) |
7 |
{
|
8 |
// No user found
|
9 |
return false; |
10 |
}
|
11 |
else
|
12 |
{
|
13 |
// display our widget
|
14 |
$this->load->view('member_messages', $user); |
15 |
}
|
16 |
}
|
messages()
Al igual que members_area(), solo queremos usuarios conectados, por lo que hemos incluido la verificación is_logged_in. Ya hemos escrito el código sobre cómo obtener detalles de usuario de la base de datos, así que cargaremos el modelo de inicio de sesión, membership_model. Esto nos permitirá obtener la información del usuario a través de la función get_member_details(). El tercer segmento de URI que se pasa a esa función es una identificación para el usuario para el que deseamos recibir mensajes. Por ejemplo, si la url fue:
1 |
http://localhost/hmvcExample/index.php/site/messages/43 |
Entonces nuestra función get_member_details() recibiría "43" como variable de entrada. Según el resultado de get_member_details(), se muestra la vista: member_messages o no obtenemos nada (como resultado de una consulta fallida).
1 |
function profile() |
2 |
{
|
3 |
$this->load->model('login/membership_model'); |
4 |
$user = $this->membership_model->get_member_details($this->uri->segment(3)); |
5 |
if( !$user ) |
6 |
{
|
7 |
// No user found
|
8 |
$data['main_content'] = 'member_profile'; |
9 |
$data['notice'] = 'you need to view a profile id'; |
10 |
$this->load->view('includes/template', $data); |
11 |
}
|
12 |
else
|
13 |
{
|
14 |
// display our widget
|
15 |
$user['main_content'] = 'member_profile'; |
16 |
$this->load->view('includes/template', $user); |
17 |
}
|
18 |
}
|
19 |
}
|
profile()
Como cualquier red social; queremos que las páginas de perfil sean públicas. Por eso es que no hemos incluido la verificación de is_logged_in. Al igual que los mensajes, llamamos membership_model de la tríada de inicio de sesión y consultamos la base de datos para nuestro usuario deseado. En este caso, si no se encuentra un usuario, lo dejamos con más gracia. También notificamos al visitante que se debe especificar una identificación. Con un resultado exitoso, vemos el perfil del miembro.
Paso 5 Editar vista de área cuando el usuario inicie sesión
Abre "applications/modules/site/views/logged_in_area.php".
1 |
<!DOCTYPE html>
|
2 |
<html lang="en"> |
3 |
<head>
|
4 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
5 |
<title>untitled</title> |
6 |
</head>
|
7 |
<body>
|
8 |
<?php echo modules::run('login/cp');?> |
9 |
<h2>Welcome Back, <?php echo $this->session->userdata('username'); ?>!</h2> |
10 |
<p>This section represents the area that only logged in members can access.</p> |
11 |
</body>
|
12 |
</html>
|
Sobrescribe el contenido del archivo con el código anterior.
Línea 08: HMVC se pone en acción aquí. Nuestra vista llama a la función "login/cp", y reproduce el fragmento html exactamente donde lo indicamos. ¿Te das cuenta de que no tuvimos que preparar nada nosotros mismos? Todo se maneja internamente al iniciar sesión para nosotros. Práctico, ¿no?
Guarda los cambios que realizaste en logged_in_area.php. Tu página terminada debería mostrarse como:

Paso 6. Crear la vista de mensajes de miembros
Crea una nueva vista: "applications/modules/site/views/member_messages.php".
1 |
<!DOCTYPE html>
|
2 |
<html lang="en"> |
3 |
<head>
|
4 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
5 |
<title>untitled</title> |
6 |
</head>
|
7 |
<body>
|
8 |
<?php echo modules::run('login/cp');?> |
9 |
<h2><?php echo $first_name; ?>'s Messages</h2> |
10 |
<p>This could be where the messaging system gets displayed</p> |
11 |
</body>
|
12 |
</html>
|
Escribe o pega el código de arriba en el archivo recién creado.
Esta vista es básicamente una clonación del área de miembros para probar que el inicio de sesión se mantiene en varias páginas. Hay una diferencia: extraemos cierta información del membership_model del módulo de inicio de sesión. Esto se muestra como la variable $first_name.
El objetivo de obtener información del usuario aquí sería pasarla a un módulo que devolvería un fragmento con los mensajes del usuario.
Guarda los cambios que realizaste en member_messages.php. Tu página terminada debería mostrarse como:

Paso 7. Crear la vista de perfil del miembro
Crea una nueva vista: "applications/modules/site/views/member_profile.php".
1 |
<?php echo modules::run('login/cp');?> |
2 |
<?php if( isset($notice) ): ?> |
3 |
<h2>Member Profile Pages</h2> |
4 |
<p><?php echo $notice; ?></p> |
5 |
<?php else: ?> |
6 |
<h2><?php echo $first_name; ?>'s Profile</h2> |
7 |
<p>Put all the good wholesome profile info here!</p> |
8 |
<?php endif; ?> |
Escribe o pega el código de arriba en el archivo recién creado.
Tenemos una declaración if que detecta si un usuario fue encontrado o no. Si no, nos llevan a una página de error que indica que necesitamos una identificación para ver un perfil.
De nuevo, recuperamos la información del usuario. Al igual que los mensajes, lo usamos para recuperar la lista de amigos del usuario, la última entrada de blog y la fuente de actividad, etc.
Guarda los cambios que realizaste en member_profile.php. Tu página terminada debería mostrarse como:

¿Qué sucede cuando cerramos sesión?
Como queremos que las páginas de perfil sean públicas, aún deberían mostrarse. Menos el widget de usuario, por supuesto.

Cuando inicias sesión, y accedemos al perfil sin un tercer segmento uri, vemos nuestro propio perfil. Desconectado, se mostrará el error a continuación.

No deberíamos poder ver el mensaje o el tablero. Cuando revisamos la página de mensajes, somos recibidos con esto:

¡Terminamos!
¡Eso es todo! Hemos agregado más profundidad a nuestro ejemplo inicial y demostramos las diferentes formas de usar HMVC.
- Llamamos a modules::run() desde un controlador.
- Mostramos modules::run() desde una vista para mostrar un fragmento de HTML.
- Cargamos un modelo de otro módulo.
Espero que esta haya sido una experiencia iluminadora. HMVC es un patrón extraordinario que hace que las aplicaciones sean más robustas. Bien vale la inversión. Dale una oportunidad. ¡Prometo que nunca querrás volver a MVC vainilla!



