1. Desarrollando un componente MVC : Introducción
  2. Desarrollando un componente MVC: Desarrollando un componente básico
  3. Desarrollando un componente MVC: Añadiendo una vista en el frontend
  4. Desarrollando un componente MVC: Añadiendo un tipo de menu al frontend
  5. Desarrollando un componente MVC: Añadiendo un modelo al frontend
  6. Desarrollando un componente MVC : Añadiendo una variable request en el tipo de menu
  7. Desarrollando un componente MVC : Usando la base de datos
  8. Desarrollando un componente MVC : Basic backend
  9. Desarrollando un componente MVC : Añadiendo gestión de idioma
  10. Desarrollando un componente MVC : Añadiendo acciones backend
  11. Desarrollando un componente MVC : Añadiendo adornos al backend
  12. Desarrollando un componente MVC : Añadiendo verificaciones
  13. Desarrollando un componente MVC : Añadiendo categorías
  14. Desarrollando un componente MVC : Añadiendo configuración
  15. Desarrollando un componente MVC : Añadiendo ACL (Access Control Levels)
  16. Desarrollando un componente MVC : Añadiendo un script de instalación-desinstalación-actualización
  17. Desarrollando un componente MVC : Usando la capacidad de filtro
  18. Desarrollando un componente MVC : Añadiendo un servidor de actualización

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.