Vous êtes sur la page 1sur 26

TUTORIAL JOOMLA MODULE DEVELOPMENT

http://www.joomladin.com/index.php/tutorials/34-module-development/70-introduction.html

Escrito por: Victor Behar


,

Traduccion al español: ginescapote@gmail.com


Introducción

Escrito por Victor 07 de marzo 2009

Sé que estás listo para saltar a las páginas del tutorial. Ahí va una rápida introducción sobre la
forma en como está hecho el tutorial de desarrollo de módulos y algunos consejos.

Una de las cosas que me pasa a mí (y creo que no soy el único) es cuando leo el código de otras
personas es que no entiendo nada de lo que estoy leyendo. Honestamente, cuando cojo una página
web o un libro que tiene algún texto y algún código de ejemplo, mis ojos saltan hacia el código, y
entonces tengo esta terrible sensación de que el código es demasiado inteligente para mí para
entenderlo y desisto. Esto es algo que me ocurre muy a menudo y la única cura es la persistencia.
Cuanto más dedicado seas más posibilidades tendrás. Y si viajad por el círculo muchas veces el
círculo eventualmente se volverá un paseo fácil.

Esto si, para el tutorial de desarrollo de módulos, requiere un reconocimiento de la programación


orientada a objetos y conceptos de PHP. Por lo tanto, debe partir de ahí para garantizar que pueda
seguir fácilmente los ejemplos presentados aquí.

• Los módulos Joomla en su forma más simple, consisten en dos archivos, el archivo
principal php que contiene el código y el archivo xml que contiene los atributos del
módulo. La página 1 te dará el ejemplo "hola mundo".

• El marco de la aplicación Joomla nos brinda una gran cantidad de clases y métodos para
desarrollar, las páginas 2 y 3 demuestran la forma de acceder a objetos comunes.

• La cosa más interesante con los módulos es que pueden ser configurados. Como has
visto con la mayoría de los módulos, puedes tener varios parámetros disponibles en el
backend para controlar el comportamiento del módulo en el frontend; las páginas 4 y 5
te ayudarán con esto.

• Ya que toda la información del sitio web está almacenada en la base de datos, para
construir un módulo deberá de saber como acceder a la base de datos; ó sea, lo que se
presenta en la página 6.

• Joomla framework proporciona un mecanismo agradable de manejo de excepciones que


es importante usar si se desea proveer codigo de calidad, las páginas 7 y 8 demuestran
su uso.

• Después de comprender los conceptos básicos, en la página 9 se demuestran estos


principios básicos, en la especificacion de un módulo muy sencillo,

• Una de las cosas necesarias para nuestro primer módulo es la construcción de enlaces a
artículos existentes, y la página 10 explica cómo hacer esto.

• Una de las habilidades que tendrá que mejorar con el desarrollo de Joomla es SQL,
cuanto más complejas sean las cosas que usted necesita obtener de la base de datos, más
compleja se convierte su sentencia SQL. Espero que la página 11 le ayude a entrar en
esto.
• Última cosa, Joomla soporta el uso de plantillas (templates) que es bueno tener. Además,
con el desarrollo de sitios web, debemos siempre tratar de separar la funcionalidad del
código principal de la capa de presentación. Estas ideas se presentan en las páginas 12,
13 y 14.

A disfrutar!
Que se haga la luz

Escrito por Victor 06 de febrero 2009

Vamos a crear un módulo de Joomla! Simplemente vaya a su ruta de instalación de Joomla y cree
en el directorio modules un nuevo directorio llamado mod_blank, blank es el nombre de nuestro
primer módulo. Dentro cree dos archivos, el archivo mod_blank.xml que describe el módulo y el
archivo que contiene el código: mod_blank.php y el

/var/www/joomla/modules/mod_blank/mod_blank.xml
/var/www/joomla/modules/mod_blank/mod_blank.php

Here is the xml file:

<?xml version="1.0" encoding="utf-8"?>


<install type="module" version="1.5.0">
<name>blank</name>
<author>me</author>
<version>0.0.1</version>
<description>TEST</description>
<files>
<filename module="mod_blank">mod_blank.php</filename>
</files>
</install>

Esto será suficiente por ahora, no hay mucho en él, el archivo XML establece algunos pocos
atributos de módulo que no son obligatorios y describe los archivos necesarios que están
relacionados con el módulo. Mirando en otros módulos puede encontrar archivos XML realmente
largos, por ahora basta con recordar que los bits importantes son el nombre y los archivos de las
etiquetas. En el archivo principal de código.

<?php
print "Joomla hola mundo";
?>

Eso es todo, yeap eso es todo amigos! Ahora, para ver que pasa tienes que ir al backend, abrir el
módulo gestor de extensiones click en la pestaña en el marco del nuevo y pulse. Después de
seleccionar el módulo blank, hay que darle un título y activarlo. Recuerde que ha de colocarlo en
una posición que exista en su plantilla. Debería funcionar.

Bueno, los módulos pueden ser accedidos desde el exterior (no a través de Joomla) y esto no es una
cosa buena, tal vez está bien para el desarrollo, pero, desde luego, no para un centro de producción.
Cualquiera, pulsando la siguiente dirección URL con su navegador podría acceder directamente al
módulo en blanco.

http://yourserverip/joomla/modules/mod_blank/mod_blank.php
Vamos a mejorarlo un poco. Modificar mod_blank.php con lo siguiente:

<?php

echo JText::_('Hello World!');


?>

La primera línea del módulo restringe el acceso, ahora nuestro módulo sólo se puede invocar desde
el código principal de Joomla. En la segunda línea, es una clase de manejo texto JText que soporta
la traducción de texto durante el tiempo de ejecución, pero por ahora sólo devuelve la cadena de la
cita. En general es una buena práctica hacer uso de la misma, los desarrolladores de sitios
multilingües la agradecerán mucho, sin embargo, no voy a utilizarla para el resto del tutorial.
Solamente mencionarla, en caso de que usted haya estado viendo otros módulos y se asombre.

defined('_JEXEC') or die('Restricted access');


Accediendo a las propiedades

Escrito por Victor 07 de febrero 2009

Otro ejemplo, sustituir mod_blank.php con:

<?php
defined('_JEXEC') or die('Restricted access');
$user =& JFactory::getUser();
if ($user->guest)
{
echo "<p>hey stranger, you will always remain a stranger</p>";
}
else
{
echo "<p>username: $user->username</p>";
echo "<p>user: $user->name</p>";
echo "<p>email: $user->email</p>";
}
?>

JFactory es una clase fundamental de Joomla que contiene funciones getter (recogida) para diversos
objetos. Una de las cosas que devuelve es una referencia al objeto JUser. Si no sabes que es una
referencia (o lo que hace el ampersand) necesitas Googlear (búsqueda de “pass by reference”).
Digamos por ahora que devuelve una referencia al objeto de usuario original y no sólo una copia del
mismo, lo que nos permite modificar sus propiedades. Hay mucha ciencia participando detrás del
asunto JFactory, pero nosotros estamos interesados solo en su utilización, el código debe ser
bastante simple.

En el backend de administración, bajo el Tab del sitio se puede encontrar el Administrador de


usuarios y crear un usuario, para ver si este fragmento de código funciona o no, no dés nada por
sentado. Echa un vistazo a la clase JUser en la API de Joomla, vamos a jugar con un poco más de
iteración a través de los miembros de las propiedades del objeto.

<?php
defined('_JEXEC') or die('Restricted access');
$user =& JFactory::getUser();
print "\n Current User \n";
foreach ($user as $key => $value)
{
if (is_string($value))
{
print "<p> user property $key is $value </p>\n";
}
else
{
print "<p> user property $key is not a string </p>\n";
}
}
?>
Una vez más, el código debe ser fácil de seguir, el constructor foreach, elogiada por Perl, ayuda a
atravesar las matrices y las propiedades del objeto. Puede ver más información acerca de ello aquí.
La función is_string aquí es necesaria ya que no todas las propiedades JUser se pueden convertir en
cadenas que se imprimen. Como era de esperar is_string devuelve un valor booleano. Usted puede
ver ahora cómo sin esfuerzo podemos obtener datos sobre el usuario actual, la API de Joomla está
muy bien escrita y ofrece un montón de métodos para la construir en su entorno.
Acceso a las propiedades II

Escrito por Victor 11 de febrero 2009

Ahora, que hemos calentado, vamos a jugar con el objeto JURI que también se brinda a través de la
clase JFactory. No estoy cambiando mucho, mira a ver lo que puedes sacar de ella.

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

$uri =& JFactory::getURI();


print "\n Current URI Request\n";
foreach ($uri as $key => $value)
{
if (is_string($value))
{
print "<p> uri property $key is $value </p>\n";
}
else
{
print "<p> uri property $key is not a string </p>\n";
}
}
?>

OK, podemos imprimir las propiedades, pero, antes de que llegue a ser muy aburrido vamos a usar
los métodos getter ya previstos para acceder a los datos, creo que será más divertido. En esta
ocasión vamos a ver la clase JDate que se documenta aquí. Llamar a los metodos JData no debería
rompernos mucho la cabeza.

<?php
defined('_JEXEC') or die('Restricted access');
$date =& JFactory::getDate();

# call to the toMySQL method


$datemysql = $date->toMySQL();
print "\n<p> The date as appears in the database is $datemysql </p>\n";

# call to the toUNIX method


$dateunix = $date->toUNIX();
print "\n<p> The current date in UNIX format is $dateunix </p>\n";

# call to the fancy toFormat method passing a format string


$datestr = $date->toFormat ('%H:%M:%S - %d %b %Y');
print "\n<p> The Current Date is $datestr </p>\n";

# direct call to the _monthToString method, dot just concatenates


print "\n<p>" . JDate::_monthToString(4) . " or " .
$date->_monthToString(4) . "</p>\n";
?>
Como puedes ver hay una buena variedad de métodos getter, espero que estes familiarizado con el
formato de fecha unix, si no comprueba la “man page” en google (preguntando por "man date") y
encontrarás las diferentes opciones que soporta el formato de cadena. Recordemos que para invocar
un método de clase sin referirnos directamente a un objeto, podemos usar el "::" construir.
Pasando parámetros

Escrito por Victor 08 de febrero 2009

OK, hemos logrado mostrar las propiedades de los objetos y usar metodos de clases, hmmm que es
lo proximo? Bueno, has visto que se pueden configurar los parámetros para la mayoría de los
módulos en el backend, esto es realmente una cosa guapa ya que se puede confeccionar el módulo
para diferentes necesidades o cambiar su apariencia. Este será el siguiente escollo a vadear para
conquistar el reino de la libertad.

Así, digamos que queremos crear un módulo para el administrador para saludar a los usuarios y
clientes. Este debería ser capaz de definir dos frases de saludo, una para huéspedes y una para
usuarios registrados. Los parámetros del módulo se definen dentro del archivo XML bajo la etiqueta
<params>. Y dicen así:

<?xml version="1.0" encoding="utf-8"?>


<install type="module" version="1.5.0">
<name>blank</name>
<author>me</author>
<version>0.0.1</version>
<description>TEST</description>
<files>
<filename module="mod_blank">mod_blank.php</filename>
</files>
<params>
<param name="saluteguest" type="text"
default="Hello stranger"
label="gsalute"
description="Salute text for guests" />
<param name="saluteregistered" type="text"
default="Welcome "
label="rsalute"
description="Salute text for registered users" />
</params>
</install>

Simplemente declarado dos cuadros de texto, lo que obtenemos es lo siguiente:

Ilustracion 1: ejemplo, los parámetros de módulo


en blanco Joomla
Ahora, apuesto que usted necesita saber cómo estos parámetros se pasan a nuestro código:

<?php
defined('_JEXEC') or die('Restricted access');
$user =& JFactory::getUser();

# Get backend parameters


$saluteg = $params->get("saluteguest");
$saluter = $params->get("saluteregistered");

if ($user->guest)
{
echo "<p>$saluteg</p>";
}
else
{
echo "<p>$saluter</p>";
}
?>
Pasando parámetros II

Escrito por Victor 08 de febrero 2009

La próxima mejora que estoy pensando es tratar de tener textareas (multilínea) en lugar de cuadros
de texto, y qué más?, vamos a tratar tambien los botones de radio. Podemos tener una opción de sí /
no para el administrador de decidir si quiere saludar a los usuarios o no, dependiendo de su estado
de ánimo. Ahora no estoy seguro de cómo hacerlo así, que voy a echar un vistazo a otros módulos
que usan las radios. Hmm, mod_login hace uso de radios!

Aceptar, reemplace su sección params xml con el texto siguiente:

<params>
<param name="tosalute" type="radio" default="1"
label="Salute users?" >
<option value="0">No</option>
<option value="1">Yes</option>
</param>
<param name="saluteguest" type="textarea" default=""
rows="4" cols="40"
label="Guest users salute"
description="Salute text for guests" />
<param name="saluteregistered" type="textarea" default=""
rows="4" cols="40"
label="Registered users salute"
description="Salute text for registered users" />
</params>

Esto es lo que obtendrá.


Bien, ahora deseas utilizar esto, ¿no?

<?php
defined('_JEXEC') or die('Restricted access');
$user =& JFactory::getUser();

# Get backend parameters


$tosalute = $params->get("tosalute");
$saluteg = $params->get("saluteguest");
$saluter = $params->get("saluteregistered");

if ($tosalute)
{
if ($user->guest) echo "<p>$saluteg</p>";
else echo "<p>$saluter</p>";
}
else echo "<p>I am in a really bad mood<p>";
?>

Bueno, hay otros controles para usar en el backend, pero, ya sabes, después de dos ejemplos de lo
mismo, el fichero es un poco aburrido. Puedes visitar este enlace para ver qué controles están
disponibles para un presente y este enlace para algunos ejemplos más. Por lo menos tenemos lo que
necesitamos por ahora para seguir adelante. A por el acceso a bases de datos!
Acceso a la Base de Datos

Escrito por Victor 09 de febrero 2009

En este punto, te sugerimos instalar phpMyAdmin, un front-end decente para la navegación por
tablas y la realización de consultas y operaciones a la base de datos . En Debian variants, lo
siguiente funciona:

# apt-get install phpMyAdmin

Ahora para llegar a su página phpmyadmin ir a http://yourserverip/phpmyadmin/

Ok, eche un vistazo a la interfaz y compruebe sus tablas jos para hacerse una idea de lo que hay.
Nuestra primera tarea será mostrar los títulos de todos los artículos de la base de datos.

Básicamente, sacando cosas de la base de datos está a sólo tres pasos, una referencia al manejador
de base de datos, la configuración de una consulta y ejecutar la consulta contra la base de datos. No
podía ser más simple, aquí está el código:

<?php
$db =& JFactory::getDBO();
$sql = 'SELECT id,title from jos_content';
$db->setQuery($sql);
$rows = $db->loadObjectList();
?>

La primera línea invoca JFactory:: getDBO() que devuelve una referencia al objeto global de la
base de datos JDatabase y la segunda define la cadena de SQL, la tercera línea ejecuta la consulta
contra la base de datos y a continuación, los resultantes objetos se pasan a $rows. Lo que
necesitamos ahora sólo es imprimir el resultado. En general, esto es lo que podemos utilizar para
acceder a la base de datos de Joomla sin preocuparnos demasiado acerca de la mecánica interna.

Por otro lado, lo que tenemos que ver es la lista loadObjectList que la criatura devuelve. Devuelve
una matriz de filas, pero, cada fila es un objeto que tiene como miembros las propiedades de la
cabecera de la columna. Es posible que creas que esto es complejo, bueno suena complejo, la forma
mas común de representación de las tablas es con arrays de arrays, el array de objetos que tenemos
es aún más simple, su uso es muy sencillo como podrás ver en el siguiente ejemplo. Por cierto, la
fila de objetos pertenece a la stdClass que es algo en lo que creo, pero no entiendo.

<?php
$db =& JFactory::getDBO();
$sql = 'SELECT id,title from jos_content';
$db->setQuery($sql);
$rows = $db->loadObjectList();
foreach ($rows as $row)
{
echo "<p>The article id of '$row->title' is $row->id </p>\n";
}
?>
Si usted es tradicional y le gusta examinar las tablas como arrays de arrays puede utilizar la
alternativa loadAssocList. Esta devuelve un array de filas, siendo cada fila un array asociativo de
campos indexados por el encabezado de la columna. El siguiente ejemplo es similar al anterior, sólo
que la notación es diferente. Para ser honesto, yo prefiero el ejemplo anterior. Oh, Dios mío, me
estoy transformando!

<?php
$db =& JFactory::getDBO();
$sql = 'SELECT id,title from jos_content';
$db->setQuery($sql);
$rows = $db->loadAssocList();
foreach ($rows as $row)
{
echo "<p>The article id of '$row[title]' is $row[id] </p>\n";
}
?>

Hay muchos otros métodos Jdatabase con los que es posible que desee experimentar, busque en la
documentación de la API de Joomla y mire que es lo que puede obtener. Las que se presentan aquí
son los más utilizados.

Una cosa importante a destacar es que no todas las personas prefijo Joomla sus bases de datos con
jos_ por lo tanto, tenemos que usar el prefijo simbólico # __ al inicio de todos los nombres de tabla,
el código Joomla hará la sustitución por arte de magia. Por lo tanto, nuestra sentencia SQL debe ser
como esta:

$sql = 'SELECT id,title from #__content';


Exception handling

Escrito por Victor 09 de febrero 2009

Otro punto que me gustaría señalar a su atención es el manejo de excepciones. Las consultas a
nuestra base de datos serán divinas o caeran en las sombras. Si tu código no está protegido fallará
miserablemente, de lo contrario tendrá un glorioso fracaso, gran diferencia.

OK, tenemos que buscar posibles fuentes de error, por ejemplo, saber si la tabla que estás tratando
de consultar no existe o que su consulta por alguna razón, devuelve un conjunto de registros vacío.
Shirt happens, hay que ocuparse de estas cosas en nuestro código. El siguiente ejemplo testea si hay
un conjunto de registros vacío:

<?php
$db =& JFactory::getDBO();
$sql = 'SELECT id,title from #__content where id > 1000';
$db->setQuery($sql);
$rows = $db->loadObjectList();

if (empty($rows))
{
print "<p>There are no articles to display</p>";
}
else
{
print "<p>There are some stuff in here</p>";
}
?>

El siguiente imprime errores de la base de datos, utilizando métodos de la clase JDatabase.

<?php
$db =& JFactory::getDBO();
$sql = 'SELECT idtitle form #__content';
$db->setQuery($sql);
$rows = $db->loadObjectList();

print "<p>Error:".$db->getErrorNum()."-".$db->getErrorMsg()."</p>";
?>

Algunas personas usan $db->stderr(), no hay mucha diferencia realmente, posiblemente sea más
antiguo?

La combinación de lo anterior, podemos escribir lo siguiente, para que se vea mejor.

<?php
$db =& JFactory::getDBO();
$sql = 'SELECT id,title from #__content where id > 40';
$db->setQuery($sql);
$rows = $db->loadObjectList();
if ($db->getErrorNum())
{
print "<p>Database Error</p>";
print "<p>Error:".$db->getErrorNum()."-".$db->getErrorMsg()."</p>";
}
else
{
if (empty($rows))
{
print "<p>There are no articles to display</p>";
}
else
{
foreach ($rows as $row)
{
echo "<p>The article id of '$row->title' is $row->id</p>\n";
}
}
}
?>
Niveles de error

Escrito por Victor 09 de febrero 2009

Aunque la impresion de los mensajes de error sean suficiente para la depuración rápida y sucia, que
puede ser adictiva, Joomla proporciona un mecanismo para el tratamiento de los errores. La Clase
JError implementa este mecanismo y ofrece algunas opciones como tener un archivo de registro
para mantener los mensajes de error, o llamar a una rutina en caso de error de aplicación o incluso
forzar a morir (die) después de un error fatal. Todo esto puede parecer distante, sin embargo, por
ahora podemos echarle un rápido vistazo.

Si deseas hacer su solicitud a morir con un mensaje de error, aquí está en una sola línea:

JError::raiseError(500, "creeping death");

En nuestro caso, podemos poner el error:

JError:: raiseError (500, $db-> getErrorMsg ());

Joomla soporta una serie de niveles de error y un conjunto de acciones que deben seguirse en caso
de un error. Tenga en cuenta que estos errores no están relacionados con errores de MySQL, los
errores se pueden sacar en cualquier momento en los scripts, llamando a los metodos raiseError, ó
raiseWarning o raiseNotice de la clase JError. Lo interesante es que puede correlacionar los niveles
de error con acciones de manejo de errores.

Por ejemplo, puedes enviar alertas al archivo de registro de errores:

JError::setErrorHandling(E_WARNING, 'log');

Luego, en tu script puedes utilizar:

JError:: raiseWarning(500, $db->getErrorMsg());

Si los permisos de ruta del directorio /var/www/joomla/logs están bien, puedes encontrar ahi los
errores planteados. Por supuesto, puedes asignar al nivel de Warning la simple impresión de la
acción en el navegador:

JError:: setErrorHandling (E_WARNING, 'echo');

Por ahora, no voy a entrar demasiado en los niveles de error. Sólo quería estar seguro de que cuando
se encuentre con el manejo de errores en los módulos de código abierto, no se preocupe para nada.

Dicho esto, creo que hemos cubierto lo que necesitamos para empezar a escribir simples módulos.
Para ser honesto, cuando empecé a leer, codificar y escribir este tutorial, yo esperaba que el viaje
sería mucho más largo antes de que yo fuera capaz de producir algo.
Módulo especificaciones

Escrito por Victor 10 de febrero 2009

Vamos a construir un verdadero módulo! Para empezar, estoy pensando en un módulo que presente
un enlace estilizado de los últimos artículos del sitio, escogidos en forma aleatoria. La idea mística
de este módulo es la de promover el contenido existente al tiempo que le dá una constante de
frescura a nuestro sitio. Por cierto, aunque esta idea es bastante antigua, funciona bien.

Antes de entrar en el principal ejemplo, es posible que desee consolidar las cosas que has leído
hasta ahora mirando el siguiente tutorial en el Manual del desarrollador de Joomla.

Entonces, vamos a llamar al módulo ranlatest así que crea un directorio en el directorio modules de
joomla que se llame mod_ranlatest.

Hay circulando por ahi muchos módulos similares, la única diferencia con éste es que tu vas a
escribir el código del mismo. Aquí están con más detalle, las opciones de configuración y las tareas
que el módulo debería llevar a cabo.

* El administrador establecerá las secciones aceptables, a partir de las cuales será seleccionado el
artículo (separadas por comas)
* El administrador establecerá el número máximo de artículos que nuestra serie debe tener antes
de elegir al azar un artículo. Los últimos artículos serán recogidos.
* El administrador puede configurar si losartículos de la front-page deben incluirse o no.
* Sólo los artículos publicados serán seleccionados.
* De acuerdo a los ajustes, se ejecutará una consulta en la tabla jos_content y se recogerá un
conjunto de registros. (si el conjunto está vacío, no se visualizará nada)
* Un artículo al azar se escoge entre el conjunto de registros.
* Un enlace a este artículo se presenta.
* El administrador tiene la opción de completar el enlace con texto. El texto adicional se coloca
justo antes del enlace.

Vamos, deje de leer aquí, pensar en las necesidades y tratar de hacer su tarea.

El siguiente XML debería ser razonable.

La parte XML debería ser pan comido, es de esperar que lo único nuevo aquí sea el espaciador.
Ahora, si usted ha digerido el tutorial hasta el momento, es probable pensar que nuestro único
problema es la sentencia SQL. Bueno, tenemos otro problema que no ha previsto todavía.
Enlace a un artículo

Escrito por Victor 10 de febrero 2009

Como usted ha observado las URL a los distintos artículos de su sitio son producidos por Joomla
dinámicamente. No hay una manera simple de determinar la URL de un artículo por el título del
artículo o de identificación y al final del día, esto es lo que estamos buscando. Encima, con los
conceptos SEO y los add-ons de aplicación, no todas las instalaciones Joomla realizan la
construccion URL bajo el mismo principio. Pero, por supuesto, no somos los primeros con este tipo
de problema. Joomla tiene una función de ayuda (helper) para esto que este se encuentra en:

/var/www/joomla/components/com_content/helpers/route.php

para usarla, al comienzo de nuestro código pondremos el siguiente texto:

require_once(JPATH_SITE.DS.'components'.DS.'com_content'.DS.
'helpers'.DS.'route.php');

Esto no es un rompecabezas, el DS, es el separador de directorio que depende del sistema operativo
que se esté ejecutando, esta barra o la otra barra?

Echa un vistazo a la clase ContentHelperRoute y mira el método getArticleRoute, hace lo que


necesitamos. Prueba antes de usarlo. Para un determinado artículo en tu sitio obten el ID de artículo,
la identificación de categoría y la id de la seccion. Para obtener estos tienes que acceder a los
administradores de artículocategoría y sección desde el backend ó hacer una consulta con
phpMyAdmin a la tabla jos_content. Lo siguiente debería funcionar:

<?php
require_once(JPATH_SITE.DS.'components'.DS.'com_content'.DS.
'helpers'.DS.'route.php');
$route = new ContentHelperRoute();
$link = $route->getArticleRoute(14,8,3);

echo "<p><a href=\"" . $link . "\">A Great Article</a></p>";


?>

Buen trabajo, ahora podemos crear vínculos felizmente. Sólo para mencionar aquí que los ejemplos
que he visto hasta ahora, pasan el link del método JRoute::_méthod que traduce la URL interior de
Joomla a una URL personalizada. No creo que lo necesitemos aquí, esto está relacionado con SEF.
También puede visitar este enlace para leer más sobre enrutamiento.
SQL declaraciones

Escrito por Victor 10 de febrero 2009

Así, que la totalidad del proyecto se reduce a la lectura de las opciones de los parámetros, la
construcción de la consulta SQL, la elección de un artículo al azar entre el conjunto de registros
devueltos e imprimir el vínculo. Eso es todo.

En la sentencia SQL, queremos seleccionar el id, la catid, el sectionid y el título de la tabla


jos_content donde la sección de identificación corresponda a la selección, con excepción de
(probablemente) los elementos que están en la front-page mientras se limita las filas resultantes y se
ordenan por la fecha, a partir de la última. OK, debería de tener un aspecto similar a la siguiente
consulta.

SELECT id, catid, sectionid, title


FROM jos_content
WHERE state=1
AND (sectionid = 1 OR sectionid = 4)
AND id NOT IN (SELECT content_id FROM jos_content_frontpage)
ORDER BY created ASC
LIMIT 0, 5

Después de comprender cómo debería verse la sentencia SQL apuesto a que puedes comenzar a
escribir código. No tiene que ser muy elegante, sin embargo, es necesario pensar en algo para
obtener la sentencia SQL para todos los casos posibles. Solo intentalo primero y mira a ver si
puedes hacerlo.

Siéntase libre de echar un vistazo a mi sugerencia.

Me tomó un tiempo para comprender y explotar las funciones explode e implode, te sugiero que
busques en el manual de PHP.

Ahora, la verdad es que esta es una consulta bastante simple que estamos construyendo aquí y
podemos sacarla sin demasiada lucha. Imagínese que la tarea fuera más complicada o leer el código
de uno de los módulos estándar, como el mod_latestnews por ejemplo, parece un poco aterrador,
¿no?. La cosa es, que el estilo del código o la inteligencia de la sentencia SQL puede mejorar
mucho la legibilidad (o simplemente te hace sentir más inteligente).

A continuación una versión mejor vale la pena leer.

Para el "qué diablos son esos signos de interrogacion" que usa la gente por ahí: se trata de "if" en un
glorioso sino más bien críptico C-como el formato. La sintaxis es:

<condition> ? <expr si cond es true> : <expr si cond es false>;


Pensando Dando Estilo

Escrito por Victor 11 de febrero 2009

OK, estamos cerca del final, espero que hayas disfrutado tanto como yo. Incluso si no sigues
leyendo, ya tienes lo que necesitas para comenzar tu búsqueda para construir módulos fantásticos.

Por cierto, puedes conseguir el archivo mod_ranlatest-lite.zip de la sección de downloads, que


contiene el código de ejemplo hasta la fecha.

Última cosa que podemos discutir es el estilo con un poco más de detalle. Uno de los parámetros
típicos que acompaña a muchos módulos es la opcion "Module Class Sufix". Usted probablemente
ha usado esta opción, mientras luchaba con CSS y plantillas por lo que es una buena práctica
añadirla aquí. Este es un parámetro estándar de Joomla, lo que significa que basta con añadir la
siguiente etiqueta a tu archivo XML y Joomla se encargará de lo demás.

<param name="moduleclass_sfx" type="text" default=""


label="Module Class Suffix"
description="PARAMMODULECLASSSUFFIX" />

Aunque, no hay necesidad de manipular el código dentro de este parámetro, es posible que tenga
que añadirlo a los nombres de class/id. Aquí está cómo hacerlo.

$mcsuffix = trim($params->get("moduleclass_sfx"));

Y ahora, vamos a por el vínculo que podrías utilizar:

# Print link and pretext


print "\n<p class=\"ranlatest".$mcsuffix."\">".$pptext."</p>";
print "\n<p class=\"ranlatest".$mcsuffix."\">".
"<a class=\"ranlatest".$mcsuffix."\""."href=\"".$link."\">".
$rows[$ranitem]->title."</a></p>";

Es bastante confuso, ¿no? Deseas dar salida a un simple enlace y el código resultante se vuelve tan
ilegible. Imagina que tienes que dar salida a más cosas, el espagueti nunca terminaría. Esta es la
razón por la que seguimos intentando separar el código del diseño. Por cierto, si usted ha estado
mirando otros módulos, ya habrá observado que Joomla soporta plantillas.

OK, vamos a reorganizar nuestro código para que sea más bonito y que sea capaz de soportar
plantillas. Primero, vamos a crear un archivo standard helper.php y poner el código principal en el.
Habrá una sóla función que devolverá un array con los distintos bits a imprimir. Una vez más, la
razón de este acuerdo es separar la funcionalidad del diseño.

Debería tener este aspecto.


Ves, no se imprime nada, simplemente se devuelve un array. Ahora, el punto de entrada de nuestro
módulo es el mod_ranlatest.php archivo que deberia tener la siguiente apariencia:

<?php
# Restrict access
defined('_JEXEC') or die('Restricted access');

# Just print out any errors for now


JError::setErrorHandling(E_WARNING, 'echo');

# Include the local helper function only once


require_once(dirname(__FILE__).DS.'helper.php');

# Call main code that resides in helper.php


$link = modRandomLatestHelper::getList($params);

# Get the path to the layout for the module


require(JModuleHelper::getLayoutPath('mod_ranlatest'));
?>

Sólo incluye el archivo helper.php y ejecuta nuestro método ahí, se pasa el array de parámetros y se
devuelve el array link. A continuación, es invocado el método getLayoutPath de la clase
JModuleHelper que contiene la ruta al archivo de plantilla. Bueno, todavia no lo hemos
especificado, no obstante, uno por defecto es /tmpl/default.php.
Archivos de plantilla

Escrito por Victor 11 de febrero 2009

Por lo tanto, tenemos que crear algunos archivos de plantilla en /tmpl, vamos a empezar con
default.php:

<p>
<?php print $link[0] ?>
</p>
<a href="<?php print $link[2] ?>"><?php print $link[1] ?></a>

Mucho mejor. Ooops, no es seguro que vaya a haber un pretexto, no hay que dejar nifty etiquetas
colgantes vacías alrededor. O sea que: si hay un pretexto ...

<?php if ($link[0]) : ?>


<p>
<?php print $link[0] ?>
</p>
<?php endif; ?>
<a href="<?php print $link[2] ?>"><?php print $link[1] ?></a>

Usted se acostumbrará a esta sintaxis, lo admito, es extraño y adictivo. Nos hemos olvidado de la
clase sufijo, no?

<?php if ($link[0]) : ?>


<p class="ranlatest<?php echo $params->get('stylesfx'); ?>">
<?php print $link[0] ?>
</p>
<?php endif; ?>
<a class="ranlatest<?php echo $params->get('stylesfx'); ?>"
href="<?php print $link[2] ?>"><?php print $link[1] ?></a>

¿No es esta mejor que la otra? Hmm, guapo, por eso me gustan las etiquetas div. En cualquier caso,
sólo para mencionar aqui que también se puede usar $params->get('pretext') en lugar de pasarlo a
través del array del link. Teniendo la plantilla default.php ya esta bien, sin embargo, llevemoslo
hasta el final.
Archivos de plantilla II

Escrito por Victor 11 de febrero 2009

Por lo tanto, vamos a ver cómo puede tener el administrador de elegir entre diversas plantillas.
Comience por añadir de la lista siguiente para el archivo XML.

<param name="layout" type="list" default="random"


label="Layout"
description="The layout to display the link" >
<option value="default">Default</option>
<option value="divmania">Div-mania</option>
<option value="olddog">Old-dog</option>
</param>

Entonces usted necesita para modificar mod_ranlatest.php. Acabamos de obtener el parámetro de


diseño y lo pasamos a la getLayoutPath método.

# Get the path to the layout for the module


$layout = $params->get('layout', 'default');
require(JModuleHelper::getLayoutPath('mod_ranlatest', $layout));

Tarea final, tenemos que escribir el resto diseños. Aquí viene lo mejor, divmania.php.

<div class="ranlatest<?php echo $params->get('stylesfx'); ?>">


<?php if ($link[0]) : ?>
<p><?php print $link[0] ?></p>
<?php endif; ?>
<a href="<?php print $link[2] ?>"><?php print $link[1] ?></a>
</div>

Y por razones históricas el olddog.php.

<table class="ranlatest<?php echo $params->get('stylesfx'); ?>">


<?php if ($link[0]) : ?>
<tr><td>
<?php print $link[0] ?>
</td></tr>
<?php endif; ?>
<tr><td>
<a href="<?php print $link[2] ?>"><?php print $link[1] ?></a>
</td></tr>
</table>

Lo sé, las etiquetas td deberia haber y estilo, no podía ser molestado.

Eso es todo amigos. Será para mí un placer escuchar acerca de vuestros esfuerzos y tener alguna
información sobre como mejorar esto.
Por último, quisiera señalar a la el sitio de JLLeBlanc que ha dado buenas cosas para los recién
llegados Joomla. Además, para encontrar libros relacionados con Joomla puede visitar Packt
Publishing.

¡Salud!!

Vous aimerez peut-être aussi