Conociendo Joomla: los componentes

Los componentes son quizás las aplicaciones más importantes en la gestión de contenidos de Joomla. Son pequeños programas independientes entre sí, que están junto al Core de Joomla (el corazón o nucleo del sistema), o bien se descargan y  posteriormente se instalan desde el panel de administración o Back-End de Joomla para ampliar las funcionalidades del emplazamiento web. Tienen su propias tablas en la base de datos y también sus propias carpetas contenedoras con los archivos operacionales, ajustándose al patrón MVC característico de Joomla. Esto es precisamente lo que les da una independencia en el funcionamiento y no interfieren (en general) unos con otros, además esto brinda la posibilidad de que pueden ser instalados o desinstalados en cualquier momento, es decir, el sistema permite un asincronismo temporal en la instalación/desinstalación de estas aplicaciones.



Hay distintos tipos de componentes y de muy diversas funcionalidades (se designa el nombre de los componentes con el prefijo "com_"):

  • Componentes que funcionan en el frontend y en la administración de Joomla (Ejemplos: com_content, com_weblinks, com_newsfeeds, etc)
  • Componentes que funcionan exclusivamente en administración de Joomla (Ejemplos: com_config, com_media, com_statistics, com_typedcontent, etc)
  • Componentes que funcionan exclusivamente en el frontend (No son tan comunes, generalmente son creados por desarrolladores independientes)
  • Componentes que combinan su funcionamiento con módulos (Generalmente la gran mayoría. Ejemplos: com_banners, com_polls, com_login, etc)
  • Componentes opensource (de descarga gratuita) y componentes comerciales (requieren pago antes de la descarga)

 

Los Componentes, además, deben ajustarse al concepto de Front-End y Back-End del CMS. El Front-end  es la parte del componente que es visible para el usuario de nuestro sitio web. Se visualiza donde hayamos incluido la etiqueta <jdoc:include type=”component” /> en el template. Su código fuente se encuentra en el directorio components dentro del directorio principal de Joomla!. El Back-End la parte del componente que se mostrará cuando entremos al sitio como administradores. El componente se mostrará donde lo hayamos especificado en el template del Back-End. El template para la parte de back-end y la parte de front-end es difrerente. Su codigo fuente se encuentra en el directorio components dentro del directorio administrator dentro del directorio principal de Joomla!.­

Para una descripción de los componentes que vienen integrados al núcleo de Joomla, visualiza la página: Conociendo Joomla: el Core.

Aplicando la Arquitectura MVC al Componente Joomla

Siguiendo las convenciones del Framework de Joomla, los componentes deben ajustarse al patrón MVC:

Objeto Controlador: NombreComponente + Controller
Objeto Vistas: nombreComponente+View+nombreVista
Objeto Modelo: nombreComponente+Model+Nombre del modelo

Ejemplo de un Componente

Ejemplo extraído de: Desarrollo de extensiones con Joomla! 1.5. David Noguera Cifuentes. JoomlaDay 2008, Madrid

Punto de Entrada:

 

< ? php 
defined( ‘_JEXEC’ ) or die( ‘Restricted access’ );
 
require_once( JPATH_COMPONENT.DS.‘controller.php’ );
 
if($controller = JRequest::getWord(‘controller’)) {
    $path = JPATH_COMPONENT.DS.‘controllers’.DS.$controller.‘.php’;
    if (file_exists($path)) {
        require_once $path;
    } else {
        $controller = “”;
    }
}
 $classname    = ‘PruebaController’.$controller;
$controller   = new $classname( );
$controller->execute( JRequest::getVar( ‘task’ ) );
 
$controller->redirect();
    ? >

 

Funcionamiento del punto de entrada

Se comprueba si viene un parámetro en la query string que establezca un controlador, y si viene se importa el fichero con el controlador.
Se instancia el controlador.
Se ejecuta el método execute del controlador.
Se ejecuta el método redirect del controlador.


Controlador



< ? php
defined( ‘_JEXEC’ ) or die( ‘Restricted access’ );

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

class PruebaController extends JController
{

function display()
{
parent::display();
}
}
? >

com_prueba/views/prueba/view.html.php

< ? php
defined( ‘_JEXEC’ ) or die( ‘Restricted access’ );
jimport( ‘joomla.application.component.view’);
class PruebaViewPrueba extends JView
{
function display($tpl = null)
{
$model =& $this->getModel();
$mensaje= $model->getMensaje()
$this->assignRef( ‘mensaje’, $mensaje );

parent::display($tpl);

}

}
? >



com_prueba/views/prueba/tmpl/default.php

 

<h1><?php echo $this->mensaje ?></h1>



Modelo

 

<?php

defined(’_JEXEC’) or die();
jimport( ‘joomla.application.component.model’ );

class PruebaModelPrueba extends JModel
{
function getMensaje(){

//Aquí se obtienen datos de la BD

return “Hola soy un valor que ha devuelto el modelo”;

}
}
?>

 

 

Fichero XML del componente

 

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-
install.dtd">
<install type="component" version="1.5">
<name>My Extension</name>
<creationDate>MonthName Year</creationDate>
<author>Author's Name</author>
<authorEmail>Author's Email</authorEmail>
<authorUrl>Author's Website</authorUrl>
<copyright>Copyright Notice</copyright>
<license>Component License Agreement</license>
<version>Component Version</version>
<description>Component Description</description>
<administration>
<menu>My Extension</menu>
<submenu>
<menu task="view">Items</menu>
<menu link="option=com_categories&section=com_wfaqs;">Categories</menu>
</submenu>
<files folder="administration">
<filename>index.html</filename>
<filename>admin.myextension.php</filename>
<filename>install.sql</filename>
<filename>install.noutf8.sql</filename>
<filename>uninstall.sql</filename>
<folder>models</folder>
<folder>views</folder>
<folder>controllers</folder>
<folder>tables</folder>
</files>
<languages folder="administration">
<language tag="en-GB">en-GB.com_myextension.ini</language>
<language tag="de-DE">de-DE.com_myextension.ini</language>
</languages>
<media destination="com_myextension">
<filename>logo.jpg</filename>
<filename>index.html</filename>
</media>
</administration>
<install>
<sql>
<file driver="mysql" charset="utf8">install.sql</file>
<file driver="mysql" charset="">install.noutf8.sql</file>
</sql>
</install>
<uninstall>
<sql>
<file driver="mysql">uninstall.sql</file>
</sql>
</uninstall>
<installfile>install.myextension.php</installfile>
<uninstallfile>uninstall.myextension.php</uninstallfile>
<files>
<filename>index.html</filename>
<filename>myextension.php</filename>
<folder>models</folder>
<folder>views</folder>
<folder>controllers</folder>
<folder>tables</folder>
</files>
<languages>
<language tag="en-GB">en-GB.com_myextension.ini</language>
<language tag="de-DE">de-DE.com_myextension.ini</language>
</languages>
<media destination="com_myextension">
<filename>logo.jpg</filename>
<filename>index.html</filename>
</media>
</install>





Resultado Final
URL: index.php?option=com_prueba&view=prueba

 

 

 

Enlaces Recomendados:
- Página de Desarrollo Guía de Componentes de Joomla
- Otra sección sobre componentes en docs.joomla.org
- Ejemplo de creación de componente en Nosolocodigo.
-