Aunque con las extensiones existentes de Joomla tendremos suficiente en la mayoría de los casos, hay ocasiones en que necesitamos algo concreto, como por ejemplo un módulo que muestre los usuarios registrados que cumplan años hoy o uno que muestre los artículos publicados hace un año.
Y eso es precisamente lo que voy a hacer.
En el siguiente tutorial vamos a crear un modulo que consulte a la base de datos y muestre el titulo de los artículos con un enlace al articulo completo.
Hacer un módulo es mucho más sencillo que un componente.
De hecho los módulos están pensados para mostrar datos concretos, como usuarios conectados, datos de contacto, menús etc… que en muchos casos son una simple consulta a la base de datos.
Los módulos se encuentran situados en el directorio modules dentro del directorio de instalación de Joomla y por cada módulo hay una carpeta con nombre mod_nombredelModulo .
Nuestro módulo se va a llamar anyo, por lo tanto la carpeta del módulo se llamará mod_anyo.
La estructura de un módulo es muy simple, tiene un fichero php con el mismo nombre que el módulo, el cual es el punto de entrada, que tomará en control del módulo cuando este sea llamado.
Para separar la lógica de la presentación se ha creado la clase helper, en la cual escribiremos nuestras funciones y de esta forma nuestro código quedará más ordenador y legible. La clase helper se encuentra en el fichero de nombre helper.php en la raíz del directorio del módulo.
Desde mod_anyo.php ejecutaremos las funciones de la clase helper simplemente llamándolos como métodos estáticos , puedes encontrar una definición de la clase en el sitio oficial de Joomla
Por ultimo, tenemos el layout, o template, que se encuentra dentro de la carpeta tmpl de nuestro módulo , el cual puede tener cualquier nombre que se te ocurra, pero le asignaremos default.php, que es el nombre por defecto que buscara Joomla si no le indicamos lo contrario.

Para la parte de Back-End disponemos del fichero mod_anyo.xml , donde definiremos los parámetros del módulo y mediante el cual podremos parametrizar el modulo para hacerlo mas configurable y reutilizable.
Vamos a ver el código de nuestro punto de entrada:
-
-
<?php
-
-
// no acceso directo
-
-
// incluir al helper que devolverá los datos, solo una vez
-
-
$articulos = modAnyoHelper::getArticulos( $params );
-
require( JModuleHelper::getLayoutPath( ‘mod_Anyo’,‘default’) );
-
?>
-
La primera línea, como siempre que hacemos una extensión para Joomla, es una línea de comprobación, que asegura que no se este accediendo al modulo estar usando Joomla.
La segunda línea importa el fichero de la clase helper, donde almacenamos nuestras funciones.
En la tercera línea, ejecutamos la función getArticulos() de nuestro helper que devuelve una lista de objetos con los resultados de la consulta SQL.
Por último, hacemos un require del layout, que en nuestro se llama default y lo hacemos usando el método getLayoutPath de la clase JModuleHelper, que devuelve la ruta del layout pasándole como parámetro el nombre del módulo y al nombre del layout.
En el helper almacenamos nuestras funciones, donde accedemos a datos para recuperar la lista de artículos que se escribieron hoy hace un anyo. Vamos a ver el código:
-
-
<?php
-
class modAnyoHelper
-
{
-
function getArticulos( $params )
-
{
-
jimport(‘joomla.utilities.date’);
-
$jnow = new JDate();
-
$now = $jnow->toMySQL();
-
-
$db = &JFactory::getDBO();
-
$consulta = "select title,id from #__content where datediff( #__content.created, ‘".$now."’ ) = 365 limit 0,30";
-
$db->setQuery($consulta);
-
$categorias = $db->loadObjectList();
-
return $db->loadObjectList();
-
}
-
}
-
?>
-
La clase helper ha de llamarse con el nombre del modulo sin “_” seguido de helper, es decir, en nuestro caso seria modanyoHelper.
Mediante jimport importamos el fichero necesario para instanciar una clase de tipo JDate.
Jimport admite como parámetro un string que apunte al “package” donde se encuentre la clase. Es un concepto similar al import de java . Los paquetes se importan según la el árbol de clases que hay en la documentación oficial :
Después creamos el método getArticulos que será el que devuelva una lista de artículos que tengan un año de antigüedad.
Utilizamos un objeto de tipo JDatabase para realizar la consulta y después simplemente obtenemos la lista de objetos mediante el método loadObjectList .
El meollo de la cuestión esta en la consulta SQL, donde se utiliza la función datediff para consultar los artículos con una antigüedad de 365 días
Finalmente , en el layout, sacamos por pantalla una lista HTML con enlaces a los artículos que se escribieron hace justo 365 días:
-
-
<?php
-
if($params->get(‘asignarCss’)){
-
$css = $params->get(‘clase’);
-
}
-
-
?>
-
<?php
-
foreach ($articulos as $articulo) {
-
echo ‘
-
<li><a href=index.php?option=com_content&id=’.$articulo->id.‘>’. $articulo->title .‘</a></li>
-
-
’;
-
}
-
?>
-
</ul>
-
Fíjate que para acceder a los parámetros del fichero mod_anyo.xml se utiliza $params->get() .
Estos parámetros se definen previamente en el fichero xml que acompaña el modulo.
-
-
<?xml version="1.0" encoding="utf-8"?>
-
<install type="module" version="1.5.0">
-
<name>Hoy hace un año</name>
-
<author>David Noguera</author>
-
<version>1.5.0</version>
-
<creationDate>30.07.2006</creationDate>
-
<description>Modulo que carga los artículos de tal dia como hoy pero hace un año</description>
-
<authorEmail>david@nosolocodigo.com</authorEmail>
-
<files>
-
<filename module="mod_anyo">mod_anyo.php</filename>
-
<filename>helper.php</filename>
-
<filename>mod_anyo.xml</filename>
-
<filename>tmpl/default.php</filename>
-
<filename>tmpl/index.html</filename>
-
</files>
-
<params>
-
<param name="clase" type="text" default="mod_anyo"
-
label="Clase Css para el ul"
-
description="La clase que se aplicara al ul" />
-
<param name="asignarCss" type="radio" default="1"
-
label="Clase css" description="Determina si se debe asignar la clase css o no">
-
<option value="0">No</option>
-
<option value="1">Si</option>
-
</param>
-
</params>
-
</install>
-
Para finalizar solo queda meter todo esto en un zip y subirlo al instalador de Joomla!.
Comentarios
Trackbacks
- Tutorial: creando plugins con Joomla! 1.5 | nosoloCodigo
- Crear el XML del componente de Joomla y generar instalable | nosoloCodigo
- Joomla « Lizzie
12 de Marzo del 2008 a las 8:02 am
Buenas tardes.
Ante todo decirte que has realizado muy buen trabajo con este tutorial. Muchas gracias por tu tiempo y esfuerzo.
Ahora mismo, estoy intentando desarrollar un módulo para realizar una búsqueda avanzada para el mi zona de descargas, estilo, elija la extensión que busca, ejemplo: iso, pdf, .exe…
Si no te importa darme unas nociones básicas para realizar este módulo te lo agradecería muchísimo. (Es que estoy realizando un proyecto fin de módulo y lo necesito).
Un saludo
12 de Marzo del 2008 a las 10:29 am
Hola Alonso, no entiendo que es lo que quieres hacer exactamente…si me preguntas algo concreto podría resolverte alguna duda, un saludo y gracias!
13 de Marzo del 2008 a las 1:42 pm
Hola, me parece que está muy bien explicado el tutorial, ahora bien, estuve intentando hacer este mismo ejemplo pero cuando intento instalarlo desde joomla me aparece el siguiente error:
Error! Could not find a Joomla! XML setup file in the package.
No sé qué puede ser, si me pueden dar una mano se los agradezco
13 de Marzo del 2008 a las 1:50 pm
Hola Cristopher, has creado el fichero XML ??
Para que el módulo se pueda instalar hay que crear el fichero XML y empaquetar todo el contenido del módulo en un zip con el XML dentro.
Ese zip es el que hay que subir al instalador de Joomla!
Por cierto, si el XML no valida, Joomla tampoco podrá instalarlo.
Un saludo!
13 de Marzo del 2008 a las 2:20 pm
Gracias David, el problema era efectivamente que el xml tenía unos errores y en consecuencia no podía ser parseado, como el encoding utilizado es UTF-8 el XML no permite ni acentos ni ñ.
Podrías explicar en un futuro tutorial la lógica completa para hacer consultas a la BD?
Gracias David excelente trabajo!!!
12 de Abril del 2008 a las 6:38 am
Saludos, yo copie el codigo, hice las correcciones necesarias y se pudo instalar bien y toda la cosa, solo q no corre el modulo, marca error en esta linea
foreach ($articulos as $articulo) {
del archivo default.php.
Alguien lo pudo componer??
13 de Abril del 2008 a las 3:55 pm
Hola Otro David, jeje, el error que te da es por que no devuelve ningún registro el resultado de la consulta, por que seguramente no haya ningún articulo públicado hace 365 dias, por eso da un error el for each al recorrer el array, por que el array esta vacío.
Habría que poner una comprobación antes de recorrer el array para ver si esta vacío y en ese caso mostrar un mensaje del tipo : “No hay articulos”.
Un saludo!
Pd: últimamente estoy ocupadisimo y no tengo tiempo para publicar nada, pero pronto estaré de vuelta.
16 de Abril del 2008 a las 1:22 pm
Saludos, Felicidades por tu sitio y por el hecho de compartir parte del conocimiento que tienes.
20 de Abril del 2008 a las 10:12 am
Hola David.
Estuve en el Joomla Day España y asistí a tu taller para crear módulos, plugins, etc…
Quisiera preguntarte… ¿Utilizas alguna aplicación para debugear con Joomla?
Gracias y felicidades por tu taller.
Saludos Cordiales.
Daniel M
20 de Abril del 2008 a las 12:07 pm
Hola Daniel, gracias a tí.
Pues yo no utilizo ningúna herramienta para debugear en php, pero existe un ide basado en eclipse (no se si es un plugin o un ide entero) que puede ayudarte, yo me lo instale una vez pero no llegue a hacer nada con el:
http://joomlacode.org/gf/project/jcode
21 de Mayo del 2008 a las 8:37 am
veo que ustedes están bien duros con el joomla 1.5 me haria falta el code para hacer lo siguiente:
como un marquee de html para mostrar titulares de noticias, o sea que determinadas noticias vayan de derecha a izquierda
saludos
ESPERO ME AYUDEN ESTOY MOLIO TRATADO DE HACER ESO
1 de Junio del 2008 a las 5:45 pm
Hola gracias a david por el tutorial me inicio en esto fijense baje un modulo para mostrar la fecha pero hay que usarlo con legancy activado ya que esta hecho para joomla 1.0 claro el funciona bien (”no se que problemas pueda traer activado el legancy”);en vista del manual de david me di a la tarea de llevarlo a joomla 1.5 y segui las instrucciones pero no funciona cuando instalo el zip dice ¡Error! No puedo encontrar un archivo de configuración XML para Joomla! en el paquete.
les dejo el codigo original y el nuevo que cree ojala puedan ayudar gracias.
original tiene 2 archivos
xml:
GJ Fecha
29.10.2007
merolhack
This module is released under the GNU/GPL License
guiasjoomla@gmail.com
http://www.guiasjoomla.com
1.0.0
mod_gjfecha.php
Si
No
Servidor
Cliente
Si
No
Servidor
Cliente
el segundo archivo:
get( ‘class_sfx’, ” );
$fecha = $params->get( ‘fecha’, ” );
$tipo_fecha = $params->get( ‘tipo_fecha’, ” );
$hora = $params->get( ‘hora’, ” );
$tipo_hora = $params->get( ‘tipo_hora’, ” );
function gj_fecha_servidor() {
// Agregamos los nombres de los meses
$mes[0]=”-”;
$mes[1]=”Enero”;
$mes[2]=”Febrero”;
$mes[3]=”Marzo”;
$mes[4]=”Abril”;
$mes[5]=”Mayo”;
$mes[6]=”Junio”;
$mes[7]=”Julio”;
$mes[8]=”Augosto”;
$mes[9]=”Septiembre”;
$mes[10]=”Octubre”;
$mes[11]=”Noviembre”;
$mes[12]=”Diciembre”;
// Agregamos los nombres de los dias
$dia[0]=”Domingo”;
$dia[1]=”Lunes”;
$dia[2]=”Martes”;
$dia[3]=”Miércoles”;
$dia[4]=”Jueves”;
$dia[5]=”Viernes”;
$dia[6]=”Sábado”;
$num_dia=(int)date(”w”);
$num_mes=(int)date(”m”);
$fecha_d = ($dia[$num_dia].” “.date(”d”).” de “.$mes[$num_mes].” del “.date(”Y”));
// Mostramos el nombre del dia, el dia con numero, el nombre del mes y el año
echo $fecha_d;
}
function gj_fecha_cliente() {
echo ”
var mydate=new Date()
var year=mydate.getYear()
if (year < 1000)
year+=1900
var day=mydate.getDay()
var month=mydate.getMonth()
var daym=mydate.getDate()
if (daym<10)
daym=\”0\”+daym
var dayarray=new Array(\”Domingo\”,\”Lunes\”,\”Martes\”,\”Miercoles\”,\”Jueves\”,\”Viernes\”,\”Sabado\”)
var montharray=new Array(\”Enero\”,\”Febrero\”,\”Marzo\”,\”Abril\”,\”Mayo\”,\”Junio\”,\”Julio\”,\”Agosto\”,\”Septiembre\”,\”Octubre\”,\”Noviembre\”,\”Diciembre\”)
document.write(\”\”+dayarray[day]+\” \”+daym+\” de \”+montharray[month]+\” del \”+year+\”\”)
“;
}
function gj_hora_servidor() {
echo ‘ Hora: ‘ . date(”g:i a”);
}
function gj_hora_cliente() {
echo ”
Stamp = new Date();
var Hours;
var Mins;
var Time;
Hours = Stamp.getHours();
if (Hours >= 12) {
Time = \” P.M.\”;
} else {
Time = \” A.M.\”;
}
if (Hours > 12) {
Hours -= 12;
}
if (Hours == 0) {
Hours = 12;
}
Mins = Stamp.getMinutes();
if (Mins < 10) {
Mins = \”0\” + Mins;
}
document.write(’ Hora: ‘ + Hours + \”:\” + Mins + Time);
“;
}
echo ”;
if ( $fecha == 0 ) {
if ( $tipo_fecha == 0 ) {
echo gj_fecha_servidor();
} else {
echo gj_fecha_cliente();
}
}
if ( $hora == 0 ) {
if ( $tipo_hora == 0 ) {
echo gj_hora_servidor();
} else {
echo gj_hora_cliente();
}
}
echo ”;
?>
1 de Junio del 2008 a las 5:53 pm
el archivo lo separe de acuerdo a lo del manual y gere los archivos pero no encuentro la forma de que joomla lea el xml
1 de Junio del 2008 a las 5:55 pm
asi quedo el xml
Hoy hace un ano
David Noguera
1.5.3
01.06.2008
Modulo que carga la fecha y hora
publicidad@vipcard.com.ve
mod_fecha.php
helper.php
mod_fecha.xml
tmpl/default.php
tmpl/index.html
Si
No
Servidor
Cliente
Si
No
Servidor
Cliente
gracias por la ayuda
2 de Junio del 2008 a las 5:26 am
El módulo funciona perfectamente en joomla 1.5 sin necesidad de activar el plugin de compatibilidad.
Tiene que ser una equivocación, pero muchas gracias pro compartirlo.
Un saludo!
2 de Junio del 2008 a las 8:09 am
Hola
No soy muy experto en el tema
y necesito hacer un modulo que permita a los los usuarios ingresar sus datos personales y cierta información adicional necesaria para el negocio y ejecutar cierta lógica especifica.
Los ejemplos que he visto son para mostrar información. como hago un modulo que capture información del usuario y le retorne mensajes y cosas asi.
4 de Junio del 2008 a las 12:55 pm
Hola, la linea :
ó
es la única manera de incluir un módulo?
Pruebo con cualquier módulo y no se visualiza nada del default.php de ellos en el template,aún con los q vienen por defecto.
Muchas gracias.
4 de Junio del 2008 a las 12:57 pm
Hola, la linea :
”
ó
”
es la única manera de incluir un módulo?
Pruebo con cualquier módulo y no se visualiza nada del default.php de ellos en el template,aún con los q vienen por defecto.
Muchas gracias.
5 de Junio del 2008 a las 10:49 am
Perdón por los dos mensajes de ayer (no se ven las líneas de los include de Joomla).
El problema que tenía fue que no había incluído como filename el mismo archivo xml.
Luego de ver el ejemplo lo agregué y anduvo.
Muchas gracias.
18 de Junio del 2008 a las 9:21 am
buenos dias, podrian ayudarme con algun link que me lleve a entender un poco la elaboracion de menus que mustren una lista de articulos de una seccion y se muestre a si mismo en la pagina de inicio?
realmente no entiendo
Gracias de antemado!!!!!
1 de Agosto del 2008 a las 9:51 am
Un par de dudas sobre la prolijidad de la seguridad:
¿no sería mejor incluir
defined( ‘_JEXEC’ ) or die( ” );
en todos los archivos, por ej. en el helper, además de en el de entrada?
No pusiste index.html en la raíz del módulo sino solamente en la carpeta /tmpl. ¿es un olvido o es por algo?