Contents
Introducción
En el framework Joomla!2.5, los autores de componentes de terceros dividen su código en tres partes principales:
- Modelos (Models) Gestionan la información
- Controladores (Controllers) Realizan tareas, set y get los estados de los modelos (Models) y solicitan a las Vistas (Views) que muestren contenido
- Vistas (Views) Muestran el contenido de acuerdo con el tipo (error, feed, html, json, raw, xml) y el diseño elegido por los controladores
Configurando el Controlador (Controller)
En el código core de Joomla, hay una class capaz de administrar los controladores: JController. Esta clase tiene que ser extendida para ser utilizado en el componente. En el fichero site/helloworld.php (punto de entrada de nuestro componente Hello World), pon estas lineas
site/helloworld.php
<?php // No direct access to this file defined('_JEXEC') or die('Restricted access'); // import joomla controller library jimport('joomla.application.component.controller'); // Get an instance of the controller prefixed by HelloWorld $controller = JController::getInstance('HelloWorld'); // Perform the Request task $input = JFactory::getApplication()->input; $controller->execute($input->getCmd('task')); // Redirect if set by the controller $controller->redirect();
El método estático getInstance de la clase JController creará un controlador. En el codigo de arriba, instanciará un objecto controlador de una clase llamada HelloWorldController. Joomla buscará la declaración de esa clase en un archivo llamado acertadamante controller.php (es un comportamiento por defecto).
Ahora, controller.php necesita ser creado y HelloWorldController necesita ser declarado y definido. Así que con tu gestor y editor de archivos favoritos, crea el fichero site/controller.php que contenga:
site/controller.php
<?php // No direct access to this file defined('_JEXEC') or die('Restricted access'); // import Joomla controller library jimport('joomla.application.component.controller'); /** * Hello World Component Controller */ class HelloWorldController extends JController { }
Cuando no se le pasa «task» en las variables de solicitud (request varibles), la tarea por defecto será ejecutada, que en este caso es la tarea mostrar (display). La clase JController tiene dicha tarea. En nuestro ejemplo, mostrará una vista llamada HelloWorld.
Así que con task simplemente referencia una función publica de JController llamada display().
A Tip!
Una simple nota para completar la explicación anterior, podrías llamar otra función diferente a display() utilizando una URL como la siguiente: http://localhost/index.php?option=com_helloworld&task=insert
Esto intentaría llamar a la función insert() de tu controlador (que definitivamente deberíamos implementar en HelloWorldController ).
Configurando la Vista (View)
Cuando JController quiere mostrar una vista, buscará ciertos ficheros en el directorio component/com_[nombre_componente]/views/[nombre_de_vista]/.
El nombre del directorio de la vista por defecto es el nombre mismo del componente. En nuestro caso la ruta es component/com_helloworld/views/helloworld/
.
El fichero que contiene el código de la vista se llama view.[modo_vista].php. El modo de vista por defecto, y probablemente la única vista que un componente pueda necesitar es el modo html. Así que esto nos da el nombre del archivo que será view.html.php.
Con tu editor y gestor de archivos favorito, crea el fichero site/views/helloworld/view.html.php capaz de mostrar la vista por defecto que contenga:
site/views/helloworld/view.html.php
<?php // No direct access to this file defined('_JEXEC') or die('Restricted access'); // import Joomla view library jimport('joomla.application.component.view'); /** * HTML View class for the HelloWorld Component */ class HelloWorldViewHelloWorld extends JView { // Overwriting JView display method function display($tpl = null) { // Assign data to the view $this->msg = 'Hello World'; // Display the view parent::display($tpl); } }
El método display de la clase JView es llamada con la tarea display de la clase JController. En nuestro caso, este método mostrará información utilizando el fichero tmpl/default.php. Con tu editor y gestor de archivos favorito, crea el fichero site/views/helloworld/tmpl/default.php capaz de mostrar la vista por defecto que contenga:
site/views/helloworld/tmpl/default.php
<?php // No direct access to this file defined('_JEXEC') or die('Restricted access'); ?> <h1><?php echo $this->msg; ?></h1>
Este fichero de plantilla será incluido por la clase JView. Por eso, aquí, $this hace referencia a la clase HelloWorldViewHelloWorld.
Entonces, para poner un ejemplo, podríamos llamar a la vista dentro del directorio component/com_[nombre_de_componente]/views/[nombre_de_vista]/ mediante:
http://localhost/joomla/index.php?option=com_helloworld
(esto iría por defecto al directorio component/com_helloworld/views/helloworld/) o podríamos llamar explícitamente el directorio mediante:
http://localhost/joomla/index.php?option=com_helloworld&view=helloworld
Si cambiaramos &view=helloworld por otra cosa, por ejemplo &view=fluffy tendríamos que crear el directorio:
component/com_helloworld/views/fluffy/
Copia el contenido de views/helloworld a views/fluffy
El nombre de la clase del fichero view.html.php del directorio fluffy sería HelloWorldViewFluffy. Después podrás personalizar los contenidos de default.php del subdirectorio fluffy para una salida personalizada y ver el resultado mediante:
http://localhost/joomla/index.php?option=com_helloworld&view=fluffy
Empaquetando el componente
Contenido del directorio:
- helloworld.xml
- site/index.html
- site/helloworld.php
- site/controller.php
- site/views/index.html
- site/views/helloworld/index.html
- site/views/helloworld/view.html.php
- site/views/helloworld/tmpl/index.html
- site/views/helloworld/tmpl/default.php
- admin/index.html
- admin/helloworld.php
- admin/sql/index.html
- admin/sql/updates/index.html
- admin/sql/updates/mysql/index.html
- admin/sql/updates/mysql/0.0.1.sql
Ahora comprime este directorio o directamente descargalo el archivo e instalalo utilizando la “Administración de extensiones” (Extension Manager) de Joomla. Puedes testear este componente básico accediendo a la dirección index.php?option=com_helloworld o administrator/index.php?option=com_helloworld con tu navegador favorito.
helloworld.xml
<?xml version="1.0" encoding="utf-8"?> <extension type="component" version="2.5.0" method="upgrade"> <extension type="component" version="2.5.0" method="upgrade"> <name>Hello World!</name> <!-- The following elements are optional and free of formatting constraints --> <creationDate>November 2009</creationDate> <author>John Doe</author> <authorEmail>john.doe@example.org</authorEmail> <authorUrl>http://www.example.org</authorUrl> <copyright>Copyright Info</copyright> <license>License Info</license> <!-- The version string is recorded in the components table --> <version>0.0.2</version> <!-- The description is optional and defaults to the name --> <description>Description of the Hello World component ...</description> <update> <!-- Runs on update; New in 2.5 --> <schemas> <schemapath type="mysql">sql/updates/mysql</schemapath> </schemas> </update> <!-- Site Main File Copy Section --> <!-- Note the folder attribute: This attribute describes the folder to copy FROM in the package to install therefore files copied in this section are copied from /site/ in the package --> <files folder="site"> <filename>index.html</filename> <filename>helloworld.php</filename> <filename>controller.php</filename> <folder>views</folder> </files> <administration> <!-- Administration Menu Section --> <menu>Hello World!</menu> <!-- Administration Main File Copy Section --> <!-- Note the folder attribute: This attribute describes the folder to copy FROM in the package to install therefore files copied in this section are copied from /admin/ in the package --> <files folder="admin"> <!-- Admin Main File Copy Section --> <filename>index.html</filename> <filename>helloworld.php</filename> <!-- SQL files section --> <folder>sql</folder> </files> </administration> </extension>
Resultado: Verás por defecto el mensaje contenido en la variable $this->msg del fichero view.html.php.