Índice de la serie: desarrollo de extensiones con Joomla

  1. Hacer componentes en Joomla!
    1. Patrón MVC
    2. Concepto de Front-End y Back-End
    3. Primer componente MVC simple con Joomla!
    4. Segundo componente, Back-End y acceso a datos.
    5. Crear el xml del componente de joomla y generar instalable.
  2. Hacer Módulos para Joomla!
  3. Hacer Plugins para Joomla!

Ya hemos visto como hacer componentes y como hacer módulos en Joomla! 1.5 y hemos visto que no es nada complicado, y simplemente hay que entender la mecánica de trabajo .

Lo ultimo que nos queda son los plugins, con ellos podremos modificar el comportamiento estándar de Joomla!, pudiendo interceptar ciertos eventos prefijados para ejecutar nuestro código antes o después del evento.

Los plugins pueden llegar a ser muy utiles y potentes.

Por ejemplo, se puede interceptar el evento de publicar un articulo y hacer que joomla imprima un mensaje personalizado antes de cada articulo, o lo que a ti se te ocurra, simplemente tienes que tener a mano la lista de eventos (hooks) definidos y tu imaginación para hacer con joomla! lo que quieras.

Existen varios tipos de plugins, por cada tipo de plugin existe un directorio dentro del directorio plugins, por lo tanto tenemos el directorio plugins/content para los plugins de tipo content y así con todos los tipos.Existen varios tipos, mira en tu carpeta plugins y comprueba los tipos.

Un plugin es un objeto que deriva de la clase JPlugin. Esta clase tiene unos métodos definidos que son ganchos (hooks) , también se les podría llamar listeners , y que se ejecutaran cuando el evento asociado a cada clase se dispare, por lo tanto tendremos que sobrescribir las funciones gancho que necesitemos y escribir nuestro código allí.

Por ejemplo, si sobrescribimos el método onLoginUser y escribimos una sencilla rutina que envié un email a nuestra cuenta de correo, estaremos modificando el sistema para que cada vez que un usuario haga login, envié un email a nuestra cuenta indicando quien se ha logueado y a que hora.

Esto es simplemente un ejemplo, ya que , lógicamente , seria inútil hacer una cosa así, además de llenar de correo inservible nuestra bandeja de entrada.

Vamos a crear un plugin sencillo que se va a llamar HolaMundo y que va a imprimir por pantalla, antes de que se visualice el contenido un mensaje, que previamente va a ser fijado en los parámetros del plugin.

Los parámetros del plugin se fijan como siempre en Joomla!, mediante el fichero xml de configuración.

Esta es la estrctura de nuestro plugin :

Primero vamos a ver el fichero xml de configuración, en el que definiremos nuestro parámetro.

<?xml version=”1.0″ encoding=”utf-8″ ?>

<install version=”1.5″ type=”plugin” group=”content”>

<name>Content – Hola Mundo</name>

<author>David Noguera</author>

<creationDate>15-02-2008</creationDate>

<authorEmail>david@nosolocodigo.com</authorEmail>

<authorUrl>www.nosolocodigo.com</authorUrl>

<version>1.0</version>

<description>Muestra un mensaje antes de mostrar el contenido

</description>

<files>

<filename plugin=”HolaMundo”>HolaMundo.php</filename>

<filename>HolaMundo.xml</filename>

</files>

<params>

<param name=”mensaje” type=”text” size=”50″ default=”Hola, me llamo David”

label=”Introduce el mensaje a ser mostrado aquí :” description=”Mensaje que se mostrará antes del contenido”/>

</params>

</install>

Como puedes observar, le estamos diciendo a Joomla que muestre en la seccion de parámetros del plugin , una caja de texto de 50 de ancho, donde podremos especificar el mensaje que queremos que se muestre. Y le hemos dicho que el fichero donde se encuentra el plugin es HolaMundo.php .

Vamos a crear nuestro plugin :

defined( '_JEXEC' ) or die( 'Acceso Restringido' );
jimport( 'joomla.plugin.plugin' );
 
class plgContentHolaMundo extends JPlugin {
 
function plgContentHolaMundo( &$subject ) {
	parent::__construct( $subject );
}
 
function onBeforeDisplayContent(&$article, &$params, $limitstart=0) {
 
	$plugin =& JPluginHelper::getPlugin('content', 'HolaMundo');
	$pluginParams = new JParameter( $plugin->params );
	$mensaje = "";
 
	$mensaje = $pluginParams->get('mensaje', 'Hola Mundo');
 
	$salidaPantalla = '
<h2>' . $mensaje . '</h2>
 
';
 
	return $salidaPantalla;
	}
 
}
?>

En Joomla 1.5 se ha introducido una nueva forma de hacer los plugins, más orientada a objetos.

Para que nuestro plgin funcione, en el fichero HolaMundo.php tendremos que crear la clase plgContentHolaMundo y decirle que derive de JPlugin.

El nombre de la clase es muy importante, si no se pone bien no funcionará.

Después crearemos el constructor de la clase, el cual invoca el constructor de la clase padre.

El constructor ha de crearse con una función de igual nombre que la clase, ya que si lo hacemos con el método __construct de php5 no será compatible con php4.

Esto se hace siempre igual en todos los plugins.

Después crearemos el metodo onBeforeDisplayContent , donde introduciremos el código que queremos que se ejecute antes de mostrar el titulo.

Si te has fijado, el método admite como parámetro las variables $article, $params y $limitstart. Esta definición de parámetros la tendremos que hacer siempre.

El contenido del articulo se almacena en $article->text, es decir, que si queremos modificar algo en el contenido del articulo, deberemos modificar $article->text.

Vamos a ver el cuerpo de la función :

Con el metodo getPlugin de JPluginHelper, obtenemos el plugin pasandole como parámetro el tipo y el nombre, por este orden.

Después en la variable $pluginParams almacenamos una instancia del objeto JParameter al que le tenemos que pasar como parámetro la propiedad params del objeto plugin que previamente hemos obtenido.

Acto seguido almacenamos en la variable $mensaje el parámetro ‘mensaje’ que hemos definido en el fichero xml y que podremos cambiar en la parte de Back-End de Joomla!.

Por último almacenamos en la variable $salidaPantalla lo que queremos que se muestre antes de mostrar el contenido , y la devolvemos como valor de retorno.

Crea un zip con los dos ficheros, e instálalo con el instalador de extensiones de Joomla!, después ves al Plugin Manager y actívalo, allí también podrás cambiar el mensaje que se imprime por pantalla.

Este es el resultado:

Puedes consultar los eventos disponibles en la documentación oficial de Joomla, que aunque sea oficial, es escasa, y también puedes ver los eventos en los ficheros example.php que existen dentro de cada directorio de tipo de plugin, es decir, en plugins/content , plugins/user … Este fichero te puede servir como plantilla a la hora de crear plugins.

Saludos.

Compartir:
  • del.icio.us
  • BarraPunto
  • Bitacoras.com
  • Facebook
  • Google Bookmarks
  • Meneame
  • Netvibes
  • Technorati
  • FriendFeed
  • Twitter
  • HelloTxt


Comentarios

  1. 1
    Enrique
    16 de febrero del 2008 a las 5:41 am

    Gracias David !
    Estan muy buenos tus tutoriales !!

  2. 2
    David
    16 de febrero del 2008 a las 7:57 am

    Muchas gracias Enrique.
    Un Saludo.

  3. 3
    Frank
    21 de febrero del 2008 a las 5:42 am

    Muy bueno el tutorial, gracias por compartir tus conocimientos.

  4. 6
    Pedro
    22 de abril del 2008 a las 6:17 am

    Como puedo ver los plugins que tengo instalados, si tengo Joomla 1.0.15?
    Gracias de antemano

  5. 7
    Juanux
    2 de junio del 2008 a las 7:40 am

    Gracias hombre
    es de gran ayuda este pequeño tutorial
    ya que no es fácil encontrar documentación al respecto
    y la poca que hay no es muy buena

  6. 8
    Rufles
    26 de agosto del 2008 a las 2:44 pm

    Excelente men ahora mismo empezare ha elaborar uno espero poder hacerlo y si no puedo espero me eches la mano

  7. 9
    Rafa
    30 de septiembre del 2008 a las 1:39 am

    Hola David, perdona por mi pregunta pero soy nuevo en esto y mi proyecyo final de carrera es algo relacionado con un plugin para joomla.

    ¿donde está la lista de eventos? e buscado en internet y no la encuentro.
    muchas gracias.

  8. 10
    lolo
    11 de diciembre del 2008 a las 4:08 pm

    que tal, mi pregunta no es nada relacionada con esto de los plugins, pero igual alguien me pude oritentar o hechar la mano, quisiera saber si existe alguna forma de crear mi propio archivo js o css, meterlo en los directorios de mi template, posteriormente importarlo en alguno de mis articulos y usarlo, es posible esto con joomla

  9. 11
    Rino
    13 de enero del 2009 a las 1:19 am

    Graciñas

  10. 12
    Chapeti
    19 de marzo del 2009 a las 7:58 am

    Gracias man! buen tutorial!

  11. 13
    Ojmo
    1 de abril del 2009 a las 3:09 pm

    Interesante y estoy experimentando …

    Una pregunta, quiero desarrollar un plugin que altere en contenido de una nota solo en el frontpage, pero no en las otras páginas del sitio, es decir, en el blog de categorías o presentación del artículo no haga la modificación.

    ¿Es posible?

    ¿Como le digo al plugin que el el contenido se está desplegando en el frontpage, en el blog de categorías o secciones o es presentación del artículo solo?

    Gracias de antemano …

    Saludos,

    Ojmo.

  12. 14
    Norge Matos
    8 de abril del 2009 a las 8:30 am

    Muy bien presentado, ahora a trabajar. Hacen falta más como tú en este empeño.

    Ahora pretendo hacer mi propio plugin para autenticar con
    Active Directory,
    porque nada de lo que viene de fábrica me funciona, sin embargo
    cuando se roba el evento onAuthenticate
    la página que devuelve se queda en blanco.

  13. 15
    Carlos Custodio
    17 de abril del 2009 a las 2:18 pm

    Hola Enrique.

    Muchas Gracias por el tutorial está muy bien explicado y bastante conciso pero tengo algunas preguntas con respecto al nombre de la funcion onBeforeDisplayContent y sus paramteros. Dime, ¿existen algunas reglas para construir el nombre de esa función?, ¿Como joomla hace posible que esa función se ejecute antes de mostrar un contenido? y finalmente podrias por favor indicarme donde se definen los eventos en joomla?.

    Gracias por tu tiempo.

    Saludos desde Lima

    Carlos

  14. 17
    Norge Matos
    5 de mayo del 2009 a las 11:23 am

    Hola otra vez.
    Rehice el plugin de Active Directory a nuestra medida pero ahora quiero filtrar los enlaces que se muestran y el contenido de acuerdo a los grupos a los que pertenezca en el Active Directory…
    Necesito saber dónde encontrar un listado de los eventos de joomla que puedo manejar con los plugin, o un listado con todos los eventos.

    Sigo diciendo que muy bueno tu blog.
    Saludos
    Norge

  15. 18
    David
    5 de mayo del 2009 a las 3:07 pm

    Hola Norge, aquí tienes una lista de eventos:

    http://docs.joomla.org/Tutorial:Plugins

    Espero que te sirva, por cierto, muy interesante el plugin de autenticación con Active Directory.. podrías pasarme el código para echarle un vistazo???

    Gracias de todas formas.

    Saludos!!!

  16. 19
    Norge Matos
    6 de mayo del 2009 a las 12:07 pm

    Hola otra vez.
    Genial lo de los plugins, pero parece que no me va a servir… o sea, me va a servir para impedir que se muestre el contenido sin permiso de acceso, pero no podré impedir que en los menúes aparezcan los enlaces a los que no debería haber acceso.
    Yo había hecho mi propio CMS y estoy tratando de migrar a Joomla. Creo que debería modificar el módulo menú para que chequee los permisos, porque el número de enlaces de mi empresa es demasiado grande y haría disfuncional la página.
    Escríbeme a mi email para responderte con el plugin de AD que modifiqué.

    David, realmente me ha ayudado mucho tu blog.

    Saludos
    Norge

  17. 23
    Marlon Valle
    24 de junio del 2009 a las 2:10 pm

    Oye Te FelicitO amigO! Ayudas mucho!
    Graciass x todo!

  18. 24
    David
    24 de junio del 2009 a las 8:38 pm

    Gracias!!! Me alegra mucho ver que le sirve a la gente lo que pongo aquí…

  19. 26
    yendris
    28 de julio del 2009 a las 9:10 am

    Hola amigo muy interesante tus explicaciones..me gustaría saber si has trabajado el tema de los SIG (Sistemas de Información Geogr´ficas) en Joomla ..si lo has hecho me gustaría que me explicaras como hacerlo..gracias

  20. 28
    AO
    13 de agosto del 2009 a las 3:07 am

    Hola,

    Felicidades por este tutorial que me ha ayudado para empezar !

    Ahora estoy intentando adaptarlo y la verdad me está dando problemas. (algunos que he podido resolver ;)

    Asi que quiero compartir lo que he encontrado y luego viene una duda y espero que alguien pueda ayudarme.

    —–
    A veces aparece un error con la función bind() en el modelo, cuando se intenta introducir algo en la base de datos. Eso es porque por alguna razón que desconozco, joomla no encuentra el archivo con la clase de la tabla. A veces va, a veces no…raro. (y eso que los nombres están bien puestos) Para solucionarlo, se debe poner el path de las tablas en el punto de entrada. Eso se hace añadiendo la siguiente línea:

    JTable::addIncludePath(JPATH_COMPONENT.DS.’tables’);

    (considerando que la carpeta es ‘tables’).

    Para el tutorial original no he necesitado ponerlo, pero con una pequeña modificación ya si tuve que ponerlo…raro. A ver si alguien sabe.

    —–

    Ahora mi pregunta: para mi adaptación de este componente, quiero insertar datos en una tabla que tiene dos columnas: fecha y mensaje. (he reemplazado el id por la fecha que es la nueva clave primaria)
    La fecha es de tipo DATE en mysql.

    El problema: no inserta !!

    (y lo peor es que joomla me da el mensaje “mensaje introducido”).

    Así que no entiendo, si es que Joomla no puede tragar una clave primaria que no sea otra cosa que el típico entero id? Para mi aplicación no necesito id ya que solo habrá una entrada por día, el campo fecha sirve de clave primaria.

    Espero que alguien pueda ayudarme. (podré pasar el código si hace falta)

  21. 29
    AO
    13 de agosto del 2009 a las 3:10 am

    Perdon me he equivocado de articulo, el mensaje anterior iba para el componente Back-end.

  22. 30
    arrayman
    19 de agosto del 2009 a las 5:24 am

    Hola david, estoy intentando buscar documentación sobre como implementar un servicio web en joomla. de lo poco que he podido averiguar es que la aproximacion de joomla es con un plugin. podrias proporcionarme documentación al respecto (la idea es implementar el servicio no consumirlo) gracias.

  23. 32
    Luis Hernandez
    30 de octubre del 2009 a las 5:53 pm

    Excelente lo que estaba buscando para empezar a crear plugins para Joomla

Trackbacks

  1. Tutorial: Módulos para Joomla! 1.5 | nosoloCodigo
  2. Crear el XML del componente de Joomla y generar instalable | nosoloCodigo
  3. Tutorial: Componente para Joomla 1.5 III | nosoloCodigo
  4. Tutorial: Componente para Joomla 1.5 IV | nosoloCodigo
  5. JcustomGenerator, plugin para cambiar el meta-tag generator en Joomla | nosoloCodigo
  6. Tutorial: Cómo crear un componente para Joomla! 1.5 II | nosoloCodigo
  7. ¿ Qué es Joomla ? | Nosolocodigo | Desarrollo web con Joomla, Wordpress y demás herramientas de software libre
  8. ¿Como instalo extensión Joomla que no esté en zip? « en vida y tecnología …misterioaqo…
  9. » Comparando lo incomparable: Joomla vs Wordpress round 2