Doymer Consultores

  • Increase font size
  • Default font size
  • Decrease font size
Inicio Blog Joomla! Entendiendo Joomla! 1.5
09
Enero
2010

Entendiendo Joomla! 1.5

Imprimir PDF

Voy a empezar esta colaboración intentando arrojar un poco de luz sobre el funcionamiento del entorno de Joomla! en su versión 1.5.

Hace ya algún tiempo cuando comencé con J! 1.5, y teniendo que desarrollar un componente, me encontré con el problema de que la documentación existente explicaba el modelo MVC a base de ejemplos en los que se mostraban los ficheros necesarios para pintar la famosa frasecilla 'Hola Mundo!'. Sin embargo ninguno de los documentos que encontré explicaba cómo funciona por dentro J! por lo que en cuanto me salía un poco de los ejemplos empezaba a tener problemas.

Al final me las arreglé para aprender por qué J! hace lo que hace y aprovecho para ofrecerlo a quien esté en la misma situación. Este mini tutorial no pretende explicar exhaustivamente cómo se construye un componente completo con instalador y todo (de eso ya hay muchos tutoriales), sino contar las cosas que el entorno (framework) de J! espera encontrar en su camino hacia la presentación de una página dada.

Se entra en el entorno de J! efectuando llamadas a index.php. Joomla! ha sido diseñado principalmente para entregar los datos devueltos por los diferentes componentes que tengamos instalados. Cuando introducimos una URL como index.php?option=com_<nombre> Joomla! busca la carpeta 'components/com_<nombre>' e intenta cargar el fichero 'nombre.php' de dondequiera que se haya instalado la versión de Joomla! que estemos ejecutando. Así que, si tu componente es 'com_viajes' debieras tener una carpeta 'com_viajes' dentro del directorio 'components' y un fichero llamado 'viajes.php' en su interior. Voy a llamar a este fichero (viajes.php) el 'fichero base' y, será en el en donde tendremos que realizar nuestra primera decisión acerca de si devolver el contenido HTML deseado según el viejo modelo plano o ir hacia el nuevo modelo 'Model-View-Controller' o MVC.

El modelo MVC se apoya sobre dos patas: un fichero y una clase. El entorno de Joomla! usualmente buscará un fichero determinado y, dentro de el, esperará encontrar una clase que registrar. Si alguno de los dos falta la llamada fallará.

Ponemos en marcha el modelo MVC incluyendo el controlador MVC en nuestro fichero base. El fichero del controlador puede llamarse como deseemos pero, por convenio, parece que suele llamarse 'controller.php'. Así que en nuestro fichero base (viajes.php), escribiríamos algo como esto:

require_once(JPATH_COMPONENT.DS.'controller.php');

Ahora, para ser coherente, hemos de crear un nuevo fichero y llamarlo 'controller.php'. Este fichero puede ser creado donde deseemos ya que lo vamos a incluir por ruta en el fichero base pero, si has usado la línea propuesta anteriormente debe ser creado en la misma carpeta donde se encuentra el fichero base ya que JPATH_COMPONENT es una macro que contiene la ruta donde se encuentra nuestro componente y DS representa el separador de directorios correcto según el sistema operativo bajo el que se está ejecutando el código, sea este windows (\) o linux (/).

Así que creamos el fichero 'controller.php' y realizamos una referencia dentro de éste a la librería del controlador de J! importándola con:

jimport('joomla.application.component.controller');

Ya tenemos la primera pata (el fichero) por lo que ahora necesitamos la otra, la clase. Para ello tenemos que definir una clase que extienda la funcionalidad de la clase base del controlador 'JController'. En esta clase es en donde toda la acción va a transcurrir. Puedes llamar a la clase derivada como quieras pero parece ser que, por coherencia, el nombre se deriva del nombre del componente así que nuestra clase será:

class ViajesController extends JController
{
}

En esta etapa ya tenemos nuestros dos primeros ficheros. El fichero base carga el controlador y el fichero del controlador define una clase que extiende la clase base. Hasta aquí fácil. Nuestro siguiente paso será crear un objeto de de esta clase y ponerlo a currar. Así que añadimos las siguientes líneas a nuestro fichero base:

// Incluir el fichero del controlador
require_once(JPATH_COMPONENT.DS.'controller.php'); // Esta ya estaba

// Crear el controlador
$controller = new ViajesController();  o el  nombre que le hayas dado a tu clase de controlador

// ejecutar la tarea solicitada
$controller->execute(JRequest::getCmd('task'));



A partir de ahora las cosas empiezan a ocurrir solitas. Hasta ahora podíamos dar a nuestros ficheros (exceptuando el fichero base) el nombre que queríamos, podíamos ponerlos donde nos diera la gana y podíamos dar a nuestras clases el nombre que quisiéramos porque estábamos incluyendo los ficheros por ruta y estábamos llamando a las clases directamente (bueno, realmente sólo un fichero y sólo una clase pero teníamos la posibilidad de hacerlo). Pero a partir de ahora será el entorno de Joomla! el que empiece a cargar nuestros ficheros y a llamar a nuestras clases automáticamente por lo que debemos ser sumamente cuidadosos acerca de dónde ponemos nuestros archivos, cómo los llamamos y qué clases contienen porque una simple letra de diferencia y Joomla! fallará.

¿De dónde saca el entorno de Joomla! 1.5 los datos para funcionar?. Bueno, la respuesta es sencilla: de la petición de página, sea ésta una petición tipo GET o una petición tipo POST. Muy bien, pero yo no he escrito en mi petición nada más que option=com_viajes. ¿De dónde viene el parámetro 'task' que pasamos en la llamada al controlador?. ¿Realmente tenemos una variable 'task' con un valor correcto?

Si, y éste es el 'problema': Tanto si realizas, como si no realizas, una petición completa el entorno de Joomla! usará valores por defecto para completar la llamada haciendo el sistema muy cómodo pero también muy complejo de reparar si nos equivocamos en determinados sitios.

La llamada 'controller->execute()' hará que el entorno de Joomla! intente realizar el trabajo solicitado que, en este caso, será la tarea por defecto 'display', simplemente porque no le hemos indicado ninguna otra.

class ViajesController extends JController
{
function display()
{
echo 'Viajando';
}
}

De tal modo que si nuestra petición hubiese contenido el parámetro 'task=saltar' el controlador hubiese intentado ejecutar una función llamada saltar en nuestra clase controladora:

class ViajesController extends JController
{
function saltar()
{
echo 'Saltando';
}
}

Si has sido observador habrás advertido que el nombre de nuestro componente ha sido 'capitalizado' al usarlo como nombre de la clase derivada (en realidad a esta acción de poner las letras iniciales de una palabra compuesta en mayúsculas se llama 'camelizar'). Esta es una constante en el entorno y, aunque aquí hubiésemos podido poner otra cosa en esta primera clase no será así en las demás por lo que conviene acostumbrarse lo antes posible para evitar pérdida de pelo. El entorno de J! espera que los nombres de las clases estén en formato 'camelizado'.

Por el momento hemos jugado con la parte 'Controller' del modelo MVC. Llegamos aquí a un nuevo punto de decisión. Podemos parar aquí o seguir adelante y entrar en la parte 'View' del modelo.

Como se puede ver el modelo MVC puede ser usado por partes según lo que nos interese algo que no he visto que nadie diga en ningún sitio. Parar aquí, al menos, simplifica nuestro fichero base. Hasta ahora normalmente teníamos una sentencia switch que, según la tarea solicitada según una variable dada, llamaba a una función escrita más abajo en ese mismo fichero y le pasaba varios argumentos. Esa función era la que devolvía el código HTML deseado.

Ahora el switch ha desaparecido y las diferentes tareas a realizar son funciones en nuestro fichero 'controller.php '. La capacidad de pasar argumentos también ha desaparecido pero todas las variables necesarias están disponibles en el entorno así que las podemos recuperar fácilmente.

No hay nada que nos obligue a usar la variable 'task' para controlar el flujo de ejecución ya que podríamos pasar cualquier otra variable en la llamada pero, para ajustarnos a reglas no escritas (o no encontradas por mi), se suele usar 'task' ya que, además, el entorno la trata de manera especial porque es la escogida por los desarrolladores para realizar este trabajo, así que es buena idea usarla también nosotros.

Para disparar las vistas sólo tenemos que llamar a la función display() de la clase base JController. Hacemos esto insertanto en nuestra función una llamada a parent::display() como última línea. Así, como mínimo, nuestro fichero controller debiera contener lo siguiente:

jimport('joomla.application.component.controller');

class ViajesController extends JController
{
function display()
{
parent::display();
}
}


Pero, ¿qué es una vista?. Bueno, esa parte y algo más lo dejo para un próximo artículo.

Un saludo a todos.

Share
Última actualización el Domingo 11 de Abril de 2010 21:07  

Comentarios  

 
0 # jorge 08-08-2011 20:01
Muy bueno , la verdad lo entendi perfecto , solo me falta comprender la parte de la vista :D
Responder | Responder con una citación | Citar
 
 
0 # hector azocar 19-06-2012 20:46
Simplemente excelente. Era lo que andaba buscando :lol:
Responder | Responder con una citación | Citar
 
 
0 # reinier 04-03-2013 01:04
Para ver si entendi...si quisiera hacer un diagrama de clases para representar la clase controladora de Joomla esta seria...Jcontroller??
Responder | Responder con una citación | Citar
 
 
0 # Trucos 03-04-2017 15:53
Estoy totalmente de acuerdo de que el jusgos sin dudar es provechoso
aunque no tanto como declaran

Chekea y puedes visita mi webpage: Trucos: http://www.foodtime.com/__media__/js/netsoltrademark.php?d=trucoteca.com
Responder | Responder con una citación | Citar
 

Escribir un comentario

El propietario de esta página no se hace responsable de las opiniones de sus lectores en los comentarios, así como puede o no estar de acuerdo con lo que en ellos se diga.

Usa el juego limpio en tus comentarios

Por favor, no realices comentarios ofensivos o insultantes. Tampoco generes comentarios con publicidad o Spam. No utilices los comentarios para 'enchufar' tu sitio. Los enlaces que pongas podrán ser eliminados. Pretendemos crear un espacio de comunicación entre el autor y los lectores.

Todos agradeceremos el correcto uso de la ortografía, pues no todos somos capaces de entender mensajes 'codificados' tipo SMS. Además te rogamos uses signos de puntuación, si puede ser, para mejorar la comprensión de tu mensaje.
No escribas sólo en mayúsculas ya que en Internet escribir con mayúsculas equivale a GRITAR y no por gritar se te va a hacer más caso sino, probablemente, al contrario.

Reserva de Edición

Nos reservamos el derecho de no incluir comentarios que sean ofensivos, desagradables, que ataquen a terceros (racistas, homófobos, etc) o que no tengan que ver con el sitio o con el tema de que se trata.
Los datos suministrados al emitir tu comentario son privados y de tu propiedad y no serán usados para ningúna acción comercial ni de otro tipo.


Código de seguridad
Refescar


Archivo

Powered by ArtTree